<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
示意圖
獲取變數的型別,返回reflect.Type型別
獲取變數的值,返回reflect.Value型別reflect.Value是一個結構體型別,通過reflect.Value,可以獲取到關於該變數的很多資訊
package main import ( "fmt" "reflect" ) /* 1.編寫案例,對基本資料型別,interface{},reflect.Value進行反射 2.編寫案例,對結構體,interface{},reflect.Value進行反射 */ func reflectTest(b interface{}){ //列印出傳參的type,kind,value fmt.Printf("b的型別為%v,b的kind為%v,value為%vn",reflect.TypeOf(b),reflect.ValueOf(b).Kind(),reflect.ValueOf(b)) //b的型別為int,b的kind為int,value為100 //reflect.TypeOf(),reflect.ValueOf()返回的型別 fmt.Printf("reflect.TypeOf()返回型別為%T,reflect.ValueOf()返回型別為%Tn",reflect.TypeOf(b),reflect.ValueOf(b)) //reflect.TypeOf()返回型別為*reflect.rtype,reflect.ValueOf()返回型別為reflect.Value } type Student struct { Name string age int } func reflectTest2(b interface{}){ rTyp:=reflect.TypeOf(b) fmt.Println(rTyp) //main.Student rVal:=reflect.ValueOf(b) //將rVal轉換成interface{} iV:=rVal.Interface() fmt.Printf("iv=%v type=%Tn",iV,iV) //iv={張三 18} type=main.Student //因為Go語言是靜態語言,所以不能直接獲取結構體中指定的值,所以我需要將其斷言成需要的型別 stu,ok:=iV.(Student) if ok{ fmt.Printf(stu.Name,stu.age) //張三%!(EXTRA int=18) } } func main() { //1.編寫案例,對基本資料型別,interface{},reflect.Value進行反射 var num int =100 reflectTest(num) //2.編寫案例,對結構體,interface{},reflect.Value進行反射 stu:=Student{ Name: "張三", age: 18, } reflectTest2(stu) }
使用反射來遍歷結構體的欄位,呼叫結構體的方法,並獲取結構體標籤的值
package main import ( "fmt" "reflect" ) //定義了一個Monster結構體 type Monster struct { Name string `json:"name"` Age int `json:"monster_age"` Score float32 `json:"成績"` Sex string } //方法,返回兩個數的和 func (s Monster) GetSum(n1, n2 int) int { return n1 + n2 } //方法, 接收四個值,給s賦值 func (s Monster) Set(name string, age int, score float32, sex string) { s.Name = name s.Age = age s.Score = score s.Sex = sex } //方法,顯示s的值 func (s Monster) Print() { fmt.Println("---start~----") fmt.Println(s) fmt.Println("---end~----") } func TestStruct(a interface{}) { //獲取reflect.Type 型別 typ := reflect.TypeOf(a) //獲取reflect.Value 型別 val := reflect.ValueOf(a) //獲取到a對應的類別 kd := val.Kind() //如果傳入的不是struct,就退出 if kd != reflect.Struct { fmt.Println("expect struct") return } //獲取到該結構體有幾個欄位 num := val.NumField() fmt.Printf("struct has %d fieldsn", num) //4 //變數結構體的所有欄位 for i := 0; i < num; i++ { fmt.Printf("Field %d: 值為=%vn", i, val.Field(i)) //獲取到struct標籤, 注意需要通過reflect.Type來獲取tag標籤的值 tagVal := typ.Field(i).Tag.Get("json") //如果該欄位於tag標籤就顯示,否則就不顯示 if tagVal != "" { fmt.Printf("Field %d: tag為=%vn", i, tagVal) } } //獲取到該結構體有多少個方法 numOfMethod := val.NumMethod() fmt.Printf("struct has %d methodsn", numOfMethod) //var params []reflect.Value //方法的排序預設是按照 函數名的排序(ASCII碼) val.Method(1).Call(nil) //獲取到第二個方法。呼叫它 //呼叫結構體的第1個方法Method(0) var params []reflect.Value //宣告了 []reflect.Value params = append(params, reflect.ValueOf(10)) params = append(params, reflect.ValueOf(40)) res := val.Method(0).Call(params) //傳入的引數是 []reflect.Value, 返回[]reflect.Value fmt.Println("res=", res[0].Int()) //返回結果, 返回的結果是 []reflect.Value*/ } func main() { //建立了一個Monster範例 var a Monster = Monster{ Name: "黃鼠狼精", Age: 400, Score: 30.8, } //將Monster範例傳遞給TestStruct函數 TestStruct(a) }
以上就是Go語言開發框架反射機制及常見函數範例詳解的詳細內容,更多關於Go開發框架反射機制的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45