Ошибки утверждения типа при приведении от интерфейса к фактическому объекту

Обнаружение ошибок утверждения типа в приведенном ниже примере.

Ошибки:

49: невозможно преобразовать z (тип IZoo) в тип Zoo: требуется утверждение типа

49: нельзя назначить Zoo(z).animals

type IAnimal interface {}

type IZoo interface {}

type Zoo struct {
    animals map[string]IAnimal
}

func NewZoo() *Zoo {
    var z IZoo = &Zoo{}

    Zoo(z).animals = map[string]IAnimal{} // cannot convert z (type IZoo) to type Zoo: need type assertion
    
    return z // cannot use z (type IZoo) as type *Zoo in return argument: need type assertion
}

person user2727195    schedule 11.03.2017    source источник


Ответы (1)


Сообщение об ошибке говорит само за себя: вам нужно утверждение типа.

y := z.(Zoo)
y.animals = map[string]IAnimal{}
person Zoyd    schedule 11.03.2017
comment
не могли бы вы сделать это в одну строку, нам нужно отдельное объявление и присваивание - person user2727195; 12.03.2017
comment
@user2727195 user2727195 z.(Zoo).animals = как вы думаете, что должно делать это выражение? Что он делает — создает временный объект, который нужно выбросить после этого оператора. Отсюда вопрос: что значит присвоить значение полю объекта, к которому у вас не будет доступа? По сути, вы можете удалить эту строку, и наблюдаемое поведение программы не изменится. - person zerkms; 12.03.2017
comment
@zerkms есть ли в документах объяснение этого временного объекта? - person user2727195; 12.03.2017
comment
Я не уверен. Это общее знание — структуры в Go копируются по назначению. - person zerkms; 12.03.2017
comment
чтобы уточнить, все в Go является копией по назначению. - person JimB; 12.03.2017