前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go语言中数组与切片

Go语言中数组与切片

原创
作者头像
似水流年o
发布于 2022-01-10 08:55:38
发布于 2022-01-10 08:55:38
70200
代码可运行
举报
文章被收录于专栏:编程学习收获编程学习收获
运行总次数:0
代码可运行

数组:

1.数组定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	//定义arr,不赋值默认为0
	var arr [3]int
	fmt.Printf("%v-%v-%v\n", arr[0], arr[1], arr[2]) //0-0-0
	//显示的指定大小个数并且用1,2,3赋值
	arr1 := [3]int{1, 2, 3}
	fmt.Printf("%v-%v-%v\n", arr1[0], arr1[1], arr1[2]) //1-2-3
	//隐式的不指定大小个数,用赋值1,2,3 (注意有三个.)
	arr2 := [...]int{1, 2, 3}
	fmt.Printf("%v-%v-%v\n", arr2[0], arr2[1], arr2[2]) //1-2-3

2.数组遍历:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	//定义arr
	arr := [3]int{11, 12, 13}
	fmt.Printf("%v-%v-%v\n", arr[0], arr[1], arr[2]) //11-12-13
	//数组遍历1
	for i := 0; i < len(arr); i++ {
		/**
		i=0,v=11
		i=1,v=12
		i=2,v=13
		*/
		fmt.Printf("i=%v,v=%v\n", i, arr[i])
	}
	//数组遍历2
	for i, v := range arr {
		/**
		i=0,v=11
		i=1,v=12
		i=2,v=13
		*/
		fmt.Printf("i=%v,v=%v\n", i, v)
	}

3.数组注意点

在Go语言中,数组变量代表的是整个数组,而C/C++中数组变量代表的是指向数组的头指针。所以在Go语言中,当数组变量B被赋值数组变量A时,实际上是数组变量B完全复制了一份数组A数据,而不是数组变量A和数组变量B指向同一份数据

举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
	//定义数组A
	A := [3]int{1, 2, 3}
	//打印数组A
	fmt.Printf("%v\n", A) //[1 2 3]
	//数组变量B被赋值数组变量A
	var B = A
	//打印数组B
	fmt.Printf("%v\n", B) //[1 2 3]
	//数组B index=0替换
	B[0] = 4

	//打印数组A
	fmt.Printf("%v\n", A) //[1 2 3]
	//打印数组B
	fmt.Printf("%v\n", B) //[4 2 3]
}

所以如果原数组数据量大,那么数组的赋值会造成巨大的内存开销

切片

1.切片的由来:

切片类似于JAVA中的List列表,是一种长度可变的数组, 可以动态增长收缩,解决原生数组大小不可变的弊端。

2.切片的定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	//定义数组A
	arr := [3]int{1, 2, 3}
	//打印数组A
	fmt.Printf("%v\n", arr) //[1 2 3]
	//1.基于数组创建切片,长度是2,容量是2
	slice1 := arr[1:3]
	printSlice(slice1)

	//2.直接声明一个切片,长度是0,容量是0
	var slice2 []int
	printSlice(slice2)

	//3.声明一个切片指定初始值,长度是4,容量是4
	var slice3 = []int{1, 2, 3, 4}
	printSlice(slice3)
	
	//4.make定义切片,长度是4(值为0),容量是10
	var slice4 []int = make([]int, 4, 8)
	printSlice(slice4)

}

func printSlice(x []int) {
	fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}

切片拥有自己的长度和容量,我们可以通过使用内置的 len()函数求长度,使用内置的cap()函数求容量

3.切片的遍历:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	//定义切片
	var slice = []int{1, 2, 3, 4}

	//遍历1
	/**
	i=0,v=1
	i=1,v=2
	i=2,v=3
	i=3,v=4
	*/
	for i := 0; i < len(slice); i++ {
		fmt.Printf("i=%v,v=%v\n", i, slice[i])
	}

	//遍历2
	/**
	i=0,v=1
	i=1,v=2
	i=2,v=3
	i=3,v=4
	*/
	for i, v := range slice {
		fmt.Printf("i=%v,v=%v\n", i, v)
	}

