go reflect的用法
生活随笔
收集整理的這篇文章主要介紹了
go reflect的用法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
總結:
1. go語言支持反射即reflect,核心包括兩方面:類型(reflect.Type)、值(reflect.Value)
2. reflect??可以獲取到變量、結構體的類型和值
3. reflect 可以根據類型(reflect.Type)新產生一個對象
?
實驗如下圖
代碼如下:
package mainimport ("fmt""reflect" )// 自定義結構體 type User struct {ID int32Name string } func (u User) GetName() string {return u.Name }// 接口:人 type Person interface {GetHP() int32 } // 男人 type Man struct { } func (m Man) GetHP() int32 {return 100 } // 女人 type Woman struct { } func (w Woman) GetHP() int32 {return 200 }func main() {基本類型 //fmt.Println("整形")var a int = 555fmt.Println(reflect.TypeOf(a))fmt.Println(reflect.ValueOf(a)) // Valueof()就是取變量的值fmt.Println("")fmt.Println("字符串")fmt.Println(reflect.TypeOf("999"))fmt.Println(reflect.ValueOf("999")) // Valueof()就是取變量的值fmt.Println("")fmt.Println("數組")arr := []int32{1, 2, 3}fmt.Println(reflect.TypeOf(arr))fmt.Println(reflect.ValueOf(arr)) // Valueof()就是取變量的值fmt.Println("")自定義結構體 //fmt.Println("自定義結構體")// 自定義結構體user1 := User{}fmt.Println(reflect.TypeOf(user1))fmt.Println(reflect.ValueOf(user1))// 根據類型new一個結構體, 步驟如下// 1. 得到類型reflect.Type// 2. 根據類型new一個reflect.Value,再轉為Interface// 3. Interface轉為相應的對象指針userTy := reflect.TypeOf(user1)newInterface := reflect.New(userTy).Interface()newUser := newInterface.(*User)newUser.ID = 123newUser.Name = "123"fmt.Printf("根據reflect.Type新建的User對象內容:%v", newUser)// 自定義結構體的函數fmt.Println(reflect.TypeOf(user1).MethodByName("GetName")) // 返回該函數的形式fmt.Println(reflect.ValueOf(user1).MethodByName("GetName")) // 返回該函數在內存中的真實地址fmt.Println("")接口 //fmt.Println("自定義結構體")man := Man{}fmt.Println(reflect.TypeOf(man)) // 返回該結構體定義的名字fmt.Println(reflect.ValueOf(man)) // 返回{}fmt.Println("")// 根據類型新建一個Woman對象womanTy := reflect.TypeOf(Woman{}) // 這里是根據一個空的Woman對象,得到其類型newWomanInterface := reflect.New(womanTy).Interface()newWoman := newWomanInterface.(*Woman)fmt.Printf("根據reflect.Type新建的newWoman對象內容:%v", newWoman)fmt.Println("") }?
總結
以上是生活随笔為你收集整理的go reflect的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: go RC4加密解密
- 下一篇: go 打印结构体对象,结构体指针