golang基础-反射获取(基础数据、结构体)、 *** 作(基本类型、结构体、指针)、反射获取Tag

golang基础-反射获取(基础数据、结构体)、 *** 作(基本类型、结构体、指针)、反射获取Tag,第1张

概述反射获取基本类型 反射:可以在运行时动态获取变量的相关信息 Import (“reflect”) a. reflect.TypeOf,获取变量的类型,返回reflect.Type类型 b. reflect.ValueOf,获取变量的值,返回reflect.Value类型 c. reflect.Value.Kind,获取变量的类别,返回一个常量 d. reflect.Value.Interface( 反射获取基本类型

反射:可以在运行时动态获取变量的相关信息
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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1273694.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存