Go基础数据结构--数组Array

1. 数组

数组和切片是 Go 语言中常见的数据结构,很多刚刚使用 Go 的开发者往往会混淆这两个概念。数组作为最常见的集合在编程语言中是非常重要的,除了数组之外,Go 语言引入了另一个概念 — 切片,切片与数组有一些类似,但是它们的不同导致了使用上的巨大差别。

Golang Array和以往认知的数组有很大不同

1. 数组:是同一种数据类型的固定长度的序列。
2. 数组定义:var a [len]int,比如:var a [5]int,数组长度必须是常量,且是类型的组成部分。
   一旦定义,长度不能变。
3. 长度是数组类型的一部分,因此,var a[5] int和var a[10]int是不同的类型。
4. 数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1
5. 访问越界,如果下标在数组合法范围之外,则触发访问越界,会panic
6. 数组是值类型,赋值和传参会复制整个数组,而不是指针。因此改变副本的值,不会改变本身的值。
7.支持 "=="、"!=" 操作符,因为内存总是被初始化过的。
8.指针数组 [n]*T,数组指针 *[n]T。

Go 语言的数组有两种不同的创建方式,一种是显式的指定数组大小,另一种是使用 […]T 声明数组,Go 语言会在编译期间通过源代码推导数组的大小:

arr1 := [3]int{1, 2, 3}
arr2 := […]int{1, 2, 3}
arr1 和arr2 在运行时是完全等价的,[…]T 这种初始化方式也只是 Go 语言为我们提供的一种语法糖

1.1 数组初始化:
一维数组:

package main

import (
    "fmt"
)
//全局:
var arr0 [5]int = [5]int{1, 2, 3}
var arr1 = [5]int{1, 2, 3, 4, 5}
var arr2 = [...]int{1, 2, 3, 4, 5, 6}
var str = [5]string{3: "hello", 4: "jay"}

func main() {
	//局部:
    a := [3]int{1, 2}           // 未初始化元素值为 0。
    b := [...]int{1, 2, 3, 4}   // 通过初始化值确定数组长度。
    c := [5]int{2: 100, 4: 200} // 使用索引号初始化元素。
    d := [...]struct { // 结构体初始化,可省略元素类型。
        name string
        age  uint8
    }{
        {"user1", 10}, 
        {"user2", 20}, 
    }
    fmt.Println(arr0, arr1, arr2, str)
    fmt.Println(a, b, c, d)
}

输出结果:

[1 2 3 0 0] [1 2 3 4 5] [1 2 3 4 5 6] [   hello jay]
[1 2 0] [1 2 3 4] [0 0 100 0 200] [{user1 10} {user2 20}]

多维数组:

Go 语言数组在初始化之后大小就无法改变,存储元素类型相同、但是大小不同的数组类型在 Go
语言看来也是完全不同的,只有两个条件都相同才是同一类型。

	//全局
    var arr0 [5][3]int //全局初始化多维数组
    var arr1 [2][3]int = [...][3]int{{1, 2, 3}, {7, 8, 9}}
    //局部:
    a := [2][3]int{{1, 2, 3}, {4, 5, 6}}
    b := [...][2]int{{1, 1}, {2, 2}, {3, 3}} // 第 2 纬度不能用 "..."。
	fmt.Println(arr0, arr1)
    fmt.Println(a, b)

输出结果:

[[0 0 0] [0 0 0] [0 0 0] [0 0 0] [0 0 0]]    [[1 2 3] [7 8 9]]
[[1 2 3] [4 5 6]]                            [[1 1] [2 2] [3 3]]

内置函数 len 和 cap 都返回数组长度 (元素数量)。

a := [2]int{}
println(len(a), cap(a))
out :  长度:2   容量:2

数组拷贝和传参

	package main
	
	import "fmt"
	
	func printArr(arr *[5]int) {
	    arr[0] = 5
	    for i, v := range arr {
	        fmt.Println(i, v)
	    }
	}
	
	func main() {
	    var arr1 [5]int
	    printArr(&arr1)
	    fmt.Println(arr1)
	    arr2 := [...]int{1, 2, 3, 4, 5}
	    printArr(&arr2)
	    fmt.Println(arr2)
	}

输出:
0 5
1 0
2 0
3 0
4 0
[5 0 0 0 0]
0 5
1 2
2 3
3 4
4 5
[5 2 3 4 5]

数组的值拷贝行为会造成性能问题,通常会建议使用 slice,或数组指针。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值