#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.