Arrays and Slice in Golang.

About 1009 wordsAbout 3 min

Golang

2024-8-7


笔记记录了Golang中的数组的定义。

概述

go在数组和切片的设计上明显收到python的影响。

以  []  符号标识的数组类型几乎在所有的编程语言中都是一个基本主力。Go 语言中的数组也是类似的,只是有一些特点。Go 没有 C 那么灵活,但是拥有切片(slice)类型。这是一种建立在 Go 语言数组类型之上的抽象,要想理解切片我们必须先理解数组。数组有特定的用处,但是却有一些呆板,所以在 Go 语言的代码里并不是特别常见。相对的,切片确实随处可见的。它们构建在数组之上并且提供更强大的能力和便捷

声明和初始化

概述

数组是具有相同  唯一类型  的一组已编号且长度固定的数据项序列(这是一种同构的数据结构);这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。数组长度必须是一个常量表达式,并且必须是一个非负整数。数组长度也是数组类型的一部分,所以[5]int [10]int是属于不同类型的。数组的编译时值初始化是按照数组顺序完成的。

数组元素可以通过  索引(位置)来读取(或者修改),索引从 0 开始,第一个元素索引为 0,第二个索引为 1,以此类推。(数组以 0 开始在所有类 C 语言中是相似的)。元素的数目,也称为长度或者数组大小必须是固定的并且在声明该数组时就给出(编译时需要知道数组长度以便分配内存);数组长度最大内存用量 2Gb (256MB , 大约2^28int32)

数组声明的格式

var identifier [len]type

例如

var arr1 [5]int

遍历

遍历数组

写法一

package main
import "fmt"

func main() {
	var arr1 [5]int

	for i:=0; i < len(arr1); i++ {
		arr1[i] = i * 2
	}

	for i:=0; i < len(arr1); i++ {
		fmt.Printf("Array at index %d is %d
", i, arr1[i])
	}
}

输出

Array at index 0 is 0
Array at index 1 is 2
Array at index 2 is 4
Array at index 3 is 6
Array at index 4 is 8

写法二

package main
import "fmt"

func main() {
	var arr1 [5]int

	for i , _ := range arr1 {
		fmt.Printf("index: %d , value: %d
" , i , arr1[i]);
	}

}

输出

index: 0 , value: 0
index: 1 , value: 0
index: 2 , value: 0
index: 3 , value: 0
index: 4 , value: 0

遍历串

a := [...]string {"a", "b", "c", "d"}
for i := range a {
	fmt.Println("Array item", i, "is", a[i])
}

数组元素的类型

var arr1 = new([5]int)

arr1的类型是 *[5]int , 以c++的方式理解,是个指针(引用)类型。

var arr2 [5]int

arr2的类型是 [5]int , 是一种值类型。

深浅拷贝

浅拷贝例子

var arr1 = new([5]int)
arr1[3] = 100
var arr2 = arr1 // shallow copy
arr2[3] = 99
fmt.Println("%d %d", arr1[3], arr2[3])
99 99

深拷贝的例子

var arr3 [5]int = [...]int{1, 2, 3, 4, 5}
arr3[3] = 100
var arr4 = arr3 // deep copy
arr4[3] = 99
fmt.Println("%d %d", arr3[3], arr4[3])
100 99

参数传递

package main
import "fmt"
func f(a [3]int) { fmt.Println(a) }
func fp(a *[3]int) { fmt.Println(a) }

func main() {
	var ar [3]int
	f(ar) 	// passes a copy of ar
	fp(&ar) // passes a pointer to ar
}

\

数组常量

如果数组值已经提前知道了,那么可以通过 数组常量 的方法来初始化数组。

写法一

var arrAge = [5]int{18, 20, 15, 22, 16}

支持部分初始化,类似[10]int {1 , 2 , 3} 未初始化的位置都为零。

写法二

var arrLazy = [...]int{5, 6, 7, 8, 22}

类似于一种解包操作。

写法三

var arrKeyValue = [5]string{3: "Chris", 4: "Ron"}

key-value语法,赋值特定的位置。

多维数组

package main
const (
	WIDTH  = 1920
	HEIGHT = 1080
)

type pixel int
var screen [WIDTH][HEIGHT]pixel

func main() {
	for y := 0; y < HEIGHT; y++ {
		for x := 0; x < WIDTH; x++ {
			screen[x][y] = 0
		}
	}
}

公安备案: 32020502000797
ICP备2021005150号