反射:可以在运行时动态获取变量的相关信息
import (“reflect”)
a. reflect.TypeOf,获取变量的类型,返回reflect.Type类型
b. reflect.ValueOf,获取变量的值,返回reflect.Value类型
c. reflect.Value.Kind,获取变量的类别,返回一个常量
d. reflect.Value.Interface(),转换成interface{}类型
var x float64 = 3.4 fmt.Println("type:",reflect.TypeOf(x)) v := reflect.ValueOf(x) fmt.Println("value:",v) fmt.Println("type:",v.Type()) fmt.Println("kind:",v.Kind()) fmt.Println("value:",v.float()) fmt.Println(v.Interface()) fmt.Printf("value is %5.2e\n",v.Interface()) y := v.Interface().(float64) fmt.Println(y)
输出如下:
type: float64value: 3.4type: float64kind: float64value: 3.43.4value is 3.40e+003.4反射获取结构体
package mainimport ( "fmt" "reflect")type Student struct { name string Age int score float32}func test(b interface{}) { t := reflect.TypeOf(b) fmt.Println(t) v := reflect.ValueOf(b) fmt.Println(v) k := v.Kind() fmt.Println(k) iv := v.Interface() fmt.Println(iv) stu,ok := iv.(Student) if ok { fmt.Printf("%v %T\n",stu,stu) }}func main() { var a Student = Student{ name: "stu01",Age: 18,score: 92,} test(a)}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.gomain.Student{stu01 18 92}struct{stu01 18 92}{stu01 18 92} main.StudentPS E:\golang\go_pro\src\safly>Elem反射 *** 作基本类型
用来获取指针指向的变量,相当于:
var a *int;
func main() { var b int = 1 b = 200 testInt(&b) fmt.Println(b)}//fv.Elem()用来获取指针指向的变量func testInt(b interface{}) { val := reflect.ValueOf(b) val.Elem().SetInt(100) c := val.Elem().Int() fmt.Printf("get value interface{} %d\n",c) fmt.Printf("string val:%d\n",val.Elem().Int())}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.goget value interface{} 100string val:100100PS E:\golang\go_pro\src\safly>反射调用结构体方法
package mainimport ( "fmt" "reflect")type Student struct { name string Age int score float32}func (s Student) Print(){ fmt.Println(s)}func (s Student) Set(name string,age int,score float32){ s.Age = age s.name = name s.score = score}func TestStruct(a interface{}) { val := reflect.ValueOf(a) kd := val.Kind() fmt.Println(val,kd) if kd != reflect.Struct { fmt.Println("expect struct") return } //获取字段数量 fIElds:= val.NumFIEld() fmt.Printf("struct has %d fIEld\n",fIElds) //获取字段的类型 for i:=0;i<fIElds;i++{ fmt.Printf("%d %v\n",i,val.FIEld(i).Kind()) } //获取方法数量 methods:=val.NumMethod() fmt.Printf("struct has %d methods\n",methods) //反射调用的Print方法 var params []reflect.Value val.Method(0).Call(params)}func main() { var a Student = Student{ name: "stu01",score: 92.8,} TestStruct(a) // fmt.Println(a)}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go{stu01 18 92.8} structstruct has 3 fIEld0 string1 int2 float32struct has 2 methods{stu01 18 92.8}PS E:\golang\go_pro\src\safly>Elem反射 *** 作结构体
package mainimport ( "fmt" "reflect")type Student struct { name string Age int score float32}func (s Student) Print(){ fmt.Println(s)}func (s Student) Set(name string,age int,score float32){ s.Age = age s.name = name s.score = score}func TestStruct(a interface{}) { val := reflect.ValueOf(a) kd := val.Kind() fmt.Println(val,kd) if kd!= reflect.Ptr && val.Elem().Kind() == reflect.Struct { fmt.Println("expect struct") return } //获取字段数量 fIElds:= val.Elem().NumFIEld() fmt.Printf("struct has %d fIEld\n",fIElds) //获取字段的类型 for i:=0;i<fIElds;i++{ fmt.Printf("%d %v\n",val.Elem().FIEld(i).Kind()) } //获取方法数量 methods:=val.NumMethod() fmt.Printf("struct has %d methods\n",methods) //反射调用的Print方法 var params []reflect.Value val.Elem().Method(0).Call(params)}func main() { var a Student = Student{ name: "stu01",Age: 18,score: 92.8,} TestStruct(&a) // fmt.Println(a)}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go&{stu01 18 92.8} ptrstruct has 3 fIEld0 string1 int2 float32struct has 2 methods{stu01 18 92.8}PS E:\golang\go_pro\src\safly>Elem反射获取tag
package mainimport ( "fmt" "reflect")type Student struct { name string `Json:"stu_name"` Age int score float32}func (s Student) Print(){ fmt.Println(s)}func (s Student) Set(name string,score float32){ s.Age = age s.name = name s.score = score}func TestStruct(a interface{}) { typ := reflect.TypeOf(a) tag := typ.Elem().FIEld(0).Tag.Get("Json") fmt.Printf("Tag:%s\n",tag)}func main() { var a Student = Student{ name: "stu01",} TestStruct(&a)}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.goTag:stu_namePS E:\golang\go_pro\src\safly>练习例子
package mainimport ( "fmt" "reflect")type T struct { A int B string}func main() { t := T{23,"skIDoo"} s := reflect.ValueOf(&t).Elem() typeOfT := s.Type() for i := 0; i < s.NumFIEld(); i++ { f := s.FIEld(i) fmt.Printf("%d: %s %s = %v\n",typeOfT.FIEld(i).name,f.Type(),f.Interface()) } s.FIEld(0).SetInt(77) s.FIEld(1).SetString("Sunset Strip") fmt.Println("t is Now",t)}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go0: A int = 231: B string = skIDoot is Now {77 Sunset Strip}PS E:\golang\go_pro\src\safly>总结
以上是内存溢出为你收集整理的golang基础-反射获取(基础数据、结构体)、 *** 作(基本类型、结构体、指针)、反射获取Tag全部内容,希望文章能够帮你解决golang基础-反射获取(基础数据、结构体)、 *** 作(基本类型、结构体、指针)、反射获取Tag所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)