Go学习笔记—数组、切片
感谢观看,如有问题,请留言指正!谢谢
1、数组(array)
一维数组
Go语言中,数组是一个固定长度的数列。
创建数组和数组初始化的方法:
-
var a [5]int //创建定长的数组,同时初始化默认值全为0
-
b := [5]int{ 1,2,3,4,5} //自动推导法,在创建数组的同时进行初始化
-
var c = [...]int{ 1,23,5,623,7} //不定长数组,再定义数组的同时进行初始化
二维数组
-
//二维数组的定义和初始化 a := [3][2]string{ { "安徽", "芜湖"}, { "江苏", "无锡"}, { "河北", "保定"}, }
数组的长度可以使用内置函数len()
来获取
数组的存储类型是单一的,但是你可以组合这些数据来构造多位的数据结构。
可以通过以下例子来全面的了解数组的使用:
func main(){
var a [5]int
fmt.Println("emp:",a)
a[4] = 100
fmt.Println("set:",a)
fmt.Println("get:",a[4])
fmt.Println("len:",len(a))
b := [5]int{
1,2,3,4,5}
fmt.Println("dcl:",b)
var twoD [2][3]int
for i:=0;i<2;i++{
for j:=0;j<3;j++{
twoD[i][j] = i+j
}
}
fmt.Println("2d:",twoD)
}
2、切片(slice)
slice是Go中一个关键的数据类型,是一个比数组更加强大的序列接口。
slice的类型仅由它所包含的元素决定,定义是不需要元素个数。
创建切片和切片初始化的方法:
-
var sli1 []int //定义一个整型切片,默认为空
-
var sli2 = []string{ } //定义一个字符串切片,虽然没有赋值,但是切片不为空
-
sli3 := []int{ } //自动推导类型,切片不为空
-
sli4 := make([]int,4) //make([]type,len,cap),使用内置函数创建,需要添加[]type,len或者cap,切片不为空
通过代码进行验证:
func main(){ var sl1 []string if sl1 == nil{ fmt.Println("空切片") }else{ fmt.Println("不是空切片") } var sli2 = []int{ } if sli2 == nil{ fmt.Println("空切片") }else{ fmt.Println("不是空切片") } sli3 := []int{ } if sli3 == nil { fmt.Println("空切片") }else{ fmt.Println("不是空切片") } } //空切片 //不是空切片 //不是空切片
len()
函数
内置函数len()
,可以求出切片的长度。
func len(v Type) int
//Slice, or map: the number of elements in v; if v is nil, len(v) is zero.
//返回切片中元素的个数,如果切片为空,返回0
cap()函数
内置函数cap()
,可以求出切片的容量。
func cap(v Type) int
//Slice: the maximum length the slice can reach when resliced;
//重组切片时,切片可以达到的最大长度
测试代码:
func lenAndCap(t []string) {
//获取长度,内置函数len()
fmt.Println("len:",len(t))
//获取容量,内置函数cap()
fmt.Println("cap:",cap(t))
}
append()
函数
内置函数append()
,可以向已经创建的切片中添加元素。
func append(slice []Type, elems ...Type) []Type
//第一个参数是切片,第二个参数是添加的元素...元素可以有多个,返回值是切片类型
//也可以将后一个切片添加到前一个切片中
//numsSorted := append([]int(nil),nums...)
copy()
函数
内置函数copy()
,可以向已经创建的切片中拷贝元素。
func copy(dst, src []Type) int
//将原切片中的元素添加到目标切片
测试代码:
func main(){
s = append(s,"d")
s = append(s,"e","f")
fmt.Println("sel:",c)
//lenAndCap(s)
c := make([]string,len(s))
copy(c,s) //拷贝,将参数2中的元素拷贝到参数1中
fmt.Println("cpy:",c)
lenAndCap(c)
}
//sel: [a b c d e f]
//cpy: [a b c d e f]
slice可以组成多维数据结构。内部的slice长度可以不同。
//构建二维切片
func main(){
twoD := make([][]int,3)
for i := 0;i < 3;i++{
innerLen := i+1
twoD[i] = make([]int,innerLen)
for j := 0;j < innerLen;j++{
twoD[i][j] = i+j
}
}
fmt.Println("2d:",twoD)
}