Как я могу получить пользовательский тип с помощью reflect?

#go #reflection #types

#Вперед #отражение #типы

Вопрос:

Определены следующие типы данных:

 type Status int
type RealStatus Status
  

Есть ли способ перейти от RealStatus типа к Status типу с помощью отражения?

Комментарии:

1. Да, это возможно, но вы все равно можете получить interface{} значение только из reflection, чтобы использовать его как Status , вам понадобится утверждение типа. Учитывая это, вы могли бы просто использовать простое преобразование типов в первую очередь. Что вы хотите решить?

2. Нет, невозможно получить один тип из другого. Единственная связь между RealStatus Status типами и во время выполнения заключается в том, что они имеют один и тот же базовый тип int . Можно конвертировать значения этих типов, как показано в ответе @icza.

3. @MuffinTop спасибо. Ваш ответ мне очень помог

Ответ №1:

Да, это возможно, если вы хотите получить Status значение из RealStatus значения, используя отражение; вы можете использовать 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):

 main.Status 1
  

Обратите внимание, что вы можете получить interface{} значение только из отражения, поэтому, чтобы использовать его в качестве Status значения, вам все равно нужно утверждение типа. Учитывая это, вы могли бы просто использовать простое преобразование типов в первую очередь, как в этом примере:

 rs := RealStatus(1)

var s Status
s = Status(rs)

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

Который выдает то же самое (попробуйте это на игровой площадке Go), и у него есть то преимущество, что s он имеет статический тип Status .

Ответ №2:

Нет, невозможно получить один тип из другого. Единственная связь между RealStatus Status типами и заключается в том, что они имеют один и тот же базовый тип int .

Можно конвертировать значения этих типов, как показано в ответе @icza.