Что вам не хватает, так это то, что при нарезке массива операнд должен быть адресуемым ([0]int
- это массив, а не срез). И возвращаемые значения вызовов функций не адресуемы. Подробнее см. Как сохранить ссылку на результат операции в Go? ; и "не может получить адрес" и "не может вызвать метод указателя на" .
Spec: выражения среза:
Если нарезанный операнд является массивом, он должен быть адресуемым , а результатом операции среза будет срез с тем же типом элемента, что и массив.
В этом выражении:
getSlice()[:]
getSlice()
возвращает массив , и, поскольку он является результатом вызова функции, он не адресуется. Поэтому вы не можете нарезать его.
В этом выражении:
getString()[:]
getString()
возвращает значение string
, поэтому его можно разрезать, даже если это значение не адресуемое. Это разрешено, потому что результатом выражения среза будет другое string
, а значения string
в Go являются неизменяемыми.
Кроме того, переменные адресуемые , так что это всегда будет работать:
var a = getSlice()
fmt.Println(a[:])