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

相关文章

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Golang中map缩容的实现

《Golang中map缩容的实现》本文主要介绍了Go语言中map的扩缩容机制,包括grow和hashGrow方法的处理,具有一定的参考价值,感兴趣的可以了解一下... 目录基本分析带来的隐患为什么不支持缩容基本分析在 Go 底层源码 src/runtime/map.go 中,扩缩容的处理方法是 grow

golang获取prometheus数据(prometheus/client_golang包)

《golang获取prometheus数据(prometheus/client_golang包)》本文主要介绍了使用Go语言的prometheus/client_golang包来获取Prometheu... 目录1. 创建链接1.1 语法1.2 完整示例2. 简单查询2.1 语法2.2 完整示例3. 范围值