首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >切片数组- GO

切片数组- GO
EN

Stack Overflow用户
提问于 2017-01-28 06:49:24
回答 2查看 922关注 0票数 3

1)

下面的切片声明,

代码语言:javascript
复制
var a [][3]string

创建一个单片(a),指向由3个字符串( len(a) = 3cap(a) =3,而不是cap(a) >= 3 )组成的数组

代码语言:javascript
复制
a = make([][3]string, 5)

创建5个切片,每个切片(例如a[0])指向由3个字符串、len(a[0]) = 3cap(a[0]) = 3组成的数组。

2)

对于切片声明,

代码语言:javascript
复制
var b [][3][6]string

创建一个单片(b),它指向每个6个字符串的3个数组,其中len(b) = 3cap(b) =3

代码语言:javascript
复制
b = make([][3][6]string, 5)

创建5个切片,其中每个切片(例如b[0])指向每个6个字符串的3个数组

在这两种情况下,在制作切片之后,我说,创建了5个切片,

考虑到语法,下面是我的两个问题,

代码语言:javascript
复制
a = make([][3]string, 5)

我的问题:

1)

每片(a[0])是由3个字符串组成的数组,它是5个切片吗?

它是否是一个单片(a),指向5个数组,每个数组包含3个字符串?

2)

我如何知道元素的类型?切片还是阵列?

1)在这种情况下,必须谨慎使用“一系列”术语。

2)与C不同,GO中没有隐含的指针。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-28 06: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个字符串组成

不是的。以前的代码只是声明了一个变量,它还不包含一个片段。后一种代码用五个元素创建一个切片。

票数 2
EN

Stack Overflow用户

发布于 2017-01-28 08:06:34

片和数组是两种不同的类型:内存中的数组是同一类型的值的连续序列。在Go中,类型的大小是固定的。同样的概念也存在于C++和

代码语言:javascript
复制
int x[5]; // C and C++
x [5]int  // Go

基本上是一样的(不是100%相同,因为C和C++中的数组是“二等公民”,在一些地方表现得很奇怪,Go在这一点上更统一)。

相反,Go中的片是数组的一部分的“视图”,它或多或少地等价于具有指向第一个元素的指针的C++结构、多个已使用的元素(相对于第一个)和许多可用的元素(相对于第一个)。

代码语言:javascript
复制
// C++
template<typename T>
struct Slice {
    T *first;
    int size, capacity;
};
Slice<int> x{nullptr, 0, 0};

// Go
var x []int

Make特殊函数能够创建与新创建的数组相关联的片,给定大小和可选容量:

代码语言:javascript
复制
// 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只用于创建切片(和映射),而不是用于数组.

代码语言:javascript
复制
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}}

例如,yz 在操场上在使用fmt.Println时看起来都是相同的[[1, 2], [3, 4], [5, 6]],但是它们是非常不同的类型,例如,您可以向y添加一个新的对

代码语言:javascript
复制
y = append(y, [2]int{7, 8})  // now [[1, 2], [3, 4], [5, 6], [7, 8]]

您可以使用以下方法来增加z的第一个元素的长度

代码语言:javascript
复制
z[0] = append(z[0], 99) // now [[1, 2, 99], [3, 4], [5, 6]]

但是不能向z添加新元素(它是一个数组),也不能扩展y的元素(因为元素是数组)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41907150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档