本文主要是介绍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讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!