В приведенном ниже коде:
s4 := []int{0, 1, 2, 3, 4, 5}
sp4 := &s4
sp5 := &((*sp4)[1:])
Я хочу получить указатель на часть s4[1:] как s5, но это вызывает ошибку:
cannot take the address of (*sp4)[1:]
Но если я напишу так:
s4 := []int{0, 1, 2, 3, 4, 5}
sp4 := &s4
s5 := (*sp4)[1:]
sp5 := &s5
Оно работает!
Я сделал несколько тестов и обнаружил, что когда я меняю *sp5, s4 меняется как while. Это то, что мне просто нужно.
А Зачем я не могу написать sp5 := &((*sp4)[1:])?
Это: (*sp4)[1:] является выражением среза, результатом которого является значение среза. Это значение может не иметь адреса памяти, поскольку оно не находится в переменной, оно может просто находиться в регистрах процессора, пока вы не сохраните его в переменной. Чтобы дать компилятору свободу хранить его там, где он видит лучше, спецификация не позволяет брать его адрес.





Некоторые вещи в Go буквально неадресуемый: вы просто не можете взять их адрес, потому что спецификация языка запрещает.