Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >切片数组- GO

切片数组- GO
EN

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

1)

下面的切片声明,

代码语言:javascript
运行
AI代码解释
复制
var a [][3]string

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

代码语言:javascript
运行
AI代码解释
复制
a = make([][3]string, 5)

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

2)

对于切片声明,

代码语言:javascript
运行
AI代码解释
复制
var b [][3][6]string

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

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

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

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

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

代码语言:javascript
运行
AI代码解释
复制
a = make([][3]string, 5)

我的问题:

1)

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

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

2)

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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个字符串组成

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

票数 2
EN

Stack Overflow用户

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

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

代码语言:javascript
运行
AI代码解释
复制
int x[5]; // C and C++
x [5]int  // Go

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

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

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

// Go
var x []int

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

代码语言:javascript
运行
AI代码解释
复制
// 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
运行
AI代码解释
复制
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
运行
AI代码解释
复制
y = append(y, [2]int{7, 8})  // now [[1, 2], [3, 4], [5, 6], [7, 8]]

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

代码语言:javascript
运行
AI代码解释
复制
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

复制
相关文章
Go 数组&切片
在开始介绍切片之前需要先介绍一下 go 中的数组。数组是一块连续的存储空间, 定义了存储的类型和长度。下面是是声明长度为 3 的 int 数组, 初始值为 0. 数组可以直接用来比较, 当元素相同时, 返回 ture. 对于数组越界访问, 直接会编译报错.
王小明_HIT
2023/07/08
2270
Go 数组&切片
Go数组和切片
数组是否可比较,取决于数组中的元素是否可以比较。如果数组中的元素可以比较我们可以直接通过==操作符来比较两个数组是否相等。
一行舟
2022/08/25
3170
Go之数组/切片
在Go中,数组的长度是固定的,创建后不可修改。所以一般情况下用切片比较 方便。切片的长度是可变的,比较好用。
ACK
2020/01/14
6200
go数组和切片
package main import( "fmt" ) func main(){ //数组定义 //数组是Go语言编程中最常用的数据结构之一。顾名思义,数组就是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素( element),一个数组包含的元素个数被称为数组的长度。是值类型。 //数组有3种创建方式:[length]Type 、[N]Type{value1, value2, ... , valueN}、[...]Type{value1, value2, ... , valueN} arr1 := [5] int {1,2,3,4,5} //创建数组大小为5 arr2 := [5] int {1,2} //创建数组大小为5,但是内容没写的用0替代了 arr3 := [...] int {1,2,3,5} //数组未定义长度 arr4 := [5] int {2:4,3:5,4:3} //数组有key value arr5 := [...] int {2:3,4:5} //数组长度未定义,并且是key,value形式 arr6 := [...] string{"my girl","my lift"} arr5[1] = 99 //arr5[6] = 88 这是错误的赋值方式,数组不支持最大的key进行赋值。 fmt.Println(arr1,arr2,arr3,arr4,arr5,arr6) arr := [...] int {11,12,13,14,15,16} //切片的定义 //Go语言中,切片是长度可变、容量固定的相同的元素序列。Go语言的切片本质是一个数组。容量固定是因为数组的长度是固定的,切片的容量即隐藏数组的长度。长度可变指的是在数组长度的范围内可变。 //Go语言提供了数组切片( slice)这个非常酷的功能来弥补数组的不足。初看起来,数组切片就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是个指针。数组切片的数据结构可以抽象为以下3个变量: 一个指向原生数组的指针; 数组切片中的元素个数; 数组切片已分配的存储空间。 //切片的创建有4种方式:1)make ( []Type ,length, capacity ) 2) make ( []Type, length) 3) []Type{} 4) []Type{value1 , value2 , ... , valueN } // s := [] int {1,2,3} 直接初始化切片,[]表示是切片类型,{1,2,3}初始化值依次是1,2,3.其cap=len=3 s1 := [] int {1,2,3} // s := arr[:] 初始化切片s,是数组arr的引用 s2 := arr[:] // s := arr[startIndex:endIndex] 将arr中从下标startIndex到endIndex-1 下的元素创建为一个新的切片 s3 := arr[0:2] // s:= arr[startIndex:] 缺省endIndex时将表示一直到arr的最后一个元素 s4 := arr[3:] // s := arr[:endIndex] 缺省startIndex时将表示从arr的第一个元素开始 s5 := arr[:3] // s := s1[startIndex:endIndex] //通过切片s初始化切片s1 s6 := s1[1:2] // s := make([]int,len,cap) 通过内置函数make()初始化切片s,[]int 标识为其元素类型为int的切片 s7 := make([]int,2) //定义string类型的切片 s8 := []string{"hello", "my boy", "you is beauty"} fmt.Println(s1,s2,s3,s4,s5,s6,s7) //循环数组的元素 for i:=0; i<len(arr6); i++ { fmt.Println("arr6[",i,"] =", arr6[i]) } //循环数组的元素 for k,v := range arr6 { fmt.Println("arr6[",k,"] =", v) } //循环切片 for i:=0;i<len(s8);i++ {
公众号-利志分享
2022/04/25
3200
go数组与切片,[]byte转string[通俗易懂]
数组:同一种数据类型的固定长度序列 数组的定义:var a [len]int ,比如 var a[5]int 长度是数组类型的一部分,因此,var a [5]int 和 var a [10]int 是不同的类型
全栈程序员站长
2022/06/28
1.4K0
Go切片数组深度解析
Go 中的分片数组,实际上有点类似于Java中的ArrayList,是一个可以扩展的数组,但是Go中的切片由比较灵活,它和数组很像,也是基于数组,所以在了解Go切片前我们先了解下数组。
Tim在路上
2021/02/04
5890
GO-数组与切片
一.数组的定义 //var 变量名 [数组的容量]类型 = [数组的容量]类型{值1,值2} var a [4]int = [4]int{1,2,3} 或者 var a = [4]int{1,2,3} 或者 a := [4]int{1,2,3} //这几个的结果为[1 2 3 0] //接受长度有赋值的长度决定 package main import "fmt" func main(){ var a = [...]int{1,2,3} //a :=[...]int{1,2,3}
小小咸鱼YwY
2020/06/19
5030
GO-数组与切片
Go 语言基础 数组、切片、映射
在 Go 语言中,为便于存储及管理用户数据,其数据结构设计分为数组 Array、切片 Slice、映射 Map 三种结构。
Meng小羽
2020/06/19
1K0
Go基础之--数组和切片
数组 数组的定义: 数组是具有固定长度并拥有零个或者多个相同数据类型元素的序列 定义一个数组的方法: var 变量名[len] type 例子: var a[5] int //3个整数的数组 var
coders
2018/01/04
7650
Go基础之--数组和切片
GO语言之旅:数组、切片
那么在访问切片元素的时候可以这样去访问,比如截取其中一段内容,下标都是从0开始的,有以下几种访问方式
杨子翔 josonyang
2020/10/26
3300
Go语言中数组与切片
在Go语言中,数组变量代表的是整个数组,而C/C++中数组变量代表的是指向数组的头指针。所以在Go语言中,当数组变量B被赋值数组变量A时,实际上是数组变量B完全复制了一份数组A数据,而不是数组变量A和数组变量B指向同一份数据。
似水流年o
2022/01/10
6860
Go语言入门(三)数组和切片
copy(dest,src) 拷贝之后,各自的地址不会发生改变,只是拷贝目的地的值发生了改变
alexhuiwang
2020/09/24
2780
Go语言中数组和切片笔记
今天有位大佬问我一个关于切片很简单的一个问题,却把我难住了,所以是时候了解下切片的底层了。
我的小碗汤
2018/08/22
4250
Go语言中数组和切片笔记
PHP转Go系列:数组与切片
用过PHP的同学应该很清楚,无论多么复杂的数据格式都可以用数组来表达,什么类型的数据都可以往里塞,它是工作必备的一部分,使用很简单,易用程度简直变态。
平也
2020/04/03
1.3K0
go语言的数组和切片区别
可以得出结论:如官方文档所述,数组是需要指定个数的,而切片则不需要。数组赋值也可是使用如下方式,忽略元素个数,使用“...”代替
charlieroro
2020/03/24
5160
Go 语言数组和切片的区别
在 Go 语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。
AlwaysBeta
2023/04/02
3410
Go语言入门——数组、切片和映射
但是对于Go,思来想去,感觉真的从“HelloWorld”说起,压根撑不住一篇的篇幅,因为Go的HelloWorld太简单了。
JackieZheng
2019/05/25
6590
【初识Go】| Day6 数组、切片
因为数组的长度是固定的,因此在Go语言中很少直接使用数组。和数组对应的类型是Slice(切片),它是可以增长和收缩动态序列,slice功能也更灵活,但是要理解slice工作原理的话需要先理解数组。
yussuy
2020/12/23
5000
【初识Go】| Day6 数组、切片
go语言学习(四):数组和切片
1.数组类型的长度是固定的,而切片类型的长度是可变长的。如下面代码声明一个长度为5的数组s1和长度为5的切片s2,
jinjunzhu
2020/08/20
3550
Go 语言基础--string&数组&切片 浅析
本篇来看一下go语言基本的一些复合结构,最常使用的复合结构有map、数组、切片这几个,string因为底层实现是一个[]byte所以大致可以理解为是一种数组结构,下面会从基础使用及底层实现来看一下这两个结构。
邹志全
2019/07/31
5080

相似问题

Go:数组的数组,切片的数组,数组的切片和切片的切片

20

Go数组切片function return语句

22

从Go中的切片构造数组

27

在Go中将数组转换为切片

44

由C数组支持的Go切片

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档