nums := []int{2, 3, 4}
Что это значит? Я создаю массив или срез?Создание ломтика без знака
От этого: https://gobyexample.com/range, он говорит ломтик. Но я думаю, что это массив.
nums := []int{2, 3, 4}
Что это значит? Я создаю массив или срез?Создание ломтика без знака
От этого: https://gobyexample.com/range, он говорит ломтик. Но я думаю, что это массив.
В дороге, массив типы включают их длину. Поскольку вы опустили длину это срез:
array := [3]int{1, 2, 3} // Array since it includes length (3).
slice := array[:] // Slice since there is no length specified.
fmt.Printf("%#v - %T\n", slice, slice) // %T means "type".
fmt.Printf("%#v - %T\n", array, array)
// [3]int{1, 2, 3} - [3]int
// []int{1, 2, 3} - []int
В приведенном выше примере, мы сделали срез, не прибегая к «делать», установив его в полном диапазоне от array
. Если вы должны были отредактировать либо array
, либо slice
, то оба будут меняться, так как «срез» по существу представляет собой представление в хранилище, которое является «массивом».
slice[0] = 456 // And array[0] == 456
array[0] = 789 // And slice[0] == 789
Поскольку вы не указали длину, это фрагмент.
определение типа массива определяет длину и тип элемента: см «Go Slices: usage and internals»
Кусочек буквального объявляется так же, как массив буквального, за исключением того, вы выходите из счетчика элементов.
В то время как срез может быть создан с помощью встроенной функции, называемой make, вы использовали литерал для создания фрагмента.
Внутренняя часть созданного среза отличается от массива:
make([]byte, 5)
На самом деле, делая это:
nums := []int{2, 3, 4}
Вы создаете как: массив и кусочек. Но так как это slice literal, результат будет иметь тип среза, поэтому тип nums
является []int
, которые вы можете проверить с помощью этого кода:
fmt.Printf("%T", nums) // Output: []int
Что происходит, что массив будет создан/выделяется автоматически фон с длиной 3, инициализированный перечисленными элементами, и срез будет создан, ссылаясь на массив, и этот срез будет результатом выражения.
Цитирование из Go Language Specification: Composite literals:
Кусочек буквальным описывает весь основной массив буквального. Таким образом, длина и емкость литерального фрагмента - это максимальный индекс элемента плюс один.Кусочек буквальный имеет вид
[]T{x1, x2, … xn}
и является сокращение для операции среза применяется к массиву:
tmp := [n]T{x1, x2, … xn} tmp[0 : n]
Массив буквального также включает в себя длину, например:
arr := [3]int{1, 2, 3}
arr2 := [...]int{1, 2, 3} // Length will be computed by the compiler
fmt.Printf("%T", arr) // Output: [3]int
fmt.Printf("%T", arr2) // Output: [3]int