- 数组
1.数组定义:var 数组名 [数组大小] 数组类型
var a [5]int
2.(1)数组的地址可以通过数组名来获取:&a
(2)数组第一个元素的地址就是数组的首地址
3.数组初始化的四种方式
4.for-range遍历数组
for index,value:=range array01{
}
(1)第一个返回值index是数组的下标
(2)第二个value是在该下标位置的值
(3)array01是数组名
5.数组创建后,如果没有赋值,有默认值。
数值(整数系列,浮点数系列):0
字符串数组:""
bool数组:默认值为false
6.go的数组属值类型,在默认情况下是值传递,因此会进行值拷贝。数组间不会相互影响。如果想在其他函数中修改数组,可以使用引用传递。
package main
import (
"fmt"
)
func test1(arr [3]int){
arr[0]=5
}
//参数为指向数组的指针
func test2(arr *[3]int) {
(*arr)[0]=5
}
func main(){
arr:=[3]int{1,2,3}
fmt.Println(arr)
test1(arr)
fmt.Println(arr)
test2(&arr)
fmt.Println(arr)
}
[1 2 3]
[1 2 3]
[5 2 3]
- 二维数组
1.定义
var arr [4][6]int
&arr2[0]与&arr2[0][0]相同
2.初始化
- 切片
1.切片是一个数组的引用,因此切片是引用类型,在进行传递时,遵守引用传递的机制。
2.切片的长度是可以变化的,因此切片是一个可以变化动态数组。
3.切片定义:var 切片名 []类型
var a []int
4.切片使用的三种方式:
(1)定义一个切片,然后让切片引用一个已经创建好的数组。
func main(){
arr:=[...]int{1,2,3,4,5}
var slice=arr[1:3]//下标从1到3,但不包含3
fmt.Println(arr)
fmt.Println(slice)
}
结果:
[1 2 3 4 5]
[2 3]
内存图:
(2)通过make来创建切片
var 切片名 []类型=make([]类型,len,cap)
类型是数据类型,len为大小,cap为切片容量。
cap可选,如果分配了cap,则要求cap>=len
func main(){
var slice []float64=make([]float64,5,10)
slice[1]=10
slice[3]=20
fmt.Println(slice)
}
[0 10 0 20 0]
如果没有给切片的各个元素赋值,那么就会使用默认值;通过make方式创建的切片对应的数组是由make底层维护,对外不可见,即只能通过slice去访问各个元素。
内存图:
(3)定义一个切片,直接指定具体数组
func main(){
var slice []float64=[]float64{1,2,3}
fmt.Println(slice)
}
[1 2 3]
5.var slice =arr[0:end]可以简写var slice =arr[:end];
var slice =arr[start:len(arr)]可以简写为var slice =arr[start:]
var slice =arr[0:len(str)]可以简写为var slice =arr[:]
6.切片可以继续切片
slice1=slice[1:2]
7.用append内置函数,可以实现对切片进行动态追加
注:slice3=append(slice3,slice4…)中,slice3,slice4的类型只能是切片,…是固定写法,不能省略。
8.切片的拷贝操作
注:slice4的切片长度也可以比slice5小。不报错。
9.切片是引用类型,所以在传递时,遵守引用传递机制。
10.string和slice:
(1)string底层是一个byte数组,因此string也可以进行切片处理。
func main(){
str:="yuanyuan"
var slice=str[4:]
fmt.Println(slice)
}
yuan
(2)string是不可变的,也就是说不能通过str[0]='z’方式来修改字符串。如果需要修改字符,可以先将string->[]byte或[]rune,修改后再重新转成string。
package main
import (
"fmt"
)
func main(){
str:="yuanyuan"
arr1:=[]byte(str)
arr1[0]='c'
str=string(arr1)
fmt.Println(str)
}
cuanyuan
注:[]byte用来处理光有数字和字母的字符串,byte是按字节来,如果带有汉字,必须使用[]rune