亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索

Golang反射語法基礎(chǔ)與示例代碼

P粉602998670
發(fā)布: 2025-10-17 14:43:01
原創(chuàng)
444人瀏覽過
Go語言通過reflect包實(shí)現(xiàn)反射,可動(dòng)態(tài)獲取類型和值。1. 使用reflect.TypeOf和ValueOf獲取變量的類型與值,Kind返回底層數(shù)據(jù)結(jié)構(gòu);2. 遍歷結(jié)構(gòu)體字段需傳入指針并調(diào)用Elem(),結(jié)合Tag信息可實(shí)現(xiàn)序列化等操作;3. 修改字段前需調(diào)用CanSet()判斷可設(shè)置性,僅當(dāng)值可尋址時(shí)才能修改;4. 通過MethodByName查找方法并用Call調(diào)用,參數(shù)以[]reflect.Value傳遞。這些機(jī)制廣泛應(yīng)用于通用庫、ORM和序列化場景。

golang反射語法基礎(chǔ)與示例代碼

Go語言的反射機(jī)制通過reflect包實(shí)現(xiàn),能夠在運(yùn)行時(shí)動(dòng)態(tài)獲取變量的類型和值,并進(jìn)行操作。反射在編寫通用庫、序列化、ORM等場景中非常有用。以下是Go反射的基礎(chǔ)語法與實(shí)用示例。

1. 基本類型與值的獲取

使用reflect.TypeOf獲取變量的類型,reflect.ValueOf獲取其值。

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var x int = 42
    t := reflect.TypeOf(x)      // 類型信息
    v := reflect.ValueOf(x)     // 值信息

    fmt.Println("Type:", t)           // int
    fmt.Println("Value:", v)          // 42
    fmt.Println("Kind:", v.Kind())    // int
}
登錄后復(fù)制

Type表示類型元數(shù)據(jù),Value表示具體值。注意Kind返回的是底層數(shù)據(jù)結(jié)構(gòu)(如int、struct、slice等)。

2. 結(jié)構(gòu)體字段遍歷與操作

反射可以遍歷結(jié)構(gòu)體字段,讀取或修改其值(需傳入指針)。

立即學(xué)習(xí)go語言免費(fèi)學(xué)習(xí)筆記(深入)”;

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func inspectStruct(s interface{}) {
    v := reflect.ValueOf(s).Elem()
    t := v.Type()

    for i := 0; i < v.NumField(); i++ {
        field := v.Field(i)
        structField := t.Field(i)
        tag := structField.Tag.Get("json")

        fmt.Printf("Field: %s, Value: %v, Tag: %s\n",
            structField.Name, field.Interface(), tag)
    }
}

func main() {
    p := &Person{Name: "Alice", Age: 30}
    inspectStruct(p)
}
登錄后復(fù)制

輸出:

Field: Name, Value: Alice, Tag: name
Field: Age, Value: 30, Tag: age
登錄后復(fù)制

注意要傳入指針并調(diào)用Elem()獲取指向的值,否則無法修改。

代碼小浣熊
代碼小浣熊

代碼小浣熊是基于商湯大語言模型的軟件智能研發(fā)助手,覆蓋軟件需求分析、架構(gòu)設(shè)計(jì)、代碼編寫、軟件測試等環(huán)節(jié)

代碼小浣熊51
查看詳情 代碼小浣熊

3. 動(dòng)態(tài)設(shè)置字段值

只有可尋址的reflect.Value才能修改值,通常需傳入指針。

func setAge(obj interface{}, newAge int) {
    v := reflect.ValueOf(obj).Elem()
    ageField := v.FieldByName("Age")
    if ageField.CanSet() {
        ageField.SetInt(int64(newAge))
    }
}

func main() {
    p := &Person{Name: "Bob", Age: 25}
    setAge(p, 35)
    fmt.Println(*p) // {Bob 35}
}
登錄后復(fù)制

CanSet()判斷字段是否可被修改,未導(dǎo)出字段或非指針傳遞會(huì)導(dǎo)致不可設(shè)。

4. 調(diào)用方法

反射可以動(dòng)態(tài)調(diào)用結(jié)構(gòu)體的方法。

func (p Person) Greet() {
    fmt.Printf("Hello, I'm %s, %d years old.\n", p.Name, p.Age)
}

func callMethod(obj interface{}, methodName string) {
    v := reflect.ValueOf(obj)
    method := v.MethodByName(methodName)
    if method.IsValid() {
        method.Call(nil) // 無參數(shù)調(diào)用
    }
}

func main() {
    p := &Person{Name: "Charlie", Age: 28}
    callMethod(p, "Greet") // 輸出問候語
}
登錄后復(fù)制

Call接收一個(gè)[]reflect.Value作為參數(shù)列表,例如method.Call([]reflect.Value{})

基本上就這些核心用法。掌握Type、Value、Kind、可設(shè)置性及方法調(diào)用,就能在實(shí)際項(xiàng)目中合理使用反射。

以上就是Golang反射語法基礎(chǔ)與示例代碼的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!

最佳 Windows 性能的頂級(jí)免費(fèi)優(yōu)化軟件
最佳 Windows 性能的頂級(jí)免費(fèi)優(yōu)化軟件

每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。

下載
來源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn
最新問題
開源免費(fèi)商場系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長!
關(guān)注服務(wù)號(hào) 技術(shù)交流群
PHP中文網(wǎng)訂閱號(hào)
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號(hào)
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)