这一期分享一下复合数据类型:数组和切片。下面正文开始
一、数组
数组是指某一类型的组成的一个序列集合,数组长度大小是固定的,一旦声明就无法改变。
1.1数组声明和值更新
数组声明方法如下:
var intArray [10]int
intArray2 := [10]int{1,2,3,4}
intArray3 := [10][10]int{} //二维数组
//更新某个位置的值,切记不要越界
intArray2[2] = 10
1.2数组遍历
1.2.1数组遍历方法(1)
利用常规下标循环遍历
for i:=0; i<len(intArray); i++{
println(i, intArray[i])
}
1.2.2数组遍历方法(2)
这种方法是利用range关键字。看上去是不是很简洁,经常使用的方法。
for i,item := range intArray{
println(i, item)
}
1.3数组做为参数传参
看下面两个例子,哪个能改变数组intArray的值呢?是updateArray1还是updateArray2呢?留个小作业吧。
func updateArray1(intArray [10]int) {
intArray[2] = 10
}
func updateArray2(intArray *[10]int) {
(*intArray)[2] = 11
}
func main() {
var intArray [10]int
updateArray1(intArray)
fmt.Println(intArray)
updateArray2(&intArray)
fmt.Println(intArray)
}
数组传参数是直接传递的整个值,值传递。要想改变就得使用指针。
二、切片
数组已经很好用了,但有没有发现,长度是固定的,这就不完美了。要是能像C++的STL中的vector那样的该好啊?实际上GO语言的切片比vector用着还要爽。特定的时候还能和C++的vector进行互转和使用,因为底层说白了都是指针数组和长度的结构体。
2.1切片声明和值更新
数组声明方法如下:
var intSlice []int
intSlice2 := []int{1,2,3,4}
//二维切片用的比较少。
intSlice3 := [][]int{
{1,2,3}, //0
{1,2,3,4}, //1
}
//更新某个位置的值,切记不要越界
intSlice[2] = 10
2.2切片遍历
2.2.1切片遍历方法(1)
利用常规下标循环遍历
for i:=0; i<len(intSlice); i++{
println(i, intSlice[i])
}
2.2.2切片遍历方法(2)
这种方法是利用range关键字。看上去是不是很简洁,经常使用的方法。
for i,item := range intSlice{
println(i, item)
}
2.3切片做为参数传参
看下面两个例子,哪个能改变数组intArray的值呢?是updateSlice1还是updateSlice2呢?再留个小作业吧。
func updateSlice1(intSlice []int) {
intSlice[2] = 10
}
func updateSlice2(intSlice *[]int) {
(*intSlice)[2] = 11
}
func main() {
intSlice := []int{1,2,3,4,5}
updateSlice1(intSlice)
fmt.Println(intSlice)
updateSlice2(&intSlice)
fmt.Println(intSlice)
}
切片传参数本身就是指针,大家可以亲自试一下上面的例子。
今天分享到这里,感谢大支持。