golang基础-反射获取(基础数据、结构体)、操作(基本类型、结构体、指针)、反射获取Tag
来源:互联网 发布:什么牌子的美工刀片好 编辑:程序博客网 时间:2024/06/07 05:45
反射获取基本类型
反射:可以在运行时动态获取变量的相关信息
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", 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} 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",i,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,age int,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", Age: 18, Score: 92.8, } 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", i, 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>
阅读全文
0 0
- golang基础-反射获取(基础数据、结构体)、操作(基本类型、结构体、指针)、反射获取Tag
- java基础-反射2(反射,反射操作对象,Class对象的使用,类型信息的获取)
- golang 反射结构字段类型
- 通过反射获取类的基本结构
- golang基础-结构体tag、匿名字段、结构体的方法(作用域)、继承、String()方法
- golang---利用反射机制对结构体进行循环赋值
- Java反射获取类的完整结构
- 反射获取类的结构信息
- JAVA反射(二):通过反射获取类的结构
- java基础-反射 --通过反射 获取泛型实际类型参数
- HTML基础(基本结构)
- Golang结构体和指针
- 反射获取属性类型
- Java反射基础(一)--Class对象获取
- Java基础-利用反射获取类信息
- 反射基础之获取对象信息
- golang基础-接口、接口嵌套、类型断言、接口与结构体_接口等转换
- 结构体指针链表基础练习(源代码)
- Lua 模块和包
- 控制台报错:log4j:WARN No appenders could be found for logger
- Python安装和卸载Module
- Pat 1011. A+B和C (15)
- TypeScript自动化工作流程(中)
- golang基础-反射获取(基础数据、结构体)、操作(基本类型、结构体、指针)、反射获取Tag
- 实验七:将menu设计为可重用的子系统
- LeetCode——Maximum subarray
- scanf 字符串分配内存问题
- EasyMock的一个大坑
- 版本控制之Git---错误总结
- 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?(一万以内)
- Jquery 常用笔记
- 显示列表