2015-03-31 3 views

ответ

3

В дороге, массив типы включают их длину. Поскольку вы опустили длину это срез:

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 
4

Поскольку вы не указали длину, это фрагмент.

определение типа массива определяет длину и тип элемента: см «Go Slices: usage and internals»

http://blog.golang.org/go-slices-usage-and-internals_slice-array.png

Кусочек буквального объявляется так же, как массив буквального, за исключением того, вы выходите из счетчика элементов.

В то время как срез может быть создан с помощью встроенной функции, называемой make, вы использовали литерал для создания фрагмента.

Внутренняя часть созданного среза отличается от массива:

make([]byte, 5) 

http://blog.golang.org/go-slices-usage-and-internals_slice-1.png

4

На самом деле, делая это:

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