首页 > 后端开发 > Golang > 如何使用 Go 的'reflect”包区分内置类型和自定义类型?

如何使用 Go 的'reflect”包区分内置类型和自定义类型?

Barbara Streisand
发布: 2024-12-28 20:24:10
原创
262 人浏览过

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
}
登录后复制

测试

将此应用于各种types:

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板