数组
func main(){
//数组定义
var arr =[3]int{}
fmt.Println(arr) //[0 0 0]
//指定数组元素
var arr1=[3]int{1,2,3}
fmt.Println(arr1) //[1 2 3]
//自动推导数组长度
var arr2=[...]int{1,2,3}
fmt.Println(arr2) //[1 2 3]
}
切片
//不写元素个数叫切片 必须写元素个数的叫数组
c := []int{1, 2, 3}
fmt.Println(c) //[1 2 3]
//make 指定长度的切片
s:=make([]int,3)
fmt.Println(s) //[0 0 0]
//len() 获取数组长度
fmt.Println(len(s))//3
//cap() 获取数组容量
fmt.Println(cap(s))//3
//追加元素
s=append(s, 1,2,3,4,5)
fmt.Println(s)//[0 0 0 1 2 3 4 5]
fmt.Println(len(s))//8
fmt.Println(cap(s))//8
数组和切片的区别
数组必须要指定长度,如果定义时不指定长度,go语言也会根据元素中的个数自动设置值数组长度,且长度不可变;切片在定义时可以指定或不指定长度,并且长度可以通过append追加
-
切片不仅有len()长度还有cap()容量,因此切片其实还有一个指定长度和容量的初始化方式:
eg:s := make([]int, 3, 5)
这就初始化了一个长度为3,容量为5的切片。
此外,切片还可以从一个数组中初始化(可应用于如何将数组转换成切片):
eg:通过数组 a 初始化了一个切片 s。 a := [3]int{1,2,3} s := a[:]
-
数组传递的是数据的拷贝,而切片传递的是引用,切片本身不包含任何数据。它仅仅是底层数组的一个上层表示。对切片进行的任何修改都将反映在底层数组中。
eg:
func main(){ array :=[...]int{1,2,3} //赋值给arrayCopy arrayCopy:=array arrayCopy[0]=8 fmt.Println(array,arrayCopy) //[1 2 3] [8 2 3] //切片 splice:=[]int{1,2,3} //赋值给spliceCopy spliceCopy:=splice spliceCopy[0]=8 fmt.Println(splice,spliceCopy) //[8 2 3] [8 2 3] }
可以看到改变数组的拷贝arrayCopy不会改变array中的数据,而改变切片的拷贝spliceCopy,splice也改变了。
可以看出数组是值拷贝而切片是引用。
map
map定义
map[keyType]valueTye
Golang中,map是引用类型,如切片一样,通过下面的代码声明后指向的是nil,所以千万别直接声明后就使用,新手可能经常会犯如下错误:
var m map[string]string m["name"]="小明"//异常 panic: assignment to entry in nil map
用
make
函数对其进行分配内存和初始化m:=make(map[string]string) m["name"]="小明" fmt.Println(m["name"])//小明
删除元素
delete(m,"name") fmt.Println(m)//map[]
有疑问加站长微信联系(非本文作者)