為了區分自訂類型和預定義類型,我們可以使用兩種反射方法:
自訂類型將具有非空白套件路徑和非空白名稱。相反,預定義類型將具有空包路徑。
匿名結構類型:
匿名結構類型未命名,但可能有自訂類型的欄位。我們可以透過迭代結構體的欄位並檢查其中是否有自訂類型來檢查自訂類型。
映射類型:
映射類型可以具有自訂鍵或值類型。我們可以使用 Type.Elem() 查詢值類型,使用 Type.Key() 查詢鍵類型。
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 反射區分自訂類型和內建類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!