【问题标题】:How can I get custom type with reflect?如何使用反射获得自定义类型?
【发布时间】:2021-01-16 08:38:28
【问题描述】:

定义了以下数据类型:

type Status int
type RealStatus Status

有没有办法通过反射从RealStatus 类型转换为Status 类型?

【问题讨论】:

  • 是的,这是可能的,但你仍然只能从反射中得到一个interface{} 值,将其用作Status,你需要一个类型断言。鉴于此,您可以首先使用简单的类型转换。你想解决什么问题?
  • 不,不可能从另一种类型中获取一种类型。 RealStatusStatus 类型在运行时之间的唯一关系是它们共享相同的底层类型 int。可以在这些类型的值之间进行转换,如@icza 的答案所示。
  • @MuffinTop 谢谢。你的回答对我帮助很大

标签: go reflection types


【解决方案1】:

是的,如果您的意思是使用反射从 RealStatus value 中获取 Status value 是可能的;您可以为此使用Value.Convert(),例如:

type Status int
type RealStatus Status

rs := RealStatus(1)

st := reflect.TypeOf(Status(0))

var i interface{}
i = reflect.ValueOf(rs).Convert(st).Interface()

fmt.Printf("%T %v", i, i)

这将输出(在Go Playground 上尝试):

main.Status 1

请注意,您只能从反射中获取interface{} 值,因此要将其用作Status 值,您仍然需要type assertion。鉴于此,您可以首先使用简单类型 conversion,如下例所示:

rs := RealStatus(1)

var s Status
s = Status(rs)

fmt.Printf("%T %v", s, s)

哪个输出相同(在Go Playground上试试),它的优点是s有静态类型Status

【讨论】:

    【解决方案2】:

    不,不可能从另一种类型中获取一种类型。 RealStatusStatus 类型之间的唯一关系是它们共享相同的底层类型 int

    如@icza 的回答所示,可以在这些类型的值之间进行转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-24
      • 2013-10-24
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      相关资源
      最近更新 更多