4.切片的常用方法

  • append()方法:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
	//定义切片
	var slice = []int{1, 2, 3, 4}
	printSlice(slice) //len=4 cap=4 slice=[1 2 3 4]
	//注意:append方法需要变量进行返回接收,而不是在原有的slice上直接添加
	slice = append(slice, 10)
	printSlice(slice) //len=5 cap=8 slice=[1 2 3 4 10]
}
func printSlice(x []int) {
	fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}

  • copy()方法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
	//定义切片b
	var b = []int{1, 2, 3, 4}
	printSlice(b) //len=4 cap=4 slice=[1 2 3 4]
	a := b
	printSlice(a) //len=4 cap=4 slice=[1 2 3 4]
	//修改index=0的数值
	a[0] = 100
	printSlice(a) //len=4 cap=4 slice=[100 2 3 4]
	printSlice(b) //len=4 cap=4 slice=[100 2 3 4]
}

func printSlice(x []int) {
	fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}

通过上面例子我们可以看到切片数组的变量赋值是不一样的。数组变量赋值是进行数据拷贝,而切片变量赋值是进行指针指向。通过copy()方法可以进行数据拷贝

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
	//定义切片b
	var b = []int{1, 2, 3}
	var a = []int{10, 11, 12, 13}
	copy(a, b)    //目标切片,源切片,对应位置拷贝
	printSlice(a) //len=3 cap=3 slice=[1 2 3]
	printSlice(b) //len=4 cap=4 slice=[1 2 3 4]
}

func printSlice(x []int) {
	fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}

  • 删除方法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
	//定义切片b
	var a = []int{1, 2, 3, 4}
	// 要删除索引为2的元素
	// 切片a中删除索引为index的元素,通用方法是a = append(a[:index], a[index+1:]...),左闭右开
	a = append(a[:2], a[3:]...)
	printSlice(a) //len=3 cap=4 slice=[1 2 4]
}

