Go的数组

Go的数组

Array(数组)

Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化

var 数组变量名 [元素数量]T
// 定义一个长度为3元素类型为int的数组a
var a [3]int
  • 数组的长度必须是常量,并且长度是数组类型的一部分。一旦定义,长度不能变。 [3]int[5]int是不同的类型

  • 数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1,访问越界(下标在合法范围之外),则触发访问越界,会panic。

数组的初始化

方式一

初始化数组时可以使用初始化列表来设置数组元素的值

func main() {
  var Array1 [3]int
  var Array2 = [3]int{1, 2}
  var Array3 = [3]string{"北京", "上海", "广州"}
  fmt.Println(Array1)
  fmt.Println(Array2)
  fmt.Println(Array3)
}
//[0 0 0]
//[1 2 0]
//[北京 上海 广州]

方式二

按照上面的方法每次都要确保提供的初始值和数组长度一致,一般情况下我们可以让编译器根据初始值的个数自行推断数组的长度

func main() {
  var Array1 [3]int
  var Array2 = [...]int{1, 2}
  var Array3 = [...]string{"北京", "上海", "广州"}
  fmt.Println(Array1)
  fmt.Println(Array2)
  fmt.Printf("type of Array2: %T\n", Array2)
  fmt.Println(Array3)
  fmt.Printf("type of Array3: %T\n", Array3)
}
//[0 0 0]
//[1 2]
//type of Array2: [2]int
//[北京 上海 广州]
//type of Array3: [3]string

方式三

使用指定索引值的方式来初始化数组

func main() {
  a := [...]int{1:1, 3:5}
  fmt.Println(a)
  fmt.Printf("type of a: %T\n", a)
}
//[0 1 0 5]
//type of a: [4]int

数组的遍历

func main() {
  a := [...]string{"北京", "上海", "广州"}
  // 方法一:for循环遍历
  for i := 0; i < len(a); i++ {
    fmt.Println(a[i])
  }
  // 方法二:for range遍历
  for index, value := range a {
    fmt.Println(index, value)
  }
}
//北京
//上海
//广州
//0 北京
//1 上海
//2 广州

多维数组

二维数组

func main() {
	a := [3][2]string{
		{"北京", "上海"},
		{"广州", "深圳"},
		{"成都", "武汉"},
	}
	for _, value1 := range a {
		for _, value2 := range value1 {
			fmt.Printf("%s  ", value2)
		}
		fmt.Println()
	}
}
//北京  上海  
//广州  深圳  
//成都  武汉

注意: 多维数组只有第一层可以使用...来让编译器推导数组长度

//支持的写法
a := [...][2]string{
	{"北京", "上海"},
	{"广州", "深圳"},
	{"成都", "重庆"},
}

数组是值类型

数组是值类型,赋值和传参会复制整个数组。因此改变副本的值,不会改变本身的值

func modifyArray(x [3]int) {
	x[0] = 666
}
func modifyArray2(x [3][2]int) {
	x[2][0] = 777
}
func main() {
	a := [3]int{1, 2, 3}
	b := [3][2]int{
		{1, 1},
		{2, 2},
		{3, 3},
	}
	modifyArray(a) //在modifyArray中修改的是a的副本x
	fmt.Println(a)
	modifyArray2(b) //在modifyArray2中修改的是b的副本x
	fmt.Println(b)
}
//[1 2 3]
//[[1 1] [2 2] [3 3]]

注意

  • 数组是值类型
  • 数组支持 “==“、”!=” 操作符,因为内存总是被初始化过的
  • [n]*T表示指针数组,*[n]T表示数组指针
//指针数组 数组里面的元素是指针
[5]*int

//数组指针 这是一个指针
*[5]int
posted @ 2019-12-27 09:43  _慕  阅读(299)  评论(0编辑  收藏  举报
Title
返回顶部