Как привести структуру к базовому типу, а не к непосредственному типу в Go? - PullRequest
0 голосов
/ 23 сентября 2018

Мне нужно привести интерфейс неизвестного непосредственного типа к известному базовому типу.

Пример

package main

import (
    "fmt"
    "reflect"
)

type A struct {
    foo string
}

type B A

func main() {
    bS := B{foo: "foo"}
    bI := reflect.ValueOf(bS).Interface()
    fmt.Println(bI)

    aS := bI.(A)
    fmt.Println(aS)
}

Когда этот код выполняется, он, понятно, паникует со следующимсообщение

panic: interface conversion: interface {} is main.B, not main.A

В этом примере:

  • тип B неизвестен коду, получающему интерфейс bI
  • тип B гарантированно является псевдонимом для типаА, который известен.

Редактировать : я не могу использовать псевдонимы типов здесь, потому что это означает, что тип B станет просто еще одним способом записи типа A, поэтому япотерял бы все пользовательские методы, которые я определил для типа B.

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

единственный способ, которым я знаю, чтобы перейти к первой структуре, это aS := A(bI.(B)) - это обратить процесс вспять.Надеюсь, это поможет

0 голосов
/ 23 сентября 2018

Вы можете решить это с помощью type aliasing (выпущено в Go1.9).

package main

import (
    "fmt"
    "reflect"
)

type A struct {
    foo string
}

type B = A

func main() {
    bS := B{foo: "foo"}
    bI := reflect.ValueOf(bS).Interface()
    fmt.Println(bI)

    aS := bI.(A)
    fmt.Println(aS)
}

NB type B = A делает так, что приведение будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...