首頁 > 後端開發 > Golang > 如何使用 Go 的'reflect”套件區分內建類型和自訂類型?

如何使用 Go 的'reflect”套件區分內建類型和自訂類型?

Barbara Streisand
發布: 2024-12-28 20:24:10
原創
264 人瀏覽過

How Can I Distinguish Between Built-in and Custom Types Using Go's `reflect` Package?

使用Reflect 識別非內建類型

挑戰

您需要區分使用反射包從您需要區分[]byte 取得類似類型A []byte 的類型。 Reflect.TypeOf(A{}).Kind 傳回兩種類型的 Slice,這使得辨別它們變得困難。

型別背景

  • 命名型別是使用型別宣告定義(例如,型別 MyInt int)。
  • 未命名型別是型別文字(例如,[]int、struct{i int})。
  • 預聲明類型(例如 string、int)可立即使用。

方法

使用反射的方法type:

  • Name():傳回命名類型的名稱;未命名類型類型的名稱;未命名類型為空。
  • PkgPath():傳回命名類型的包路徑;對於預先聲明或未命名的類型為空。
  • Elem():傳回陣列、通道、映射、指標和切片的元素類型。

特殊情況

  • 匿名結構類型:迭代欄位並檢查自訂類型。
  • 映射類型:檢查鍵和值類型。

實作

func isCustom(t reflect.Type) bool {
    if t.PkgPath() != "" {
        return true
    }

    if k := t.Kind(); k == reflect.Array || k == reflect.Chan || k == reflect.Map ||
        k == reflect.Ptr || k == reflect.Slice {
        return isCustom(t.Elem()) || k == reflect.Map && isCustom(t.Key())
    } else if k == reflect.Struct {
        for i := t.NumField() - 1; i >= 0; i-- {
            if isCustom(t.Field(i).Type) {
                return true
            }
        }
    }

    return false
}
登入後複製

測試

將此應用於各種類型:

fmt.Println(isCustom(reflect.TypeOf("")))                // false
fmt.Println(isCustom(reflect.TypeOf(int(2))))            // false
fmt.Println(isCustom(reflect.TypeOf([]int{})))           // false
fmt.Println(isCustom(reflect.TypeOf(struct{ i int }{}))) // false
fmt.Println(isCustom(reflect.TypeOf(&i)))                // false
fmt.Println(isCustom(reflect.TypeOf(map[string]int{})))  // false
fmt.Println(isCustom(reflect.TypeOf(A{})))               // true
fmt.Println(isCustom(reflect.TypeOf(&A{})))              // true
fmt.Println(isCustom(reflect.TypeOf([]A{})))             // true
fmt.Println(isCustom(reflect.TypeOf([][]A{})))           // true
fmt.Println(isCustom(reflect.TypeOf(struct{ a A }{})))   // true
fmt.Println(isCustom(reflect.TypeOf(map[K]int{})))       // true
fmt.Println(isCustom(reflect.TypeOf(map[string]K{})))    // true
登入後複製

將此應用於各種🎜>

這示範了使用反射包有效區分內建類型和自訂類型的能力。

以上是如何使用 Go 的'reflect”套件區分內建類型和自訂類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板