其他分享
首页 > 其他分享> > golang reflect demo讲解

golang reflect demo讲解

作者:互联网

Demo

这里引用了第三方包

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

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

package main

import (
	"fmt"
	"reflect"

	"github.com/influxdata/toml"
)

type testInterface interface {
}

type testStruT struct {
	TestFieldA string
	TestFieldB 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,这里会Panic

	rvType := 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"] = testStruct2
	testMap["testKey3"] = testStruct3
	testPorcMap(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

标签:reflect,rv,Kind,demo,fmt,elem,golang,Printf
来源: https://blog.csdn.net/u011018840/article/details/115550870