最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文初探Go語(yǔ)言中的reflect反射包

 更新時(shí)間:2022年12月05日 08:23:17   作者:陳明勇  
這篇文章主要和大家分享一下Go語(yǔ)言中的reflect反射包,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的小伙伴可以參考一下

reflect 反射包

針對(duì)反射,Go 提供了 reflect 包,使用這個(gè)包里的函數(shù)可以在程序運(yùn)行時(shí)獲取和更新未知變量的值,操作未知變量的方法等。

reflect 包核心的兩個(gè)重要類(lèi)型:

  • reflect.TypeType 是一個(gè)接口,不同數(shù)據(jù)類(lèi)型有著不同的結(jié)構(gòu)體實(shí)現(xiàn)。這個(gè)接口用于操作變量的類(lèi)型信息,類(lèi)型的信息只能讀取。
  • reflect.ValueValue 是一個(gè)結(jié)構(gòu)體,通過(guò)這個(gè)結(jié)構(gòu)體可以操作變量的值。

TypeOf(i) 和 ValueOf(i)

  • reflect.TypeOf(i any) Type:獲取變量的類(lèi)型,返回一個(gè) reflect.Type 類(lèi)型。
  • reflect.ValueOf(i any) Value:獲取變量的值,返回 reflect.Value 類(lèi)型,通過(guò) Value 可以對(duì)獲取變量更多的信息。

案例1:獲取變量的類(lèi)別和類(lèi)型信息

import (
    "fmt"
    "reflect"
)

type User struct {
    Name string
}

func main() {
    user := User{
            Name: "cmy",
    }
    func4Reflect(user)
}

func func4Reflect(data any) {
    typ := reflect.TypeOf(data)
    fmt.Println("類(lèi)別:", typ.Kind()) // 類(lèi)別: struct
    fmt.Println("類(lèi)型:", typ.Name()) // 類(lèi)型: User
}
  • 通過(guò) TypeOf() 函數(shù)獲取 data 的類(lèi)型信息,然后調(diào)用 Kind()Name() 方法分別獲取 data 變量的類(lèi)別和類(lèi)型信息。
  • 根據(jù)返回結(jié)果可知, Kind() 返回的是 Go 的數(shù)據(jù)類(lèi)型,而 Name() 返回的是我們自定義的數(shù)據(jù)類(lèi)型。
  • 根據(jù) Kind() 返回值的特點(diǎn),可以用于判斷變量屬于 Go 的哪種數(shù)據(jù)類(lèi)型,用于類(lèi)型限制等場(chǎng)景。

案例2:修改基本數(shù)據(jù)類(lèi)型變量的值

import (
    "fmt"
    "reflect"
)

func main() {
    num1 := 666
    fmt.Println("num1 原值:", num1)
    func4Reflect(&num1)
    fmt.Println("num1 修改后的值:", num1)

    num2 := 0.5
    fmt.Println("num2 原值:", num2)
    func4Reflect(&num2)
    fmt.Println("num2 修改后的值:", num2)

    str := "go"
    fmt.Println("str 原值:", str)
    func4Reflect(&str)
    fmt.Println("str 修改后的值:", str)
}

func func4Reflect(data any) {
    typ := reflect.TypeOf(data)
    val := reflect.ValueOf(data)
    switch typ.Elem().Kind() {
    case reflect.Int:
            val.Elem().SetInt(888)
    case reflect.Float64:
            val.Elem().SetFloat(3.14)
    case reflect.String:
            val.Elem().SetString("Golang")
    }
}

通過(guò) ValueOf() 函數(shù)獲取 data 變量的值信息,然后結(jié)合 reflect.Type.Kind() 方法,對(duì)不同類(lèi)型的變量的值進(jìn)行修改操作(只舉三種類(lèi)型的例子):

  • int 類(lèi)型 → 使用 SetInt(val) 方法對(duì)值進(jìn)行修改。
  • float64 → 使用 SetFloat(val) 方法對(duì)值進(jìn)行修改。
  • string 類(lèi)型 → 使用 SetString(val) 方法對(duì)值進(jìn)行修改。

data 必須是指針類(lèi)型,否則無(wú)法通過(guò)反射修改。

由于是指針類(lèi)型,因此需要調(diào)用 Elem() 方法獲取到指針指向的變量,才能修改變量的值。

案例3:通過(guò)反射獲取結(jié)構(gòu)體的字段名、字段類(lèi)型和字段的值

import (
    "fmt"
    "reflect"
)

type User struct {
    Name string
    Age  int
}

func main() {
    user := User{
            Name: "cmy",
            Age:  18,
    }
    func4Reflect(user)
}

