Почему мы не можем вставлять фрагменты или карты в Go структуры - PullRequest
0 голосов
/ 09 апреля 2020

Я узнал, что нельзя встраивать фрагменты или карты в Go структуры. Но я нашел два обходных пути к этому:

  1. Объявите фрагмент или карту вне структуры и внедрите его в структуру

    var mySlice []int
    
    type myStruct struct {
      mySlice
    }
    
  2. I я не совсем понимаю этот второй обходной путь, но я обнаружил, что он называется Composition, и это делается путем простого пропуска ключевого слова var при объявлении среза или карты в структуре

    type myStruct struct {
      mySlice []int
    }
    

Мой первый Вопрос в том, может ли кто-нибудь объяснить, почему мы не можем напрямую встраивать фрагменты и карты в структуру?

Второй вопрос: при использовании второго временного решения, есть ли какое-либо отрицательное влияние на производительность?

Третий вопрос: почему первый и второй обходные пути работают?

1 Ответ

3 голосов
/ 09 апреля 2020

Spe c: Типы структур:

Поле, объявленное с типом, но без явного имени поля, называется встроенным полем . Встроенное поле должно быть указано как имя типа T или как указатель на имя типа, не являющееся интерфейсом *T, а само T не может быть указателем типа. Неквалифицированное имя типа действует как имя поля.

Нельзя встраивать тип, такой как map[int]string, это анонимный тип. Spe c требует имя типа . Даже если бы вы могли встраивать это, оно содержит скобки, которые могли бы сделать его недопустимым в качестве идентификатора, и опять же, spe c говорит, что имя неквалифицированного типа действует как имя поля .

Просто создайте для него новый тип, который затем можно будет встроить:

type mymap map[int]string

type s struct {
    mymap
}

Когда вы встраиваете тип в структуру, вы опускаете имя поля. Во второй попытке:

type myStruct struct {
    mySlice []int
}

Вы не пропустили имя поля (это mySlice), поэтому это не встраивание, это обычное именованное поле.

...