02. 複合型別(Composite Types)

yyyyyllll發表於2024-09-15

1. 陣列

像大多數程式語言一樣,Go也有陣列。然而,在Go中很少直接使用陣列。
陣列中的所有元素都必須是指定的型別(這並不意味著它們總是相同的型別)。有幾種不同的宣告風格。在第一個語句中,指定陣列的大小和陣列元素的型別:

 var x [3]int

這將建立一個包含三個整型數的陣列。由於沒有指定任何值,因此所有位置(x[0],x[1]和x[2])都被初始化為int型別的零值,當然是0。如果有陣列的初始值,你可以用array literal來指定它們:

var x = [3]int{10, 20, 30}

如果你有一個稀疏陣列(一個大多數元素都被設定為零值的陣列),你可以只指定陣列文字中有值的下標:

var x = [12]int{1, 5: 4, 6, 10: 100, 15}

當使用array literal初始化陣列時,可以省略數字並使用…來代替:

var x = [...]int{10, 20, 30}

可以使用==和!=來比較陣列:

var x = [...]int{1, 2, 3}
var y = [3]int{1, 2, 3}
fmt.Println(x == y) // prints true

Go只有一維陣列,但是可以模擬多維陣列:

var x [2][3]int

這裡宣告x是一個長度為2的陣列,其型別是一個長度為3的整型陣列。這聽起來很迂腐,但是有些語言具有真正的矩陣支援;go不是其中之一。

像大多數語言一樣,Go中的陣列是使用括號語法讀寫的:

x[0] = 10
 fmt.Println(x[2])

內建函式len接受一個陣列並返回其長度:

fmt.Println(len(x))

前面我說過,在Go中很少顯式地使用陣列。這是因為它們有一個不尋常的限制:Go認為陣列的大小是陣列型別的一部分。這使得宣告為[3]int的陣列與宣告為[4]int的陣列型別不同。這也意味著不能使用變數來指定陣列的大小,因為型別必須在編譯時解析,而不是在執行時解析。此外,不能使用型別轉換將不同大小的陣列轉換為相同型別。因為你不能把不同大小的陣列相互轉換,所以你不能編寫一個函式來處理任何大小的陣列,你也不能把不同大小的陣列賦值給同一個變數。

由於這些限制,除非事先知道所需的確切長度,否則不要使用陣列。例如,標準庫中的一些加密函式返回陣列,因為校驗和的大小是作為演算法的一部分定義的。這是例外,不是慣例。

相關文章