Go语言基础四——数组Array

198 阅读3分钟

我正在参加「掘金·启航计划」

数组是同一种数据类型元素的固定长度的集合,在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
}