Go基础之数组

Go基础之数组

Array(数组)

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

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

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

数组的初始化

方式一

初始化数组时能够使用初始化列表来设置数组元素的值索引

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()
    }
}
//北京  上海  
//广州  深圳  
//成都  武汉

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

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

数组是值类型

数组是值类型,赋值和传参会复制整个数组。所以改变副本的值,不会改变自己的值for循环

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
相关文章
相关标签/搜索