golang中reflect包的常用方法
更新時(shí)間:2025年07月02日 15:10:21 作者:草海桐
Go反射reflect包提供類(lèi)型和值方法,用于獲取類(lèi)型信息、訪問(wèn)字段、調(diào)用方法等,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
reflect包方法總結(jié)
p := Person{Name: "小明", Age: 22}
t := reflect.TypeOf(&p)
v := reflect.ValueOf(p)類(lèi)型 (Type) 方法
| 方法名 | 描述 | 示例 |
|---|---|---|
| Name() | 獲取類(lèi)型的名稱(chēng) | t.Name() |
| Kind() | 獲取類(lèi)型的種類(lèi)(如 struct, int, string 等) | t.Kind() |
| String() | 返回類(lèi)型的完整名稱(chēng),包括包路徑 | t.String() |
值 (Value) 方法
| 方法名 | 描述 | 示例 |
|---|---|---|
| FieldByName() | 根據(jù)字段名稱(chēng)獲取字段的值 | v.FieldByName("Age") |
| NumField() | 獲取結(jié)構(gòu)體的字段數(shù)量 | v.NumField() |
| Field() | 根據(jù)索引獲取字段的值 | v.Field(i) |
| Interface() | 獲取字段的值作為 interface{} 類(lèi)型 | v.Field(i).Interface() |
| String() | 返回值的字符串表示 | v.String() |
| Kind() | 獲取值的種類(lèi)(與 Type().Kind() 相同) | v.Kind() |
| Type() | 獲取值的類(lèi)型信息 | v.Type() |
| Elem() | 返回指針指向的值 | reflect.ValueOf(&p).Elem() |
| SetString() | 設(shè)置字符串類(lèi)型的值 | nameField.SetString("ChenZH") |
| MethodByName() | 根據(jù)方法名稱(chēng)獲取方法的值 | 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:類(lèi)型信息,包括基礎(chǔ)類(lèi)型(如int, string)、復(fù)合類(lèi)型(如數(shù)組、切片、結(jié)構(gòu)體)等。
//Value:實(shí)際值,可以是任何類(lèi)型的值。
//Kind:更具體的類(lèi)型分類(lèi),比如int, float64, struct等。
// 獲取類(lèi)型信息
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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:
相關(guān)文章
golang新手不注意可能會(huì)出現(xiàn)的一些小問(wèn)題
最近在學(xué)習(xí)golang,發(fā)現(xiàn)了一些新手們需要注意的小問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于golang新手不注意可能會(huì)出現(xiàn)的一些小問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-12-12
Go語(yǔ)言題解LeetCode1051高度檢查器示例詳解
這篇文章主要為大家介紹了Go語(yǔ)言題解LeetCode1051高度檢查器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Go語(yǔ)言超時(shí)退出的三種實(shí)現(xiàn)方式總結(jié)
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中超時(shí)退出的三種實(shí)現(xiàn)方式,文中的示例代碼簡(jiǎn)潔易懂,對(duì)我們深入了解Go語(yǔ)言有一定的幫助,需要的可以了解一下2023-06-06
GoFrame實(shí)現(xiàn)順序性校驗(yàn)示例詳解
這篇文章主要為大家介紹了GoFrame實(shí)現(xiàn)順序性校驗(yàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06

