golang的数组、切片理解

一、数组

1.数组的初始化

数组的定义

var a [5]int	//定义
a[0]=1
a[1]=2	//初始化

数组的四种初始化方式

var a1 [3]int = [3]int{1,2,3}

var a2 = [3]int{1,2,3}

var a3 = [...]int{1,2,3}	// 一般采取这种,初始值的个数而定

var a4 = [...]int{2:800,1:900,3:999}	//根据索引值初始化

a5:= [...]string{2:"tom",1:"jack",3:"mary"}	//类型推导

fmt.Println(a1) 	//[1 2 3]
fmt.Println(a2)		//[1 2 3]
fmt.Println(a3)		//[1 2 3]
fmt.Println(a4)		//[0 900 800 999]
fmt.Println(a5)		//[ jack tom mary]

2.数组的遍历

常规遍历

var a = [...]int{1,2,3}		

for i:=0;i<len(a);i++{
	fmt.Println(a[i])
}

for-range结构遍历

var a = [...]int{1,2,3}

for i,v:=range a{
	fmt.Println(i,v)
	fmt.Println(i,a[i])		//效果相同
}

for _,v:=range a{
	fmt.Println(v)			//只输出值
}

二、切片

1.切片的初始化

切片的定义

var slice []int				//定义

引用数组进行初始化

arr:= [...]int{1,2,3,4,5}
var slice =arr[1:3]
fmt.Println(slice) 	//	[2 3]

使用make初始化(最常用)

var 切片名 []type = make([]type, len,[cap]) //cap可以省略

var slice []int = make([]int,5,10)
var slice1 = make([]int,5,10)
slice2:=make([]int,5)

slice[1]=10
slice[3]=20
fmt.Println(slice)  	//[0 10 0 20 0]
fmt.Println(slice1) 	//[0 0 0 0 0]
fmt.Println(slice2)		//[0 0 0 0 0]

其他初始化方式

slice1:=[]int{}
slice2:=[]int{1,2,3,4,5}	//和数组的区别就是没有...

fmt.Println(slice1)	 		//[]
fmt.Println(slice2)			//[1 2 3 4 5]

2.切片的遍历

var arr [5]int =[...]int{1,2,3,4,5}
var slice =arr[1:3]
for i:=0;i<len(slice);i++{
	fmt.Println(i,slice[i])
}

for i,v:= range slice{
	fmt.Println(i,v)
}

3.切片的append操作

var slice []int = []int{1,2,3}
slice=append(slice,4,5,6)
fmt.Println(slice)	//[1 2 3 4 5 6]

slice=append(slice,slice...) //这个...一定要加上
fmt.Println(slice)  //[1 2 3 4 5 6 1 2 3 4 5 6]

4.切片的copy操作

var slice []int = []int{1,2,3}
var slice1 =make([]int, 10)
var slice2 =make([]int, 1)
copy(slice1,slice)

fmt.Println(slice)	//[1 2 3]
fmt.Println(slice1) //[1 2 3 0 0 0 0 0 0 0]

copy(slice2,slice)
fmt.Println(slice2)	//[1]

5.切片的传递机制

切片是引用类型,所以在传递时,遵守引用传递机制。

var slice []int
var arr [5]int =[...]int {1,2,3,4,5}
slice =arr[:]

var slice2=slice
slice2[0]=10

fmt.Println(slice2)	//[10 2 3 4 5]

fmt.Println(slice)	//[10 2 3 4 5]

fmt.Println(arr)	//[10 2 3 4 5]

6.string 和slice

string 底层是一个 byte 数组,因此 string 也可以进行切片处理

str:="gotianxiawudi"
slice:=str[6:]

fmt.Println(slice)	//xiawudi

string 是不可变的,也就说不能通过 str[0] = ‘z’ 方式来修改字符串

str[0]='z' 	//报错

如果需要修改字符串,可以先将 string -> []byte / 或者 []rune -> 修改 -> 重写转成 string

byte数据类型与rune相似,它们都是用来表示字符类型的变量类型。它们的不同在于:

byte 等同于int8,常用来处理ascii字符
rune 等同于int32,常用来处理unicode或utf-8字符

7.golang 切片copy复制和等号复制的区别

copy复制会比等号复制慢。但是copy复制为值复制,改变原切片的值不会影响新切片。而等号复制为指针复制,改变原切片或新切片都会对另一个产生影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值