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

Go語言reflect.TypeOf()和reflect.Type通過反射獲取類型信息

 更新時間:2021年04月15日 10:47:35   投稿:zx  
這篇文章主要介紹了Go語言reflect.TypeOf()和reflect.Type通過反射獲取類型信息,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

在 Go語言中通過調(diào)用 reflect.TypeOf 函數(shù),我們可以從一個任何非接口類型的值創(chuàng)建一個 reflect.Type 值。reflect.Type 值表示著此非接口值的類型。通過此值,我們可以得到很多此非接口類型的信息。當然,我們也可以將一個接口值傳遞給一個 reflect.TypeOf 函數(shù)調(diào)用,但是此調(diào)用將返回一個表示著此接口值的動態(tài)類型的 reflect.Type 值。

實際上,reflect.TypeOf 函數(shù)的唯一參數(shù)的類型為 interface{},reflect.TypeOf 函數(shù)將總是返回一個表示著此唯一接口參數(shù)值的動態(tài)類型的 reflect.Type 值。

那如何得到一個表示著某個接口類型的 reflect.Type 值呢?我們必須通過下面將要介紹的一些間接途徑來達到這一目的。

類型 reflect.Type 為一個接口類型,它指定了若干方法(https://golang.google.cn/pkg/reflect/#Type)。 通過這些方法,我們能夠觀察到一個 reflect.Type 值所表示的 Go類型的各種信息。這些方法中的有的適用于所有種類(https://golang.google.cn/pkg/reflect/#Kind)的類型,有的只適用于一種或幾種類型。通過不合適的 reflect.Type 屬主值調(diào)用某個方法將在運行時產(chǎn)生一個恐慌。

使用 reflect.TypeOf() 函數(shù)可以獲得任意值的類型對象(reflect.Type),程序通過類型對象可以訪問任意值的類型信息。下面通過例子來理解獲取類型對象的過程:

package main
import (
    "fmt"
    "reflect"
)
func main() {
    var a int
    typeOfA := reflect.TypeOf(a)
    fmt.Println(typeOfA.Name(), typeOfA.Kind())
}

代碼輸出如下:
int  int

代碼說明如下:

  • 第 10 行,定義一個 int 類型的變量。
  • 第 12 行,通過 reflect.TypeOf() 取得變量 a 的類型對象 typeOfA,類型為 reflect.Type()。
  • 第 14 行中,通過 typeOfA 類型對象的成員函數(shù),可以分別獲取到 typeOfA 變量的類型名為 int,種類(Kind)為 int。

理解反射的類型(Type)與種類(Kind)

在使用反射時,需要首先理解類型(Type)和種類(Kind)的區(qū)別。編程中,使用最多的是類型,但在反射中,當需要區(qū)分一個大品種的類型時,就會用到種類(Kind)。例如,需要統(tǒng)一判斷類型中的指針時,使用種類(Kind)信息就較為方便。

1) 反射種類(Kind)的定義

Go 程序中的類型(Type)指的是系統(tǒng)原生數(shù)據(jù)類型,如 int、string、bool、float32 等類型,以及使用 type 關(guān)鍵字定義的類型,這些類型的名稱就是其類型本身的名稱。例如使用 type A struct{} 定義結(jié)構(gòu)體時,A 就是 struct{} 的類型。

種類(Kind)指的是對象歸屬的品種,在 reflect 包中有如下定義:

type Kind uint
const (
    Invalid Kind = iota  // 非法類型
    Bool                 // 布爾型
    Int                  // 有符號整型
    Int8                 // 有符號8位整型
    Int16                // 有符號16位整型
    Int32                // 有符號32位整型
    Int64                // 有符號64位整型
    Uint                 // 無符號整型
    Uint8                // 無符號8位整型
    Uint16               // 無符號16位整型
    Uint32               // 無符號32位整型
    Uint64               // 無符號64位整型
    Uintptr              // 指針
    Float32              // 單精度浮點數(shù)
    Float64              // 雙精度浮點數(shù)
    Complex64            // 64位復(fù)數(shù)類型
    Complex128           // 128位復(fù)數(shù)類型
    Array                // 數(shù)組
    Chan                 // 通道
    Func                 // 函數(shù)
    Interface            // 接口
    Map                  // 映射
    Ptr                  // 指針
    Slice                // 切片
    String               // 字符串
    Struct               // 結(jié)構(gòu)體
    UnsafePointer        // 底層指針
)

Map、Slice、Chan 屬于引用類型,使用起來類似于指針,但是在種類常量定義中仍然屬于獨立的種類,不屬于 Ptr。

type A struct{} 定義的結(jié)構(gòu)體屬于 Struct 種類,*A 屬于 Ptr。

2) 從類型對象中獲取類型名稱和種類的例子

Go語言中的類型名稱對應(yīng)的反射獲取方法是 reflect.Type 中的 Name() 方法,返回表示類型名稱的字符串。

類型歸屬的種類(Kind)使用的是 reflect.Type 中的 Kind() 方法,返回 reflect.Kind 類型的常量。

下面的代碼中會對常量和結(jié)構(gòu)體進行類型信息獲取。

package main
import (
    "fmt"
    "reflect"
)
// 定義一個Enum類型
type Enum int
const (
    Zero Enum = 0
)
func main() {
    // 聲明一個空結(jié)構(gòu)體
    type cat struct {
    }
    // 獲取結(jié)構(gòu)體實例的反射類型對象
    typeOfCat := reflect.TypeOf(cat{})
    // 顯示反射類型對象的名稱和種類
    fmt.Println(typeOfCat.Name(), typeOfCat.Kind())
    // 獲取Zero常量的反射類型對象
    typeOfA := reflect.TypeOf(Zero)
    // 顯示反射類型對象的名稱和種類
    fmt.Println(typeOfA.Name(), typeOfA.Kind())
}

