一、数组
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复制为值复制,改变原切片的值不会影响新切片。而等号复制为指针复制,改变原切片或新切片都会对另一个产生影响。