我正在参加「掘金·启航计划」
数组是同一种数据类型元素的固定长度的集合,在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可改变
1.1数组定义
var 数组变量名 [元素个数]T
例:
var a[5]int //数组的长度必须是常量,并且长度是数组类型的一部分,一旦定义,长度不能变,
[5]int 和[10]int 是不同的类型
var a [2]int
var b [3]int
a = b //不可以这样做,因为a和b是不同的类型
//数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1
a[len-1]
a[0] = 123 //赋值
//访问越界,如果下标在数组合法范围之外,则触发访问越界,会panic
//数组是值类型,赋值和传参会复制整个数组,而不是指针,因此会改变副本的值,不会改变本身的值
//支持"=="、"!="操作,因为内存总是被初始化的
//指针数组 [n]*T 数组指针 *[n]T
1.2数组初始化
1.2.1 方法一
初始化数组时可以使用初始化列表来设置数组元素的值
func main(){
var a1 [5]int //数组会初始化为int类型的0值
var a2 = [3]int{2, 3} //使用置顶的初始值完成初始化,a2[0]值为2,a2[2]值为0
var a3 = [3]string{"golang", "java", "python"}
fmt.Println(a1) //[0 0 0]
fmt.Println(a2) //[2 3 0]
fmt.Println(a3) //[golang java python]
}
1.2.2 方法二
方法一每次都需要确保提供的初始值和数组长度一致,我们也可以让编译器根据初始值个数自行推断数组的长度
func main(){
var a1 [2]int
var a2 = [...]int{2, 3, 4}
var a3 = [...]string{"golang", "php", "python"}
fmt.Println(a1) //[0 0]
fmt.Println(a2) //[2 3 4]
fmt.Printf("type of a2:%T\n", a2) //type of a2:[3]int
fmt.Println(a3) //[golang php python]
fmt.Printf("type of a3:%T\n", a3) //type of a3:[3]string
}
1.2.3方法三
我们还可以指定索引值的方式来初始化数组
func main(){
a := [...]int{1: 1, 2, 4: 5}
fmt.Println(a) //[0 1 2 0 5]
}
1.3数组的遍历
func main(){
var a = [...]string{"golang", "python", "php"}
//方法1 for循环遍历
for i := 0; i < len(a); i++ {
fmt.Println(a[i])
}
//方法2 for range遍历
for index, value := range a {
fmt.Printf("index:%v, value:%v\n", index, value)
}
}
1.4多维数组
1.4.1二维数组的定义
func main(){
var a = [...][2]string{
{"北京", "上海"},
{"山东", "深圳"},
}
fmt.Println(a) //[[北京 上海] [山东 深圳]]
fmt.Println(a[0][1]) //支持索引取值 上海
}
注意:多维数组只有第一层可以用...来让编译器推导数组长度,不支持多维数组内层使用
1.4.2二维数组的遍历
func main(){
a := [...][2]string{
{"北京", "上海"},
{"山东", "深圳"},
}
for _, value := range a{
for _, v := range value {
fmt.Printf("%s\t", v)
}
fmt.Println()
}
}
1.5数组是值类型
数组是值类型,赋值和传参会复制整个数组,因此改变副本的值,不会改变本身的值
func main(){
a := [3]int{2, 5, 7}
modifyArray(a) //修改数组
fmt.Println(a) //[2 5 7] 不会改变原数组的值
}
func modifyArray(a [3]int){
a[0] = 10
}