Golang學習筆記 反射

2021-10-01 13:45:29 字數 2101 閱讀 8319

反射讓我們可以在執行時獲取物件的型別資訊,比如檢視乙個結構體有多少字段,檢視函式的入參型別和返回值型別等。

go提供了reflect.typeof()和reflect.valueof獲取任意物件的reflect.value和reflect.type,其中reflect.type是乙個介面型別,該介面提供了很多方法讓我們獲取型別資訊,而reflect.value是乙個結構體,它提供了很多方法讓我們獲取或者寫入reflect.value結構體中儲存的資料。

package main

import

("fmt"

"reflect"

)type person struct

func

(person person)

addheight

(height int

)string

func

main()

valuetype:=reflect.

typeof

(person)

for i:=

0;inumfield()

;i++

//遍歷結構體匯出的方法

for i:=

0;inummethod()

;i++

//遍歷函式引數和返回值

valuetype=reflect.

typeof

(person

.addheight)

for i:=

0;inumin()

;i++

for i:=

0;inumout()

;i++

}

使用kind方法可以獲取型別的底層型別,go提供了以下底層型別:

const

( invalid kind =

iota

bool

intint8

int16

int32

int64

uint

uint8

uint16

uint32

uint64

uintptr

float32

float64

complex64

complex128

array

chan

func

inte***ce

mapptr

slice

string

struct

unsafepointer

)

使用inte***ce()方法可以將reflect.value還原成介面型別,然後再強轉一次就能還原成原本的型別。

func

main()

如果想通過reflect.value修改物件,那麼reflect.valueof()需要傳遞物件的位址,然後通過elem()方法找到這個指標指向的值才能修改,reflect.value提供了canset()方法幫助我們判斷是否可以修改該物件。

func

main()

利用反射動態呼叫方法時引數和返回值都是reflect.value切片。

package main

import

("fmt"

"reflect"

"strconv"

)type person struct

func

(person person)

addheight

(height int

)string

func

main()

value:=reflect.

valueof

(person)

method:=value.

methodbyname

("addheight"

)if method.

isvalid()

fmt.

println

(method.

call

(args))}

}

Golang學習筆記

如果乙個method的receiver是 t,你可以在乙個t型別的例項變數v上面呼叫這個method,而不需要 v去呼叫這個method 即不需要 v method 如果乙個method的receiver是t,你可以在乙個 t型別的變數p上呼叫這個method,而不需要 p去呼叫這個method。i...

golang學習筆記

與c語法不同之處 1.引數列表中各個引數型別相同時可以只寫出最後乙個,如 add x,y int int 2.型別在引數名 變數 函式 後面 3.函式的左大括號要跟函式名同一行,否則編譯不過 4.函式定義要先寫關鍵字func在函式開頭 函式外的每個語句都要以func var等等關鍵字開頭 5.在包或...

Golang學習筆記

package main import fmt func main break default func inte ce select case defer gomap struct chan else goto package switch const fallthrough ifrange ty...