Go语言基础 – 数组

  • A+
所属分类:go语言编程 学编程

一、说明

1.数组:是同一种类型的固定长度的序列

2.数组定义:var a[5]int (定义int类型长度为5的序列,数组定义后长度就不可变)

3.长度是数组的一部分,因此 var a[5]int 和 var a[10]int 是不同的类型

4.数组可以通过下标来进行访问,下标是从0开始,最后一个元素下标是:len-1

5.越界访问,如果下标再数组合法范围之外则会触发越界访问,会panic

6.数组是值类型,因此改变副本的值不会改变本身的值

二、数组

2.1、数组定义

数组定义语法如下:

var 数组变量名 [元素数量]数组类型

定义示例:

var a [5]int    // 定义一个长度为5,int类型的数组

2.2、数组初始化

数组的初始化也有很多方式,示例如下:

var arg [5]int = [5]int{1,2,3,4,5}       // 定义时直接初始化,如果初始化的值少时默认以0占位

var arg1 = [5]int{1,2,3,4,5}       // 推导,不写类型时默认会根据值得类型推导

var arg2 = [...]int{1,2,3,4,5}       // 可变长度:根据后面值得长度(如果后面值有五个,数组长度就是五个,六个就是六个)

var str = [5]string{3:"hello world", 4:"tom"}    // 指定下标初始化,下标为3得值为:"hello world",下标为4得值为:"tom",没指定下标得就是空值

2.3、数组遍历

func testArray() {
    var a[10]int    // 定义数组
    a[0] = 100    // 给数组赋值
    a[9] = 200
    fmt.Println(a)   // 查看数组

    /*   数组的两种便利方法:
    1.for i :=0; i < len(a); i ++ {
        fmt.Printf("index:%d,value:%d\n", i, a[i])
     }

    2. for k, r := range a {
        fmt.Printf("index:%d,value:%d\n", k, r)
     }
    */
}

三、多维数组

Go语言是支持多维数组的,我们这里以二维数组为例(数组中又嵌套数组)。

二维数组的定义与便利示例如下:

func testArray2() {
    var a1 [2][5]int = [...][5]int{{1, 2, 3, 4, 5}, {6, 7, 8, 9, 0}}     //  多维数组赋值:每行用一个大括号表示,每个大括号里五列
    for row,v := range a1 {
        for col, v1 := range v {
            fmt.Printf("(%d,%d)=%d", row, col, v1)     // row:表示行、col:表示列、v1为值
        }
        fmt.Println()
    }
}

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

//支持的写法
a := [...][2]string{
    {"北京", "上海"},
    {"广州", "深圳"},
    {"成都", "重庆"},
}
//不支持多维数组的内层使用...
b := [3][...]string{
    {"北京", "上海"},
    {"广州", "深圳"},
    {"成都", "重庆"},
}

四、数组的赋值和传参

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

func numGroup2() {
    var a[10]int
    b := a
    b[0] = 300
    fmt.Println("a :", a )      // 结果为:a : [0 0 0 0 0 0 0 0 0 0] 
    fmt.Println("b :", b)       // 结果为:b : [300 0 0 0 0 0 0 0 0 0]
}

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: