go支持数组类型,数组是同一种数据类型元素的集合。
使用时可以修改数组成员,但是数组大小不可变化。
数组的长度必须是常量,并且长度是数组类型的一部分。一旦定义,长度不能变。
数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1,
访问越界(下标在合法范围之外),则触发访问越界,会panic。
go数组声明与遍历
代码如下:
package main
import "fmt"
func main() {
fmt.Println("go array")
// 方法1 :先声明,后赋值
var a [3]int
for i := 0; i < 3; i++ {
a[i] = i * 100
}
fmt.Println(a)
// 方法2:声明的时候直接赋值,且指明数组长度
// 声明数组时也可以不用var关键字,例如
// citys := [3]string{"beijing", "shanghai", "guangzhou"}
var citys = [3]string{"beijing", "shanghai", "guangzhou"}
fmt.Println(citys)
// 方法3:声明时自动推导数组长度
var nums = [...]int{1, 3, 5, 7}
fmt.Println(nums)
// 方法4:指定索引初始化
// 注意使用这种方法声明数组时,数组的最大索引为指定的最大值,例如,下面的数组,最大索引为5
var score = [...]int{1: 98, 5: 99}
fmt.Println(score)
// 数组长度
len1 := len(score)
fmt.Println(len1)
// 数组遍历
// 方法1 :for循环
for i := 0; i < len(score); i++ {
fmt.Println(score[i])
}
// 方法2 :for range
fmt.Println("------------------------------")
for index, value := range score {
fmt.Println(index, value)
}
// 此时遍历的是索引
for i := range score {
fmt.Println(score[i])
}
// 二维数组
// Go语言是支持多维数组的,我们这里以二维数组为例
// 最后也得加逗号,不然语法错误
b := [3][2]string{
{"北京", "故宫"},
{"上海", "东方明珠"},
{"武汉", "黄鹤楼"},
}
for _, v1 := range b {
for _, v2 := range v1 {
fmt.Println("%s\t", v2)
}
}
/*
多维数组只有第一层可以使用...来让编译器推导数组长度。例如:
支持的写法
a := [...][2]string{
{"北京", "上海"},
{"广州", "深圳"},
{"成都", "重庆"},
}
//不支持多维数组的内层使用...
b := [3][...]string{
{"北京", "上海"},
{"广州", "深圳"},
{"成都", "重庆"},
}
*/
}
数组做函数参数
数组是值类型,赋值和传参会复制整个数组。因此改变副本的值,不会改变本身的值。
数组支持 “==“、”!=” 操作符,因为内存总是被初始化过的。
[n]T表示指针数组,[n]T表示数组指针 。
代码
/*
数组是值类型,赋值和传参会复制整个数组。因此改变副本的值,不会改变本身的值。
数组支持 “==“、”!=” 操作符,因为内存总是被初始化过的。
[n]*T表示指针数组,*[n]T表示数组指针 。
*/
package main
import "fmt"
func modifyArray(x [3]int) {
x[0] = 100
}
func modifyArray2(x [3][2]int) {
x[2][0] = 100
}
func main() {
a := [3]int{10, 20, 30}
modifyArray(a) //在modify中修改的是a的副本x
fmt.Println(a) //[10 20 30]
b := [3][2]int{
{1, 1},
{1, 1},
{1, 1},
}
modifyArray2(b) //在modify中修改的是b的副本x
fmt.Println(b) //[[1 1] [1 1] [1 1]]
}