func func4Reflect(data any) {
    typ := reflect.TypeOf(data)
    val := reflect.ValueOf(data)
    // 獲取結(jié)構(gòu)體字段的數(shù)量
    numField := val.NumField()
    for i := 0; i < numField; i++ {
            fmt.Println("字段名稱(chēng):", typ.Field(i).Name)
            fmt.Println("字段類(lèi)型:", typ.Field(i).Type.Name())
            fmt.Println("字段值:", val.Field(i).Interface())
            fmt.Println("----------------------------")
    }
}
  • 首先通過(guò) TypeOf()ValueOf() 獲取到結(jié)構(gòu)體的類(lèi)型信息和值信息。
  • 其次通過(guò) Value.NumField() 方法獲取到結(jié)構(gòu)體字段的數(shù)量。
  • 接著遍歷結(jié)構(gòu)體的字段,通過(guò) Type.Field(i) 方法,傳入索引,獲取到對(duì)應(yīng)字段的類(lèi)型信息,通過(guò) Name 屬性獲取字段名,Type.Name() 獲取字段類(lèi)型。
  • 最后通過(guò) Value.Field(i) 方法,傳入索引,獲取到對(duì)應(yīng)字段的值信息,通過(guò) Interface() 方法獲取字段實(shí)際的值。

小結(jié)

本文首先介紹了 reflect 包里兩個(gè)重要的類(lèi)型 reflect.Typereflect.Value,簡(jiǎn)單說(shuō)明了它們的作用;其次介紹了TypeOf(i)ValueOf(i) 兩個(gè)函數(shù);最后通過(guò)三個(gè)案例介紹了它們的使用場(chǎng)景。

到此這篇關(guān)于一文初探Go語(yǔ)言中的reflect反射包的文章就介紹到這了,更多相關(guān)Go語(yǔ)言reflect反射包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入理解Go語(yǔ)言對(duì)象池

    深入理解Go語(yǔ)言對(duì)象池

    對(duì)象池是一種在編程中用于優(yōu)化資源管理的技術(shù),本文主要介紹了深入理解Go語(yǔ)言對(duì)象池,對(duì)象池通常通過(guò)sync.Pool包或自定義數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),下面就來(lái)介紹一下
    2024-01-01
  • go日志庫(kù)中的logrus

    go日志庫(kù)中的logrus

    這篇文章主要介紹了go日志庫(kù)中的logrus主要包括go日志庫(kù)logrus的安裝和使用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Go語(yǔ)言中strings和strconv包示例代碼詳解

    Go語(yǔ)言中strings和strconv包示例代碼詳解

    這篇文章主要介紹了Go語(yǔ)言中strings和strconv包示例代碼詳解 ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • golang中context的作用詳解

    golang中context的作用詳解

    這篇文章主要介紹了golang中context的作用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Go語(yǔ)言實(shí)現(xiàn)自動(dòng)填寫(xiě)古詩(shī)詞實(shí)例代碼

    Go語(yǔ)言實(shí)現(xiàn)自動(dòng)填寫(xiě)古詩(shī)詞實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言實(shí)現(xiàn)自動(dòng)填寫(xiě)古詩(shī)詞的相關(guān)資料,這是最近在項(xiàng)目中遇到的一個(gè)需求,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Go語(yǔ)言實(shí)現(xiàn)AzDG可逆加密算法實(shí)例

    Go語(yǔ)言實(shí)現(xiàn)AzDG可逆加密算法實(shí)例

    這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)AzDG可逆加密算法,實(shí)例分析了AzDG可逆加密算法的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • 使用Go語(yǔ)言實(shí)現(xiàn)benchmark解析器

    使用Go語(yǔ)言實(shí)現(xiàn)benchmark解析器

    這篇文章主要為大家詳細(xì)介紹了如何使用Go語(yǔ)言實(shí)現(xiàn)benchmark解析器并實(shí)現(xiàn)及Web UI 數(shù)據(jù)可視化,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考一下
    2025-04-04
  • GoFrame?gtree樹(shù)形結(jié)構(gòu)的使用技巧示例

    GoFrame?gtree樹(shù)形結(jié)構(gòu)的使用技巧示例

    這篇文章主要為大家介紹了GoFrame?gtree樹(shù)形結(jié)構(gòu)的使用技巧示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • go進(jìn)行http請(qǐng)求偶發(fā)EOF問(wèn)題分析

    go進(jìn)行http請(qǐng)求偶發(fā)EOF問(wèn)題分析

    go使用連接池進(jìn)行http請(qǐng)求,一般都能請(qǐng)求成功,但偶然會(huì)出現(xiàn)請(qǐng)求失敗返回EOF錯(cuò)誤的情況,本文主要來(lái)帶大家分析一下為什么會(huì)出現(xiàn)這樣的問(wèn)題并提供解決方法,需要的可以參考下
    2025-01-01
  • golang如何判斷文件是否存在

    golang如何判斷文件是否存在

    判斷一個(gè)文件是否存在是一個(gè)相當(dāng)常見(jiàn)的需求,在golang中也有多種方案實(shí)現(xiàn)這一功能,下面就跟隨小編一起學(xué)習(xí)一下具體的實(shí)現(xiàn)方法吧
    2024-11-11

最新評(píng)論

封开县| 盐源县| 岗巴县| 舞钢市| 德清县| 新密市| 陇川县| 马尔康县| 福泉市| 庆城县| 吉木乃县| 昆山市| 兴安盟| 民乐县| 开原市| 神木县| 江华| 定远县| 卢龙县| 都兰县| 西乌| 清河县| 社旗县| 砀山县| 兰州市| 宣汉县| 湛江市| 海兴县| 绥宁县| 江华| 贵溪市| 凤山县| 静宁县| 新昌县| 江陵县| 平定县| 泰兴市| 山丹县| 体育| 博罗县| 安仁县|