使用Reflect 辨識非內建型別
問題:
問題:區分byte 和類型A []byte 使用反射是一個常見的挑戰。我們如何在不依賴已定義的類型清單來檢查的情況下區分這些類型?
簡介:
模式背景:理解 Go 中類型的分類至關重要。有兩個主要類別:命名類型和未命名類型。命名類型是使用 type 關鍵字聲明的,而未命名類型是使用類型文字建立的。預先聲明的類型,例如 int 和 string,也可以立即使用。
使用Type.Name() 和Type.PkgPath():Type.Name () 傳回命名類型的名稱,而Type.PkgPath() 傳回命名類型和預聲明類型的包路徑。這允許我們將未命名類型(空 Type.Name())與命名和預聲明類型分開。
特殊情況:匿名結構類型和映射類型需要特別考慮。匿名結構類型可以包含自訂類型的字段,因此我們必須使用 Type.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(int(2)))) // false fmt.Println(isCustom(reflect.TypeOf(A{}))) // true fmt.Println(isCustom(reflect.TypeOf(map[K]int{}))) // true我們可以使用各種類型來測試isCustom()函數:
以上是我們如何在沒有類型清單的情況下使用反射來識別 Go 中的非內建類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!