GoGolang语言社区

go 基础内容总结二(数组)

2019-07-18  本文已影响4人  ljh123

go语言中的数组是不可边长的
定义:
1)var a [length]type
2)a := [length]type{}

这个数组变量只有当长度一样,类型一样时,才能进行相互赋值,不然不能赋值,因为长度或类型有一个不一样时,就属于不同的数据类型
取值的话,是从下标0开始到长度-1

go语言中的数组是值传递,就是说,当把一个数组赋值给另一个同类型数组时,会先把数据拷贝一份过去。
注:go语言可以直接定义成n维数组

go语言中数组的底层实现原理:
几乎所有的计算机语言,数据的实现的实现都是相似的:一段连续的内存,Go语言也是这样。根据下面的代码可以测试出Go中数组是一段连续的内存,n维也是如此。[n1][n2][n3]Type的数组是一个长度为n1n2n3的连续内存。

package main

import "fmt"

func main() {
    fmt.Println("----------一维数组-------------")
    var a1 [5]int
    fmt.Println(&a1[0], &a1[1], &a1[2], &a1[3])
    var a2 [5][5]int
    fmt.Println("----------二维数组-------------")
    fmt.Println(&a2[0][0], &a2[0][1], &a2[0][2], &a2[0][3], &a2[0][4])
    fmt.Println(&a2[1][0], &a2[1][1], &a2[1][2], &a2[1][3], &a2[1][4])
    fmt.Println(&a2[2][0], &a2[2][1], &a2[2][2], &a2[2][3], &a2[2][4])
    fmt.Println(&a2[3][0], &a2[3][1], &a2[3][2], &a2[3][3], &a2[3][4])
    fmt.Println("----------三维数组-------------")
    var a3 [5][5][5]int
    fmt.Println(&a3[0][0][0], &a3[0][0][1], &a3[0][0][2], &a3[0][0][3], &a3[0][0][4])
    fmt.Println(&a3[0][1][0], &a3[0][1][1], &a3[0][1][2], &a3[0][1][3], &a3[0][1][4])
    fmt.Println(&a3[0][2][0], &a3[0][2][1], &a3[0][2][2], &a3[0][2][3], &a3[0][2][4])
    fmt.Println(&a3[0][3][0], &a3[0][3][1], &a3[0][3][2], &a3[0][3][3], &a3[0][3][4])
    fmt.Println(&a3[0][4][0], &a3[0][4][1], &a3[0][4][2], &a3[0][4][3], &a3[0][4][4])
    fmt.Println(&a3[1][0][0], &a3[1][0][1], &a3[1][0][2], &a3[1][0][3], &a3[1][0][4])
    fmt.Println(&a3[1][1][0], &a3[1][1][1], &a3[1][1][2], &a3[1][1][3], &a3[1][1][4])
    fmt.Println(&a3[1][2][0], &a3[1][2][1], &a3[1][2][2], &a3[1][2][3], &a3[1][2][4])
}

输出

----------一维数组-------------
0xc0000161e0 0xc0000161e8 0xc0000161f0 0xc0000161f8
----------二维数组-------------
0xc000080000 0xc000080008 0xc000080010 0xc000080018 0xc000080020
0xc000080028 0xc000080030 0xc000080038 0xc000080040 0xc000080048
0xc000080050 0xc000080058 0xc000080060 0xc000080068 0xc000080070
0xc000080078 0xc000080080 0xc000080088 0xc000080090 0xc000080098
----------三维数组-------------
0xc000082000 0xc000082008 0xc000082010 0xc000082018 0xc000082020
0xc000082028 0xc000082030 0xc000082038 0xc000082040 0xc000082048
0xc000082050 0xc000082058 0xc000082060 0xc000082068 0xc000082070
0xc000082078 0xc000082080 0xc000082088 0xc000082090 0xc000082098
0xc0000820a0 0xc0000820a8 0xc0000820b0 0xc0000820b8 0xc0000820c0
0xc0000820c8 0xc0000820d0 0xc0000820d8 0xc0000820e0 0xc0000820e8
0xc0000820f0 0xc0000820f8 0xc000082100 0xc000082108 0xc000082110
0xc000082118 0xc000082120 0xc000082128 0xc000082130 0xc000082138

可以看出是不管是一维数组、二维数组、还是三维数组,数组的内存空间都是连续的

上一篇下一篇

猜你喜欢

热点阅读