Меня очень смутило и заинтересовало значение «двух слов», связанное с массивом string в Go.
Например:
var strings [5]string
strings[0] = "Apple"
strings объявлен, и при присвоении другого string это будет копируемое значение из двух слов.
Может ли кто-нибудь помочь мне понять, что здесь означает «два слова»? И если есть/есть ресурсы, на которые я могу равняться, это будет большим подспорьем.
«Слово» — это технический термин, обозначающий 8 байт (на 32-битном оборудовании — 4 байта). Фактическое оборудование работает (часто) с вещами размером в слово, такими как целые числа или указатели. Итак, «два слова» означают 16 байт. Первые 8 — длина, а вторые 8 — адрес фактического содержимого строки.



Как упоминал @freeman, в golang строка представляет собой структуру данных из двух слов, одно из которых является указателем на фактическое место строкового значения, а другое — это длина, определяющая количество символов этой строки. Поэтому, когда вы назначаете вот так:
strings[0] = "Apple"
на самом деле вы присваиваете этой строке значение из двух слов. Если вы не хотите копировать два слова, вам придется работать с указателями:
var strings [5]*string
apple := "Apple"
strings[0] = &apple
Итак, вы просто копируете указатель на строку, и если вы измените значение элемента strings[0], сама строка будет изменена. Если вас интересует реализация строк в go, вот хорошее объяснение.
строка в Go представлена как структура данных из двух слов, первое слово содержит указатель на базовые символьные данные, а второе слово содержит длину строки, и когда вы присваиваете строковое значение элементу массива, все значение из двух слов копируется в этот элемент, это означает, что копируются как указатель на символьные данные, так и длина. Следовательно, изменение строкового значения в одном элементе массива не влияет на строковое значение в других элементах!