如何在 Golang 中查詢 Struct 的型別?


在 Golang 中,結構體 (struct) 是一種強大且必不可少的特性,有助於組織資料並提高程式碼可讀性。結構體是一種複合資料型別,它將零個或多個不同型別的值組合在一起。它是一種使用者定義的型別,可以根據程式設計師的需求進行自定義。有時,在處理大型程式碼庫時,跟蹤正在使用的不同型別的結構體可能會變得很困難。在本文中,我們將討論如何在 Golang 中查詢結構體的型別。

使用 "reflect" 包

Golang 中的 "reflect" 包提供了一種在執行時檢查型別的方法。我們可以使用 "reflect.TypeOf()" 函式來確定結構體的型別。此函式接受一個 interface{} 作為引數,並返回一個 Type 物件,該物件表示傳遞給它的值的動態型別。

示例

以下是一個示例 -

package main

import (
   "fmt"
   "reflect"
)

type Person struct {
   Name string
   Age  int
}

func main() {
   p := Person{Name: "John", Age: 30}
   t := reflect.TypeOf(p)
   fmt.Println(t)
}

輸出

main.Person

使用 "%T" 格式說明符

查詢結構體型別的另一種方法是使用 "%T" 格式說明符。此說明符可以與 fmt.Printf() 函式一起使用,以列印傳遞給它的值的型別。

示例

以下是一個示例 -

package main

import "fmt"
type Person struct {
   Name string
   Age  int
}

func main() {
   p := Person{Name: "John", Age: 30}
   fmt.Printf("Type of p: %T", p)
}

輸出

Type of p: main.Person

使用 "go/types" 包

Golang 中的 "go/types" 包提供了一種靜態檢查程式中型別的方法。此包對於分析 Go 程式碼和查詢程式中使用的結構體的型別特別有用。

示例

以下是一個示例 -

package main

import (
   "go/types"
   "golang.org/x/tools/go/packages"
   "fmt"
)

type Person struct {
   Name string
   Age  int
}

func main() {
   cfg := &packages.Config{Mode: packages.LoadAllSyntax}
   pkgs, _ := packages.Load(cfg, ".")
   for _, pkg := range pkgs {
      for _, file := range pkg.Syntax {
         for _, decl := range file.Decls {
            switch decl := decl.(type) {
               case *types.GenDecl:
                  for _, spec := range decl.Specs {
                     if ts, ok := spec.(*types.TypeSpec); ok {
                        if _, ok := ts.Type.(*types.Struct); ok {
                           fmt.Printf("Found struct %s\n", ts.Name())
                        }
                     }
                  }
            }
         }
      }
   }
}

此程式使用 "go/types" 包查詢當前包中使用的所有結構體。該程式首先載入包中的所有 Go 原始檔,然後遍歷每個檔案,查詢包含型別規範的宣告。如果找到型別規範,則程式檢查型別是否為結構體並列印其名稱。

結論

在本文中,我們討論了三種不同的方法來查詢 Golang 中結構體的型別。"reflect" 包提供了一種在執行時檢查型別的方法,而 "%T" 格式說明符可以用來列印值的型別。"go/types" 包對於分析 Go 程式碼和查詢程式中使用的結構體的型別特別有用。

更新於: 2023年5月5日

4K+ 瀏覽量

啟動您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.