1)
下面的切片声明,
var a [][3]string
创建一个单片(a
),指向由3个字符串( len(a) = 3
和cap(a) =3
,而不是cap(a) >= 3
)组成的数组
a = make([][3]string, 5)
创建5个切片,每个切片(例如a[0]
)指向由3个字符串、len(a[0]) = 3
和cap(a[0]) = 3
组成的数组。
2)
对于切片声明,
var b [][3][6]string
创建一个单片(b
),它指向每个6个字符串的3个数组,其中len(b) = 3
和cap(b) =3
b = make([][3][6]string, 5)
创建5个切片,其中每个切片(例如b[0]
)指向每个6个字符串的3个数组
在这两种情况下,在制作切片之后,我说,创建了5个切片,
考虑到语法,下面是我的两个问题,
a = make([][3]string, 5)
我的问题:
1)
每片(a[0]
)是由3个字符串组成的数组,它是5个切片吗?
或
它是否是一个单片(a
),指向5个数组,每个数组包含3个字符串?
2)
我如何知道元素的类型?切片还是阵列?
1)在这种情况下,必须谨慎使用“一系列”术语。
2)与C不同,GO中没有隐含的指针。
发布于 2017-01-27 22:59:18
1)考虑到语法, A=make(字符串,5) 每片(A)是由3个字符串组成的数组,它是5个切片吗? 或 它是一个单片(A)指向5个数组,每个数组有3个字符串吗?
它是一个包含5个元素的单个切片,其中每个元素都是一个由3个字符串组成的数组。
2) 我如何知道元素的类型?切片还是阵列?
切片和数组是不同的类型。不能将数组和切片替换为同一个变量,因此,如果声明将其声明为数组,则为数组,如果声明为片,则为片。如果括号([5]string
)中有一个数字,则为一个数组,如果括号为空([]string
),则为一个片。
2)切片声明, 变量b6字符串 创建一个单片(B),指向每个6个字符串的3个数组,其中len(b) =3,cap(b) =3 B=make(6 6string,5) 创建5个切片,其中每个切片(例如b)指向3个数组,每个数组由6个字符串组成
不是的。以前的代码只是声明了一个变量,它还不包含一个片段。后一种代码用五个元素创建一个切片。
发布于 2017-01-28 00:06:34
片和数组是两种不同的类型:内存中的数组是同一类型的值的连续序列。在Go中,类型的大小是固定的。同样的概念也存在于C++和
int x[5]; // C and C++
x [5]int // Go
基本上是一样的(不是100%相同,因为C和C++中的数组是“二等公民”,在一些地方表现得很奇怪,Go在这一点上更统一)。
相反,Go中的片是数组的一部分的“视图”,它或多或少地等价于具有指向第一个元素的指针的C++结构、多个已使用的元素(相对于第一个)和许多可用的元素(相对于第一个)。
// C++
template<typename T>
struct Slice {
T *first;
int size, capacity;
};
Slice<int> x{nullptr, 0, 0};
// Go
var x []int
Make
特殊函数能够创建与新创建的数组相关联的片,给定大小和可选容量:
// C++
template<typename T>
Slice<T> make(int size, int capacity=-1) {
if (capacity == -1) capacity = size;
return Slice<T>{new T[capacity], size, capacity};
}
// Go
x := Make([]int, size, capacity)
切片可以有效地在O(1)中传递(独立于大小/容量),您也可以在O(1)中取片的子片。注意,Go是垃圾收集的,在C++中做同样的工作需要一些额外的工作(例如,也要在片中保留一个指向原始数组对象及其大小的指针)。
当然,您可以有切片数组、切片数组、数组数组和数组数组。但是请注意,在Go中,Make
只用于创建切片(和映射),而不是用于数组.
x := Make([][2]int, 3) // a slice of 3 arrays of 2 ints each
// Same thing (except for content)
y := [][2]int{[2]int{1, 2},
[2]int{3, 4},
[2]int{5, 6}}
// An array of 3 slices of two ints each
z := [3][]int{[]int{1, 2},
[]int{3, 4},
[]int{5, 6}}
例如,y
和z
在操场上在使用fmt.Println
时看起来都是相同的[[1, 2], [3, 4], [5, 6]]
,但是它们是非常不同的类型,例如,您可以向y
添加一个新的对
y = append(y, [2]int{7, 8}) // now [[1, 2], [3, 4], [5, 6], [7, 8]]
您可以使用以下方法来增加z
的第一个元素的长度
z[0] = append(z[0], 99) // now [[1, 2, 99], [3, 4], [5, 6]]
但是不能向z
添加新元素(它是一个数组),也不能扩展y
的元素(因为元素是数组)
https://stackoverflow.com/questions/41907150
复制相似问题