go語言中元組是什麼

2022-12-27 14:00:37

元組是固定長度不可變的順序容器(元素序列),go語言中沒有元組型別,陣列就相當於元組。在go語言中,陣列是一個由固定長度的特定型別元素組成的序列,一個陣列可以由零個或多個元素組成;陣列的宣告語法為「var 陣列變數名 [元素數量]Type」。

本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

什麼是元組

元組(tuple):固定長度不可變的順序容器,存取效率高,適合儲存一些長常數資料。

簡單的理解就是將一堆資料存放到一個容器中,但這個容器有一個特點,就是很固執,一旦定義了之後就不可改變,從某種意義上來說元組就是不可以改變的列表,功能和列表類似,同樣可以進行切片、修改等操作。

go語言中沒有元組型別

go語言中的陣列相當於python中的元組。

陣列是一個由固定長度的特定型別元素組成的序列,一個陣列可以由零個或多個元素組成。

Go語言中的陣列

陣列的宣告

陣列的宣告語法如下:

var 陣列變數名 [元素數量]Type
登入後複製

語法說明如下所示:

  • 陣列變數名:陣列宣告及使用時的變數名。

  • 元素數量:陣列的元素數量,可以是一個表示式,但最終通過編譯期計算的結果必須是整型數值,元素數量不能含有到執行時才能確認大小的數值。

  • Type:可以是任意基本型別,包括陣列本身,型別為陣列本身時,可以實現多維陣列。

在 Go 語言中 , 要建立陣列, 可宣告一個陣列變數,並指定其長度和資料型別。

只包含兩個元素,無法給第 3 個元素賦值,因此這將導致編 譯階段錯誤。

var cheeses [2]string
cheeses[O] = "Mar iolles」
cheeses[l] = 」 Epoisses de Bourgogne 」
登入後複製

陣列的每個元素都可以通過索引下標來存取,索引下標的範圍是從 0 開始到陣列長度減 1 的位置,內建函數 len() 可以返回陣列中元素的個數。

var a [3]int             // 定義三個整數的陣列
fmt.Println(a[0])        // 列印第一個元素
fmt.Println(a[len(a)-1]) // 列印最後一個元素
// 列印索引和元素
for i, v := range a {
    fmt.Printf("%d %d\n", i, v)
}
// 僅列印元素
for _, v := range a {
    fmt.Printf("%d\n", v)
}
登入後複製

預設情況下,陣列的每個元素都會被初始化為元素型別對應的零值,對於數位型別來說就是 0,同時也可以使用陣列字面值語法,用一組值來初始化陣列:

var q [3]int = [3]int{1, 2, 3}
var r [3]int = [3]int{1, 2}
fmt.Println(r[2]) // "0"
登入後複製

在陣列的定義中,如果在陣列長度的位置出現「...」省略號,則表示陣列的長度是根據初始化值的個數來計算,因此,上面陣列 q 的定義可以簡化為:

q := [...]int{1, 2, 3}
fmt.Printf("%T\n", q) // "[3]int"
登入後複製

陣列的長度是陣列型別的一個組成部分,因此 [3]int 和 [4]int 是兩種不同的陣列型別,陣列的長度必須是常數表示式,因為陣列的長度需要在編譯階段確定。

q := [3]int{1, 2, 3}
q = [4]int{1, 2, 3, 4} // 編譯錯誤:無法將 [4]int 賦給 [3]int
登入後複製

比較兩個陣列是否相等

如果兩個陣列型別相同(包括陣列的長度,陣列中元素的型別)的情況下,我們可以直接通過較運運算元(==和!=)來判斷兩個陣列是否相等,只有當兩個陣列的所有元素都是相等的時候陣列才是相等的,不能比較兩個型別不同的陣列,否則程式將無法完成編譯。

a := [2]int{1, 2}
b := [...]int{1, 2}
c := [2]int{1, 3}
fmt.Println(a == b, a == c, b == c) // "true false false"
d := [3]int{1, 2}
fmt.Println(a == d) // 編譯錯誤:無法比較 [2]int == [3]int
登入後複製

遍歷陣列——存取每一個陣列元素

遍歷陣列也和遍歷切片類似,程式碼如下所示:

var team [3]string
team[0] = "hammer"
team[1] = "soldier"
team[2] = "mum"
for k, v := range team {
    fmt.Println(k, v)
}
登入後複製

程式碼輸出結果:

1.png

程式碼說明如下:

  • 第 6 行,使用 for 迴圈,遍歷 team 陣列,遍歷出的鍵 k 為陣列的索引,值 v 為陣列的每個元素值。

  • 第 7 行,將每個鍵值列印出來。

Golang中實現tuple(元組)功能

雖然其他語言有tuple型別,但go語言卻沒有提供。但無需失望,go的其他特性可以非常容易實現tuple功能。下面通過範例來演示Go如何實現tuple型別功能。

使用struct

tuple可以儲存不同資料型別,我們可以使用interface{}型別支援任意資料型別。

package main

import "fmt"

func main() {
	type Student struct {
		name, age interface{}
	}

	stuList1 := []Student{
		{"tom", 21},
		{"jack", 22},
	}

	stuList2 := []Student{
		{"mary", 30},
	}
	// append stuList2 to stuList1
	stuList1 = append(stuList1, stuList2...)

	for _, stu := range stuList1 {
		fmt.Println(「stuInfo:」,stu)
	}
}


/*
Output:
stuInfo: {tom 21}
stuInfo: {jack 22}
stuInfo: {mary 30}
*/
登入後複製

通過輸出可以看到結果為類似於tuple型別,並且還可以通過點號存取單個屬性。雖然這些特性都於tuple相關,但實際上它不是tuple型別。

返回多個值

通過tuple 函數可以返回多個值。雖然go沒有tuple型別,但支援返回函數返回多個值:

package main

import "fmt"

func multipleValues() (string, int) {
	return "Alex", 21
}

func main() {
	name, age := multipleValues()
	fmt.Println("Name :", name)
	fmt.Println("Age :", age)
}

/*
Output:
Name : Alex
Age : 21
*/
登入後複製

這裡可以看到一次返回多個值。

【相關推薦:Go視訊教學、】

以上就是go語言中元組是什麼的詳細內容,更多請關注TW511.COM其它相關文章!