数组
数组是指同一类型元素的集合。
1.数组的定义及赋初值
package main
import "fmt" func main() { var a [3]int # 定义了一个长度为三的int类型数组 fmt.Println(a) # 运行结果:[0,0,0] ----------------------------------------------------------------- # 定义并赋值初值 var a [6]int = [6]int{1, 2, 3, 4, 5, 6} # >>>:[1, 2, 3, 4, 5, 6] var a = [6]int{1, 2, 3} # >>>:[1, 2, 3, 0, 0, 0] a := [6]int{1, 2, 3} # >>>:[1, 2, 3, 0, 0, 0] a := [...]int{1,2,3} # 忽略数组的长度,用...来代替,编辑器会自动生成长度。 a[5] = 100 fmt.Println(a) ----------------------------------------------------------------- # 将第7个位置设置为666 a := [10]int{1, 2, 5: 666, 6: 777} # [1 2 0 0 0 666 777 0 0 0] a[-7] = 13 # 不支持负索引 }
2.数组的长度
package main
import "fmt" func main() { a:=[4]int{1,2,3} fmt.Println(len(a)) # >>>:4 内置函数len() } &&与 ; ||或 ; !非
3.使用range迭代数组
通过for循环的range方法来遍历数组。range返回索引和该索引处的值。语法为:for i, v := range a 。如果只需要值并希望忽略掉索引,则可通过 _ 空白表示怀疑替换索引。
package main import "fmt" func main() { var a [4]int=[4]int{1,2} for i :=0; i<len(a); i++{ fmt.Println(a[i]) } } ------------------------------------------ func main() { var vv [5]int = [5]int{1, 2: 666, 3: 777} for _, v :=range vv { # 只取值,不取索引 fmt.Println(_, v) } }
4.多维数组
package main
import "fmt" func main() { var a [5][2]int # 把一个数组分为五份,再对这五份进行细分,每份里面再分为两份。 a[0][1] = 100 # 从五份中选取索引0,再充索引0对应的那个两份中,选取索引1。 fmt.Println(a) # >>>: [[0 100] [0 0] [0 0] [0 0] [0 0]] }
切片
切片本身不存储数据,只是对底层数组的引用
1.切片的定义方式
package main import "fmt" #由数组切出来 func main() { var a [8]int = [8]int{1,2,3,4,5,6,7,8} var b []int = a[2:6] # 打印出来的是前闭后开区间 #[ ]内不加东西就是切片,[ ]加了东西便是数组类型 fmt.Println(b) a[2] = 30 fmt.Println(b) fmt.Println(a) # 底层数组的修改会影响到切片,切片的修改也会影响到切片 } --------------------------------------------------------- #更多用法 func main() { var a[8]int = [8]int{1,2,3,4,5,6,7,8} b := a[ :4] # go中的切片没有步长 fmt.Println(b) } --------------------------------------------------------- # 直接定义 # 切片空值? 其实就是个地址 ,nil类型 func main() { var a []int if a == nil { fmt.Println("我是空值") } fmt.Println(a) }
2.定义并初始化
# 参数类型,第一个数字是切片的长度,第二个是底层数组的长度,也就是切片长度。 package main import "fmt" func main() { var a []int = make([]int,3,4 fmt.Println(a) }
3.切片的长度和容量
package main import "fmt" func main() { var a [8]int = [8]int {1,2,3,4,5,6,7,8} var b []int = a[2:6] fmt.Println(len(b)) # 切片的长度 >>>:4 fmt.Println(cap(b)) # 切片的容量 ,来确定能放多少值 >>>:6 }
4.追加切片元素
package main import "fmt" func main() { var a [8]int = [8]int {1,2,3,4,5,6,7,8} var b []int = a[2:6] fmt.Println(b) fmt.Println(a) fmt.Println(len(b)) # 查数组的长度 fmt.Println(cap(b)) # 查数组的容量 -------------------------------------------------------- #切片一直追加值,当追加到数组长度时,就不依附于底层数组,重新生成了一个数组,数组大小为切片容量的两倍。 #内置函数append b=append(b,555) b=append(b,66) b=append(b,77) fmt.Println(len(b)) # 数组想扩容,要重新再申请一个数组 fmt.Println(cap(b)) # 容量一旦超出,再重新申请一个跟原来一样的,容量翻倍 fmt.Println(a) fmt.Println(b) b[0]=999 fmt.Println(a) }
5.切片的修改
package main import "fmt" func main() { var a [8]int = [8]int {1,2,3,4,5,6,7,8} var b = make([]int,3,4) b[0]=99 # 将b数组中索引0对应的值改为99 fmt.Println(b) }
6.切片删除元素
package main import "fmt" func main() { var a = []int{1,2,3,4,5,6} fmt.Println(a) # >>>:[1 2 3 4 5 6] a = append(a[0:2],a[3:]...) #只取[0:2]和[3:]之间的索引,...表示打散 fmt.Println(a) # >>>:[1 2 4 5 6] }
7.多维切片初始化方法
package main import "fmt" func main() { var a []int=[]int{1,2,3} # 切片初始化方法 fmt.Println(a) var a [][]string=[][]string{{"1","20"},{"3","40"}} #多维切片初始化方法 fmt.Println(a) # >>>: [[1 20] [3 40]] fmt.Println(len(a)) # 查看长度 fmt.Println(cap(a)) # 查看容量 a[0][1] = "222" a[1][1] = "444" fmt.Println(a) # >>>: [[1 222] [3 444]] }
8. copy函数
package main import "fmt" func main() { var a=make([]int,3,10) a[1] = 66 a[2] = 77 fmt.Println(a) var b=make([]int,4,4) fmt.Println(b) # copy(目标切片, 原切片) copy(b,a) # 把 a的值 copy到 b 切片上去 fmt.Println(b) }