如何使用 reflect.Type 在 Golang 中将类型值传递给变量?

huangapple go评论168阅读模式
英文:

How to pass type value to a variable with the type reflect.Type Golang

问题

我需要创建一个StructField,在其中需要为Type字段传递reflect.Type值。我想要在用于构建StructField的函数中传递其他类型,比如reflect.Bool、reflect.Int。但是我无法使用下面的代码实现这一点:

reflect.StructField{
    Name: strings.Title(v.Name),
    Type: reflect.Type(reflect.String),
    Tag:  reflect.StructTag(fmt.Sprintf(`xml:"%v,attr"`, v.Name)),
}

因为它会报错:

无法将类型为'Kind'的表达式转换为类型'Type'

我该如何实现这个目标呢?

英文:

I need to create StructField, in which I need to pass reflect.Type value for the Type field. I would like to pass other types like reflect.Bool, reflect.Int to function which will be used in the construction of StructField. I cannot do this with the code below

reflect.StructField{
			Name: strings.Title(v.Name),
			Type: reflect.Type(reflect.String),
			Tag:  reflect.StructTag(fmt.Sprintf(`xml:"%v,attr"`, v.Name)),
		}

Because it

Cannot convert an expression of the type 'Kind' to the type 'Type'

How would I accomplish it?

答案1

得分: 5

reflect.Type 是一个类型,因此表达式

reflect.Type(reflect.String)

将是一个类型转换。reflect.String 的类型是 reflect.Kind,它不实现接口类型 reflect.Type,所以这个转换是无效的。

表示 stringreflect.Type 值是:

reflect.TypeOf("")

通常,如果你有一个值,可以使用 reflect.TypeOf() 函数获取任何(非接口)类型的 reflect.Type 描述符:

var x int64
t := reflect.TypeOf(x) // 类型 int64 的类型描述符

如果没有值,也可以从一个有类型的 nil 指针值开始,然后调用 Type.Elem() 来获取指向的类型:

t := reflect.TypeOf((*int64)(nil)).Elem()      // 类型 int64 的类型描述符

t2 := reflect.TypeOf((*io.Reader)(nil)).Elem() // 类型 io.Reader 的类型描述符
英文:

reflect.Type is a type, and so the expression

reflect.Type(reflect.String)

Would be a type conversion. Type of reflect.String is reflect.Kind which does not implement the interface type reflect.Type, so the conversion is invalid.

The reflect.Type value representing string is:

reflect.TypeOf("")

Generally the reflect.Type descriptor of any (non-interface) type can be acquired using the reflect.TypeOf() function if you have a value of it:

var x int64
t := reflect.TypeOf(x) // Type descriptor of the type int64

It's also possible if you don't have a value. Start from a typed nil pointer value, and call Type.Elem() to get the pointed type:

t := reflect.TypeOf((*int64)(nil)).Elem()      // Type descriptor of type int64

t2 := reflect.TypeOf((*io.Reader)(nil)).Elem() // Type descriptor of io.Reader

huangapple
  • 本文由 发表于 2021年5月27日 20:40:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/67722312.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定