go 語(yǔ)言反射允許在運(yùn)行時(shí)操控變量值,包括修改布爾值、整數(shù)、浮點(diǎn)數(shù)和字符串。通過(guò)獲取變量的 value,可以調(diào)用 setbool、setint、setfloat 和 setstring 方法進(jìn)行修改。例如,可以解析 json 字符串為結(jié)構(gòu)體,然后使用反射修改結(jié)構(gòu)體字段的值。需要注意,反射操作較慢,且無(wú)法修改不可修改字段,修改結(jié)構(gòu)體字段值時(shí)可能不會(huì)自動(dòng)更新相關(guān)字段。
使用 Go 反射動(dòng)態(tài)修改變量值
反射是一種強(qiáng)大的工具,允許 Go 程序在運(yùn)行時(shí)操縱變量值。它對(duì)于實(shí)現(xiàn)各種高級(jí)特性非常有用,例如動(dòng)態(tài)類(lèi)型化和代碼生成。
基礎(chǔ)知識(shí)
反射 API 包含類(lèi)型 reflect.Value,它代表了一個(gè)值。可以使用 reflect.ValueOf(x) 獲取特定變量的 Value。
Value 具有以下方法,可用于修改值:
SetBool(v)、SetInt(v)、SetFloat(v):設(shè)置布爾值、整數(shù)和浮點(diǎn)數(shù)
SetString(v):設(shè)置字符串
Set(v):設(shè)置任意值,需手動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換
實(shí)戰(zhàn)案例
下面是一個(gè)使用反射將 JSON 字符串解析為結(jié)構(gòu)體的示例:
import (
"encoding/json"
"reflect"
)
type User struct {
Name string
Age int
}
func main() {
jsonStr := `{ "Name": "John", "Age": 30 }`
u := &User{}
// 解析 JSON 字符串到 Value
v := reflect.ValueOf(u).Elem()
err := json.Unmarshal([]byte(jsonStr), u)
if err != nil {
panic(err)
}
// 使用反射修改字段值
v.FieldByName("Name").SetString("Alice")
// 輸出修改后的值
fmt.Printf("User: %+v\n", u)
}
登錄后復(fù)制
注意
使用反射時(shí),需要注意以下幾點(diǎn):
反射操作比直接訪(fǎng)問(wèn)字段要慢。
無(wú)法修改不可修改字段。
更改結(jié)構(gòu)體字段的值時(shí),可能不會(huì)自動(dòng)更新相關(guān)字段。






