欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文初探Go語言中的reflect反射包

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

reflect 反射包

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

reflect 包核心的兩個重要類型:

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

TypeOf(i) 和 ValueOf(i)

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

案例1:獲取變量的類別和類型信息

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("類別:", typ.Kind()) // 類別: struct
    fmt.Println("類型:", typ.Name()) // 類型: User
}
  • 通過 TypeOf() 函數(shù)獲取 data 的類型信息,然后調(diào)用 Kind()Name() 方法分別獲取 data 變量的類別和類型信息。
  • 根據(jù)返回結(jié)果可知, Kind() 返回的是 Go 的數(shù)據(jù)類型,而 Name() 返回的是我們自定義的數(shù)據(jù)類型。
  • 根據(jù) Kind() 返回值的特點,可以用于判斷變量屬于 Go 的哪種數(shù)據(jù)類型,用于類型限制等場景。

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

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")
    }
}

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

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

data 必須是指針類型,否則無法通過反射修改。

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

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

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("字段名稱:", typ.Field(i).Name)
            fmt.Println("字段類型:", typ.Field(i).Type.Name())
            fmt.Println("字段值:", val.Field(i).Interface())
            fmt.Println("----------------------------")
    }
}
  • 首先通過 TypeOf()ValueOf() 獲取到結(jié)構(gòu)體的類型信息和值信息。
  • 其次通過 Value.NumField() 方法獲取到結(jié)構(gòu)體字段的數(shù)量。
  • 接著遍歷結(jié)構(gòu)體的字段,通過 Type.Field(i) 方法,傳入索引,獲取到對應(yīng)字段的類型信息,通過 Name 屬性獲取字段名,Type.Name() 獲取字段類型。
  • 最后通過 Value.Field(i) 方法,傳入索引,獲取到對應(yīng)字段的值信息,通過 Interface() 方法獲取字段實際的值。

小結(jié)

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

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

相關(guān)文章

  • Mac下Vs code配置Go語言環(huán)境的詳細(xì)過程

    Mac下Vs code配置Go語言環(huán)境的詳細(xì)過程

    這篇文章給大家介紹Mac下Vs code配置Go語言環(huán)境的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-07-07
  • Go構(gòu)建器模式構(gòu)建復(fù)雜對象方法實例

    Go構(gòu)建器模式構(gòu)建復(fù)雜對象方法實例

    本文介紹了構(gòu)建器模式,如何通過構(gòu)建器對象構(gòu)建復(fù)雜業(yè)務(wù)對象的方法實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • golang中select語句的簡單實例

    golang中select語句的簡單實例

    Go的select語句是一種僅能用于channl發(fā)送和接收消息的專用語句,此語句運行期間是阻塞的,下面這篇文章主要給大家介紹了關(guān)于golang中select語句的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Go中時間與時區(qū)問題的深入講解

    Go中時間與時區(qū)問題的深入講解

    go語言中如果不設(shè)置指定的時區(qū),通過time.Now()獲取到的就是本地時區(qū),下面這篇文章主要給大家介紹了關(guān)于Go中時間與時區(qū)問題的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • Go語言中不可不知的語法糖盤點

    Go語言中不可不知的語法糖盤點

    Go?語言有一些非常實用的語法糖(syntactic?sugar),它們使得代碼更加簡潔和易讀,本文為大家整理了15個常見的語法糖,有需要的可以了解下
    2025-01-01
  • 基于context.Context的Golang?loader緩存請求放大問題解決

    基于context.Context的Golang?loader緩存請求放大問題解決

    這篇文章主要為大家介紹了基于context.Context的Golang?loader緩存請求放大解決方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 詳解Go程序添加遠(yuǎn)程調(diào)用tcpdump功能

    詳解Go程序添加遠(yuǎn)程調(diào)用tcpdump功能

    這篇文章主要介紹了go程序添加遠(yuǎn)程調(diào)用tcpdump功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • Go并發(fā)編程之sync.Once使用實例詳解

    Go并發(fā)編程之sync.Once使用實例詳解

    sync.Once使用起來很簡單, 下面是一個簡單的使用案例,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-11-11
  • Go擴展原語之SingleFlight的用法詳解

    Go擴展原語之SingleFlight的用法詳解

    Go語言擴展包同步原語singleflight.Group能夠再一個服務(wù)中抑制對下游的多次重復(fù)請求,它能夠限制對同一個鍵值對的多次重復(fù)請求,減少對下游的瞬時流量,接下來小編就給大家講講Go SingleFlight的具體用法,需要的朋友可以參考下
    2023-07-07
  • 基于Go?goroutine實現(xiàn)一個簡單的聊天服務(wù)

    基于Go?goroutine實現(xiàn)一個簡單的聊天服務(wù)

    對于聊天服務(wù),想必大家都不會陌生,因為在我們的生活中經(jīng)常會用到,本文我們用?Go?并發(fā)來實現(xiàn)一個聊天服務(wù)器,這個程序可以讓一些用戶通過服務(wù)器向其它所有用戶廣播文本消息,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06

最新評論