По моему мнению, это связано с путаницей из-за использования функций new
и make
.Это известная проблема / особенность языка Go, о чем свидетельствуют несколько дискуссий о new
против make
при golang-nuts .
Разница между new
и make
может стать более ясным, если позволить Go распечатать тип значения, созданного new
и make
:
package main
import "fmt"
func main() {
fmt.Printf("%T %v\n", new([10]int), new([10]int))
fmt.Printf("%T %v\n", make([]int, 10), make([]int, 10))
}
Вывод:
*[10]int &[0 0 0 0 0 0 0 0 0 0]
[]int [0 0 0 0 0 0 0 0 0 0]
Как видноиз типа для доступа к элементу массива new([10]int)
нам сначала нужно разыменовать указатель.
И new
, и make
требуют тип Go в качестве 1-го аргумента.Однако выражение [elems]int
является , а не типом Go (если elems
не является константой Go, что здесь не так).
Для получения дополнительной информации см. http://golang.org/doc/go_spec.html#Allocation и http://golang.org/doc/go_spec.html#The_zero_value.
Чтобы лучше понять, можно ли использовать результат new
, может быть полезно проверить, работают ли len
и cap
с нулем (ноль)значения: http://golang.org/doc/go_spec.html#Length_and_capacity