golang reflect demo讲解

2024-05-27 21:48
文章标签 讲解 golang demo reflect

本文主要是介绍golang reflect demo讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Demo

这里引用了第三方包

go get github.com/influxdata/toml
go install github.com/influxdata/toml

就可以直接使用第三方代码了,可以修改,也可以打断点。

package mainimport ("fmt""reflect""github.com/influxdata/toml"
)type testInterface interface {
}type testStruT struct {TestFieldA stringTestFieldB string `testFieldB:"b"`TestFieldC string `testFieldC:"ccc"`
}func testProcStruct(v interface{}) {fmt.Printf("1 v =                       %v\n", v)rv := reflect.ValueOf(v)fmt.Printf("2 rv = reflect.ValueOf(v) = %v\n", rv)fmt.Printf("3 rv.Kind() =               %v\n", rv.Kind())elem := rv.Elem()fmt.Printf("4 elem = rv.Elem() =        %v\n", elem)fmt.Printf("5 elem.Kind() =             %v\n", elem.Kind())/*判断改结构体是否有名为TestFieldA、TESTFIELDA的字段,若找不到found为false.在FindField会将传入的字符串格式化判断(可以看源码)*/fv, fieldName, found := toml.FindField(elem, "testFieldA")fmt.Printf("6 fv = %v, fieldName = %v, found = %v\n", fv, fieldName, found)
}func testPorcMap(v interface{}) {fmt.Printf("7 v =                       %v\n", v)rv := reflect.ValueOf(v)fmt.Printf("8 rv = reflect.ValueOf(v) = %v\n", rv)fmt.Printf("9 rv.Kind() =               %v\n", rv.Kind())//elem := rv.Elem()   若Kind是Map,这里会PanicrvType := rv.Type()fmt.Printf("10 rvType =                 %v\n", rvType)fmt.Printf("11 rvType.Elem() =          %v\n", rvType.Elem())mv := reflect.New(rvType.Elem())fmt.Printf("12 mv =                     %v\n", mv)elem := mv.Elem()fmt.Printf("13 elem =                   %v\n", elem)fmt.Printf("14 elem.Type() =            %v\n", elem.Type())fmt.Printf("15 elem.Kind() =            %v\n", elem.Kind())fmt.Printf("16 v =                      %v\n", v)rv.SetMapIndex(reflect.ValueOf("testKey2"), elem) //  修改键值fmt.Printf("17 v =                      %v\n", v)
}func main() {//  匿名函数creator := func() testInterface {return &testStruT{TestFieldA: "testValue1",}}testInter := creator()testProcStruct(testInter)testStruct2 := testStruT{TestFieldC: "testValue2",}testStruct3 := testStruT{TestFieldB: "testValue3",}testMap := map[string]testStruT{}testMap["testKey2"] = testStruct2testMap["testKey3"] = testStruct3testPorcMap(testMap)
}
运行结果
[Running] go run "c:\Code\Go\src\study\main.go"
1 v =                       &{testValue1  }
2 rv = reflect.ValueOf(v) = &{testValue1  }
3 rv.Kind() =               ptr
4 elem = rv.Elem() =        {testValue1  }
5 elem.Kind() =             struct
6 fv = testValue1, fieldName = TestFieldA, found = true
7 v =                       map[testKey2:{  testValue2} testKey3:{ testValue3 }]
8 rv = reflect.ValueOf(v) = map[testKey2:{  testValue2} testKey3:{ testValue3 }]
9 rv.Kind() =               map
10 rvType =                 map[string]main.testStruT
11 rvType.Elem() =          main.testStruT
12 mv =                     &{  }
13 elem =                   {  }
14 elem.Type() =            main.testStruT
14 v =                      map[testKey2:{  testValue2} testKey3:{ testValue3 }]
15 v =                      map[testKey2:{  } testKey3:{ testValue3 }][Done] exited with code=0 in 3.769 seconds

这篇关于golang reflect demo讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1008683

相关文章

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Golang进程权限调度包runtime

关于 runtime 包几个方法: Gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当前线程未来会继续执行GOMAXPROCS:设置最大的可同时使用的 CPU 核数Goexit:退出当前 goroutine(但是defer语句会照常执行)NumGoroutine:返回正在执行和排队的任务总数GOOS:目标操作系统NumCPU:返回当前系统的 CPU 核数量 p