go語言基礎 反射 reflect

2021-08-19 14:00:44 字數 2905 閱讀 2860

反射reflect

struct

reflect.typeof(i inte***ce{})-->type

獲取結構體的字段的型別,欄位名

方法的型別,方法的名字

packagemain

import(

"fmt"

"reflect"

)typepersonstruct

func(p person)say(msg string)

func(p person)printinfo()

funcmain()

//1.第一部分:通過反射操作結構體中的字段:獲取欄位的型別,名稱,數值。。

//通過reflect包下的typeof(),獲取p1的型別

t1:=reflect.typeof(p1)

fmt.println(t1)

fmt.println(t1.name()) //person

fmt.println(t1.kind()) //struct

//通過reflect包下valueof(),獲取p1的值

v1:=reflect.valueof(p1) //

fmt.println(v1)

//詳細操作:判斷t1的種類是結構體型別

ift1.kind() == reflect.struct

}//2.通過反射,操作方法

fmt.println(t1.nummethod())

fori:=0

;i;i++

//執行方法

m1:=v1.methodbyname("printinfo")

m1.call(nil)//執行m1對應的printinfo()

m2:=v1.methodbyname("say")

m2.call(reflect.value) // string-->value

}

reflect.valueof(i inte***ce{})-->value

獲取結構體的字段的數值

獲取方法的物件--->call(),執行對應的方法

packagemain

import(

"reflect"

"fmt"

)typeanimalstruct

typecatstruct

funcmain() ,

"白色"}

t1 := reflect.typeof(c1)

fmt.println(t1.numfield())

fori := 0

; i < t1.numfield(); i++

//獲取匿名字段

/*匿名字段,可以通過下標獲取

fieldbyindex(int)-->animal

fieldbyindex(int)-->animal中的第乙個字段:name

*/f1:=t1.fieldbyindex(int)

fmt.println(f1.name,f1.type)//name string

f2:=t1.fieldbyindex(int)

fmt.println(f2.name,f2.type)

v1:=reflect.valueof(c1)

name:=v1.fieldbyindex(int)

fmt.println(name)

}

//匿名字段

t1.fieldbyindex(int)

v1.fieldbyindex(int)

//更改資料

reflect.valueof(p1)-->value

reflect.struct

reflect.valueof(&p1)-->value

reflect.ptr

v1 = v1.elem()

canset()-->bool

c1.fieldbyname()-->f1

f1.set***(新value)

packagemain

import(

"reflect"

"fmt"

)typestudentstruct

funcmain()

fmt.printf("%t\n"

,s1)

p1:=&s1

fmt.printf("%t\n"

,p1) //*main.student

fmt.println(s1.name)

fmt.println((*p1).name,p1.name)

v1:= reflect.valueof(&s1) // value

ifv1.kind()==reflect.ptr

f1:=v1.fieldbyname("name")

f1.setstring("王三狗")

f3:=v1.fieldbyname("school")

f3.setstring("藍翔學校")

fmt.println(s1)

}

GO語言學習 反射reflect

反射能在執行期探知物件的型別資訊和記憶體結構。也是實現元程式設計的重要手段。反射所需的全部資訊都源自介面變數。介面變數處儲存自身型別外,還會儲存實際物件的型別資料。將任何傳入的物件轉換為介面型別 func typeof i inte ce type func valueof i inte ce va...

Go中反射(reflect)的應用

package main import fmt reflect type monster struct 顯示s的值 func s monster print 返回兩個數的和 func s monster getsum n1,n2 int int 設定s結構體的在 func s monster set...

反射 reflect 及其應用

class 所有類的位元組碼檔案 class.forname 全類名 類名.class 例項.getclass field getdeclaredfield getdeclaredfields 修飾符 型別 名稱 method 獲取 getdeclaredmethod 引數型別的class.para...