golang中reflect包的常用方法
更新時間:2025年07月02日 15:10:21 作者:草海桐
Go反射reflect包提供類型和值方法,用于獲取類型信息、訪問字段、調(diào)用方法等,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
reflect包方法總結(jié)
p := Person{Name: "小明", Age: 22} t := reflect.TypeOf(&p) v := reflect.ValueOf(p)
類型 (Type) 方法
方法名 | 描述 | 示例 |
---|---|---|
Name() | 獲取類型的名稱 | t.Name() |
Kind() | 獲取類型的種類(如 struct, int, string 等) | t.Kind() |
String() | 返回類型的完整名稱,包括包路徑 | t.String() |
值 (Value) 方法
方法名 | 描述 | 示例 |
---|---|---|
FieldByName() | 根據(jù)字段名稱獲取字段的值 | v.FieldByName("Age") |
NumField() | 獲取結(jié)構(gòu)體的字段數(shù)量 | v.NumField() |
Field() | 根據(jù)索引獲取字段的值 | v.Field(i) |
Interface() | 獲取字段的值作為 interface{} 類型 | v.Field(i).Interface() |
String() | 返回值的字符串表示 | v.String() |
Kind() | 獲取值的種類(與 Type().Kind() 相同) | v.Kind() |
Type() | 獲取值的類型信息 | v.Type() |
Elem() | 返回指針指向的值 | reflect.ValueOf(&p).Elem() |
SetString() | 設(shè)置字符串類型的值 | nameField.SetString("ChenZH") |
MethodByName() | 根據(jù)方法名稱獲取方法的值 | ptr.MethodByName("String") |
Call() | 調(diào)用方法,傳入?yún)?shù)(此處為 nil) | method.Call(nil) |
IsValid() | 檢查值是否有效 | method.IsValid() |
CanSet() | 檢查字段是否可以設(shè)置 | nameField.CanSet() |
代碼示例:
package main import ( "fmt" "reflect" ) type Person struct { Name string Age int } func main() { //Type:類型信息,包括基礎(chǔ)類型(如int, string)、復(fù)合類型(如數(shù)組、切片、結(jié)構(gòu)體)等。 //Value:實(shí)際值,可以是任何類型的值。 //Kind:更具體的類型分類,比如int, float64, struct等。 // 獲取類型信息 p := Person{Name: "小明", Age: 22} t := reflect.TypeOf(p) fmt.Println("Type_name:", t.Name()) fmt.Println("Type_kind:", t.Kind()) fmt.Println("Type_string:", t.String()) // 獲取值信息 v := reflect.ValueOf(p) fmt.Println(v.FieldByName("Age")) fmt.Println("Value:", v) for i := 0; i < v.NumField(); i++ { fmt.Println("Field:", i, "Value:", v.Field(i).Interface()) } fmt.Println("Value_String", v.String()) fmt.Println("Value_Kind", v.Kind()) fmt.Println("Value_Type", v.Type()) // 修改字段值(得傳遞指針) ptr := reflect.ValueOf(&p).Elem() fmt.Println("Ptr_Value:", ptr) nameField := ptr.FieldByName("Name") if nameField.IsValid() && nameField.CanSet() { nameField.SetString("xiaoming") } fmt.Println("modified name: ", p.Name) // 調(diào)用方法 method := ptr.MethodByName("String") if method.IsValid() { results := method.Call(nil) for _, result := range results { fmt.Println("Method result: ", result.String()) } } } func (p Person) String() string { return fmt.Sprintf("%s is %d year old", p.Name, p.Age) }
到此這篇關(guān)于golang中reflect包的常用方法的文章就介紹到這了,更多相關(guān)golang reflect包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言超時退出的三種實(shí)現(xiàn)方式總結(jié)
這篇文章主要為大家詳細(xì)介紹了Go語言中超時退出的三種實(shí)現(xiàn)方式,文中的示例代碼簡潔易懂,對我們深入了解Go語言有一定的幫助,需要的可以了解一下2023-06-06GoFrame實(shí)現(xiàn)順序性校驗(yàn)示例詳解
這篇文章主要為大家介紹了GoFrame實(shí)現(xiàn)順序性校驗(yàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06