代碼輸出如下:
cat struct
Enum int

代碼說明如下:

  • 第 18 行,聲明結(jié)構(gòu)體類型 cat。
  • 第 22 行,將 cat 實例化,并且使用 reflect.TypeOf() 獲取被實例化后的 cat 的反射類型對象。
  • 第 25 行,輸出cat的類型名稱和種類,類型名稱就是 cat,而 cat 屬于一種結(jié)構(gòu)體種類,因此種類為 struct。
  • 第 28 行,Zero 是一個 Enum 類型的常量。這個 Enum 類型在第 9 行聲明,第 12 行聲明了常量。如沒有常量也不能創(chuàng)建實例,通過 reflect.TypeOf() 直接獲取反射類型對象。
  • 第 31 行,輸出 Zero 對應(yīng)的類型對象的類型名和種類。

到此這篇關(guān)于Go語言reflect.TypeOf()和reflect.Type通過反射獲取類型信息 的文章就介紹到這了,更多相關(guān)Go 反射獲取類型信息 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go?并發(fā)編程協(xié)程及調(diào)度機制詳情

    Go?并發(fā)編程協(xié)程及調(diào)度機制詳情

    這篇文章主要介紹了Go并發(fā)編程協(xié)程及調(diào)度機制詳情,協(xié)程是Go語言最大的特色之一,goroutine的實現(xiàn)其實是通過協(xié)程,更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-09-09
  • Go?mod包管理工具詳解

    Go?mod包管理工具詳解

    Go?mod作為Go語言的官方包管理工具,可以幫助開發(fā)者更好地管理包和依賴,提高開發(fā)效率和項目可維護性,本文將介紹Go語言的包和依賴管理,以及Go?mod的作用和優(yōu)勢,需要的朋友可以參考下
    2023-05-05
  • Golang使用原生http實現(xiàn)中間件的代碼詳解

    Golang使用原生http實現(xiàn)中間件的代碼詳解

    中間件(middleware):常被用來做認證校驗、審計等,家常用的Iris、Gin等web框架,都包含了中間件邏輯,但有時我們引入該框架顯得較為繁重,本文將介紹通過golang原生http來實現(xiàn)中間件操作,需要的朋友可以參考下
    2024-05-05
  • Golang如何使用go.mod配置加載本地模塊

    Golang如何使用go.mod配置加載本地模塊

    這篇文章主要介紹了Golang如何使用go.mod配置加載本地模塊問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Gin框架中參數(shù)校驗優(yōu)化詳解

    Gin框架中參數(shù)校驗優(yōu)化詳解

    這篇文章主要為大家詳細介紹了Gin框架中參數(shù)校驗優(yōu)化的相關(guān)知識,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解下
    2023-08-08
  • Golang如何將上傳的文件壓縮成zip(小案例)

    Golang如何將上傳的文件壓縮成zip(小案例)

    這篇文章主要介紹了Golang如何將上傳的文件壓縮成zip(小案例),這是一個簡單的golang壓縮文件小案例,可做很多的拓展,這里使用的庫是archive/zip,在gopkg里面搜zip就行,需要的朋友可以參考下
    2024-01-01
  • go語言中的defer關(guān)鍵字

    go語言中的defer關(guān)鍵字

    這篇文章介紹了go語言中的defer關(guān)鍵字,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Golang處理gRPC請求/響應(yīng)元數(shù)據(jù)的示例代碼

    Golang處理gRPC請求/響應(yīng)元數(shù)據(jù)的示例代碼

    前段時間實現(xiàn)內(nèi)部gRPC框架時,為了實現(xiàn)在服務(wù)端攔截器中打印請求及響應(yīng)的頭部信息,便查閱了部分關(guān)于元數(shù)據(jù)的資料,因為中文網(wǎng)絡(luò)上對于該領(lǐng)域的信息較少,于是在這做了一些簡單的總結(jié),需要的朋友可以參考下
    2024-03-03
  • go語言實現(xiàn)一個最簡單的http文件服務(wù)器實例

    go語言實現(xiàn)一個最簡單的http文件服務(wù)器實例

    這篇文章主要介紹了go語言實現(xiàn)一個最簡單的http文件服務(wù)器的方法,實例分析了Go語言操作http的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • Go錯誤處理的幾種方式

    Go錯誤處理的幾種方式

    在Go語言中,錯誤處理是一種重要的編程模式,它用于處理可能出現(xiàn)的錯誤或異常情況,本文就來介紹一下Go錯誤處理的幾種方式,感興趣的可以了解一下
    2023-11-11

最新評論

山阴县| 吉隆县| 东乡县| 息烽县| 长兴县| 喀喇沁旗| 平凉市| 靖远县| 称多县| 潼关县| 庐江县| 宁阳县| 宁南县| 连江县| 鹤峰县| 安义县| 饶河县| 湖口县| 龙州县| 永登县| 新河县| 新邵县| 两当县| 周口市| 龙里县| 西城区| 浑源县| 互助| 荥经县| 顺平县| 页游| 囊谦县| 巢湖市| 乌什县| 维西| 山丹县| 新乐市| 修文县| 惠水县| 扬中市| 宁陕县|