func printSlice(x []int) {
	fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go语言入门——数组、切片和映射(下)
  不管是数组、切片还是映射结构,都是一种集合类型,要从这些集合取出元素就要查找或者遍历。
JackieZheng
2019/05/28
6150
Go语言中的数组和切片详解
在Go语言中,数组是一种具有固定大小的序列,可以存储相同类型的元素。数组的定义和初始化如下:
数字扫地僧
2024/06/14
1590
第三章 内建容器 数组, 切片, map
这里传递arr1 和arr3过去的时候, 可以正常打印数组,但是传递arr2过去的时候, 会报异常.
用户7798898
2020/09/27
2970
第三章 内建容器  数组, 切片, map
Golang 语言中数组和切片的区别是什么?
在很多编程语言中都有数组,而切片类型却不常见。实际上,Golang 语言中的切片的底层存储也是基于数组。因为数组是固定长度的,而切片比数组更加灵活,所以在 Golang 语言中,数组使用的并不多,切片使用更加广泛。
frank.
2021/04/16
5460
GO语言基础之切片
1、切片:切片是数组的一个引用,因此切片是引用类型。但自身是结构体,值拷贝传递。 2、切片的长度可以改变,因此,切片是一个可变的数组。 3、切片遍历方式和数组一样,可以用len()求长度。表示可用元素数量,读写操作不能超过该限制。 4、cap可以求出slice最大扩张容量,不能超出数组限制。0 <= len(slice) <= len(array),其中array是slice引用的数组。 5、切片的定义:var 变量名 []类型,比如 var str []string var arr []int。 6、如果 slice == nil,那么 len、cap 结果都等于 0。
墨紫羽墨
2022/03/01
3140
Go语言入门(三)数组和切片
copy(dest,src) 拷贝之后,各自的地址不会发生改变,只是拷贝目的地的值发生了改变
alexhuiwang
2020/09/24
2910
Go两周入门系列-数组和切片(slice)
数组类型,是一组同类型数据的集合,通过从0开始的下标,访问元素值。数组初始化后长度是固定的,无法修改数组长度。
用户10002156
2023/09/27
1790
Go两周入门系列-数组和切片(slice)
go语言基础5-数组、切片、容器
数组 实例 var arr1 [5]int //定义长度为5的数组 arr2 := [3]int{1,2,3} //使用:时需要赋值 arr3 := [...]int{2,3,4,5} //可变长度 var grid [4][5]int //二维数组 数组类型是值类型 调用func f(arr [10]int) 会拷贝数组 go语言中一般不直接使用数组 切片(Slice) 实例 arr := [...]int{0,1,2,3,4,5,6,7} s := arr[2:6] //s即为切片,值为[2
吐吐吐吐吐葡萄皮
2019/04/04
3810
go语言基础5-数组、切片、容器
go 学习笔记之数组还是切片都没什么不一样
上篇文章中详细介绍了 Go 的基础语言,指出了 Go 和其他主流的编程语言的差异性,比较侧重于语法细节,相信只要稍加记忆就能轻松从已有的编程语言切换到 Go 语言的编程习惯中,尽管这种切换可能并不是特别顺畅,但多加练习尤其是多多试错,总是可以慢慢感受 Go 语言之美!
雪之梦技术驿站
2019/08/18
4170
100天精通Golang(基础入门篇)——第11天:深入解析Go语言中的切片(Slice)及常用函数应用
本文是《100天精通Golang(基础入门篇)——第11天:切片(Slice)》,将详细介绍切片的概念、语法、修改、以及len()、cap()、append()和copy()函数的使用。读者将通过学习本文深入了解Golang中切片的使用方法和常用函数的功能。
猫头虎
2024/04/08
1910
100天精通Golang(基础入门篇)——第11天:深入解析Go语言中的切片(Slice)及常用函数应用
Go切片数组深度解析
Go 中的分片数组,实际上有点类似于Java中的ArrayList,是一个可以扩展的数组,但是Go中的切片由比较灵活,它和数组很像,也是基于数组,所以在了解Go切片前我们先了解下数组。
Tim在路上
2021/02/04
6110
Go 语言切片(Slice)
Go 语言切片是对数组的抽象。 Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。 ---- 定义切片 你可以声明一个未指定大小的数组来定义切片: var identifier []type 切片不需要说明长度。 或使用make()函数来创建切片: var slice1 []type = make([]type, len) 也可以简写为 slice1 :=
李海彬
2018/03/22
6480
第23节 切片(Slice)
Go 语言切片是对数组的抽象。 Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大
小尘哥
2019/10/29
5390
Go语言入门基础
指针 Go 具有指针。 指针保存了变量的内存地址。 类型 *T 是指向类型 T的值的指针。其零值是 nil 。 var p *int 复制代码 & 符号会生成一个指向其作用对象的指针。 i := 42 p = &i 复制代码 *符号表示指针指向的底层的值。 fmt.Println(*p) // 通过指针 p 读取 i *p = 21         // 通过指针 p 设置 i 这也就是通常所说的“间接引用”或“非直接引用”。 与 C 不同,Go 没有指针运算。 package main import
李海彬
2018/03/27
6700
100天精通Golang(基础入门篇)——第10天:Go语言中的数组
本篇文章是100天"学习Golang"系列文章的第10篇,主要介绍了Go语言中的数组以及数组的语法、多维数组、数组是值类型等内容。通过阅读本篇文章,读者能够了解到如何在Go语言中定义和使用数组,并掌握一些实用的代码技巧。
猫头虎
2024/04/08
2930
100天精通Golang(基础入门篇)——第10天:Go语言中的数组
Go 语言中切片的使用和理解
切片与数组类似,但更强大和灵活。与数组一样,切片也用于在单个变量中存储相同类型的多个值。然而,与数组不同的是,切片的长度可以根据需要增长和缩小。在 Go 中,有几种创建切片的方法:
小万哥
2023/09/01
1650
Go 语言中切片的使用和理解
Go语言笔记----基础语法
defer关键字的功能类似于c++的析构函数,用defer关键字声明的函数,会在当前方法执行结束后被执行,并且执行顺序类似于栈的先进后出关系
大忽悠爱学习
2022/05/10
4720
Go语言笔记----基础语法
GO语言基础知识
Go指针 指针变量 * 和地址值 & 的区别:指针变量保存的是一个地址值,会分配独立的内存来存储一个整型数字。当变量前面有 * 标识时,才等同于 & 的用法,否则会直接输出一个整型数字。
青梅煮码
2023/03/13
2700
06.Go语言-容器类型
数组 是一个由 固定长度 的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。因为数组的长度是固定的,因此在 Go 语言中很少直接使用数组。和数组对应的类型是 slice(切片) ,它是可以动态的增长和收缩的序列, slice 功能也更灵活,下面我们再讨论 slice 。
面向加薪学习
2022/09/04
2090
[Go] Golang 学习随笔
闭包函数的特性存在于很多高级语言中。简而言之:如果函数A的返回值也是一个函数L,其作为返回值的函数L使用了这个函数A所创建的某个局部变量,并把对这个局部变量的控制能力(使用权)提供给了外部的某个函数B,就会产生所谓的闭包。
赤道企鹅
2022/08/01
4120
[Go] Golang 学习随笔
相关推荐
Go语言入门——数组、切片和映射(下)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验