Почему указатель на фрагмент фрагмента строки не поддерживает синтаксис p [0]?
Потому что указатель на фрагмент (чего угодно) не является типом, определяемым языком для поддержки индексации. Вот SPE c:
Первичное выражение формы a[x]
обозначает элемент массива, указатель на массив, срез, строку или отображение, индексированный x. Значение x называется индексом или ключом карты соответственно. Применяются следующие правила:
Источник: https://golang.org/ref/spec#Index_expressions
Он продолжается и явно определяет, как работает индексирование для каждого из поддерживаемых типов, и заканчивается говоря, что В противном случае [x] является незаконным.
Итак, в основном вы пытаетесь сделать что-то, что язык не позволяет .
Что касается того, почему, и говоря немного о вашем дизайне, указатели на фрагменты редко имеют смысл .
Во-первых, когда вы передаете фрагмент, объем перемещаемых данных абсолютно минимален (это просто заголовок фрагмента, который обычно составляет дюжину байтов), поэтому нет видимого выигрыша по сравнению с передачей указателя.
Затем в ваших комментариях в вопросе, который вы говорите , «выглядит как лучшая абстракция для предоставления указателя на тип Poem.» Это действительно зависит от того, что вы хотите делать с типом Poem
. С учетом тех немногих деталей, которые вы указали, я бы сказал, что на самом деле передача *Poem
, а не просто Poem
, - худший вариант дизайна, поскольку вы ничего не получаете с указателем и фактически усложняете ситуацию. Например, вы не можете использовать индексацию (p[0]
) ...
В комментарии к этому автоответчику вы спросили: видите ли вы [][]string{...}
переход к NewPoem()
хороший подход? .
Как я уже упоминал в комментарии, у нас не так много деталей, поэтому трудно сказать. Но в настоящее время вы можете сделать это, чтобы создать Poem
:
p := poetry.Poem{
{
"And from my pillow, looking forth by light",
"Of moon or favoring stars, I could behold",
"The antechapel where the statue stood",
"Of Newton, with his prism and silent face,",
"The marble index of a mind forever",
"Voyaging through strange seas of thought, alone.",
},
{
"inducted into Greek and Christian",
"modes of thinking, must take a longer way around.",
"Like children born into love, they exult in the here",
"who have felt separation and grave misgivings, they",
"and of humanity, and of God. Great literature, like",
"struggles to reconcile suffering with faith in the ",
},
}
fmt.Printf("%T\n", p[0])
Нет необходимости в циклах или добавлении, или функции NewPoem
или чего-либо еще для создания стихотворения непосредственно из строк. Просто используйте тип Poem{...}
напрямую!
Если вам нужно сделать что-то другое, например, создать стихотворение путем чтения данных, скажем, из файла, вы можете вместо этого создать такую функцию:
package poetry
func ReadFrom(rd io.Reader) Poem { ... }
Но для простого создания Поэмы непосредственно в коде нет необходимости усложнять вещи.