Назначение фрагментов эквивалентных типов не работает - PullRequest
0 голосов
/ 20 ноября 2018

Почему это не работает?

package main

type Word uint8
type Memory []Word

func main() {
    bytes := []uint8{}
    memory := Memory{}
    bytes = memory
}

Компилятор генерирует эту ошибку:

9:9: cannot use memory (type Memory) as type []byte in assignment

Насколько я понимаю, []uint8 и Memory должны быть взаимно назначаемыми.

1 Ответ

0 голосов
/ 20 ноября 2018

Вот правила присвоения

В данном конкретном случае ни один из них не удерживается, поэтому типы нельзя назначать.

Учитывая, что вы упомянули, этот ответ недостаточно подробен - давайте разберем все правила присваивания: (для простоты давайте используем A вместо []uint8 и B вместо []Word)

  • тип x идентичен T. --- Нет, A не идентичен B
  • Типы x и V имеют идентичные базовые типы, и по крайней мере один из V или T не является определенным типом. --- Нет, оба являются определенными типами
  • T - это тип интерфейса, а x реализует T. --- Ни один из них не является интерфейсом
  • x - это значение двунаправленного канала, T - тип канала, x-типы V и T имеют идентичные типы элементов, и, по крайней мере, один из V или T не является определенным типом. --- Ни один из них не является каналом
  • x - это предварительно объявленный идентификатор nil, а T - указатель, функция, срез, карта, канал или тип интерфейса. --- Ни один из них не имеет nil значения
  • x является нетипизированной константой, представляемой значением типа T. --- Нет, константы не включены

Итак, как вы можете видеть - нет никакого способа, которым A можно присвоить B.

Если вы объявите Память как type Memory []uint8, она будет работать (как упомянуто в комментариях @ RayfenWindspear ), но я уверен, что корни вопроса скорее в том, «почему», а не «как исправить».

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