使用反射來辨識非內建類型
問題:
問題:區分[]by A []byte 使用反射證明具有挑戰性Reflect.TypeOf(A{}).Kind指示兩者都是位元組切片。有必要找到一種方法來區分這些類型,而不依賴預先定義的類型清單。
背景:Go 中的類型可以分類為命名 (使用類型名稱)或未命名(使用類型文字)。預先宣告的型別(如 string 或 int)是命名的,而使用型別文字(如 []int 或 struct{i int})所建立的型別是未命名的。
解決方案:
使用Type.PkgPath():Type.PkgPath() 提供類型命名的包路徑。對於預先聲明或未命名的類型,此路徑將為空。因此,可以透過檢查 Type.PkgPath() 是否傳回非空字串來識別非內建類型。
處理從自訂類型派生的未命名類型:if elem := t.Elem(); elem.Kind() == reflect.Ptr || elem.Kind() == reflect.Struct { // Recursively check elem }
將類型文字與自訂類型一起使用可能會導致未命名類型(例如,[]A )。若要確定未命名類型是否衍生自自訂類型,請使用Type.Elem() 檢查元素類型:
映射類型: 檢查映射的鍵和值類型。
範例實作:func isCustom(t reflect.Type) bool { if t.PkgPath() != "" { return true } // Handle special cases and recursion for unnamed types return false }
下面的程式碼定義了一個實用函數isCustom 來辨識非內建的型別:
fmt.Println(isCustom(reflect.TypeOf(""))) // false (builtin) fmt.Println(isCustom(reflect.TypeOf(A{}))) // true (custom)測試解決方案:
以上是我們如何使用反射來區分 Go 中的內建類型和自訂類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!