Почему не сопоставить [] интерфейс {} взять карту [] SpecificInterface - PullRequest
0 голосов
/ 18 декабря 2018

Состояние спецификации go:

Переменная типа интерфейса может хранить значение любого типа с набором методов, который является любым надмножеством интерфейса.

Таким образом, я могу

type Source interface{}
type SourceImpl struct{}

var s Source
g := new(interface{})
s = new(SourceImpl)

*g = s

Однако я не могу сделать то же самое с картами:

generic := make(map[string]*interface{})
specific := make(map[string]*Source)

generic = specific

дает:

cannot use specific (type map[string]*Source) as type map[string]*interface {} in assignment

Почему это так?Может ли карта определенных типов передаваться / назначаться карте общих типов без использования утверждения типа?

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Поскольку Go является языком статических типов, хотя интерфейс {} и Source имеют один и тот же базовый тип, они не могут быть назначены друг другу без преобразования.
Таким образом, вы должны выполнить преобразование в цикле:

generic := make(map[string]interface{})
specific := make(map[string]*Source)

for k, v := range specific {
    generic[k] = v
}

Вы заметили, что я изменил * interface {} на interface {}?Это еще одна проблема вашего кода, в Go указатель на интерфейс {} не имеет значения.

0 голосов
/ 14 февраля 2019

Не отвечая непосредственно на вопрос, похоже, что сообщество go постепенно начинает менять свое решение и начинает думать о поддержке генериков для Go2: https://go.googlesource.com/proposal/+/master/design/go2draft-generics-overview.md

0 голосов
/ 18 декабря 2018

Потому что map[]interface{} и map[]SpecificInterface - это 2 разных типа.Если вы сделаете свой универсальный тип пустым интерфейсом, он может работать.

var generic interface{}
specific := make(map[string]*Source)

generic = specific

Но если вы сделаете это, вам нужно будет выполнить переключение типа или утверждение типа, когда вы хотите работать с картой.

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