專注做一家男人最愛的網(wǎng)站廣州seo運(yùn)營(yíng)
編程筆記 Golang基礎(chǔ) 024 映射
- 一、映射
- 二、映射的定義與初始化
- 三、基本操作
- 四、綜合示例程序
Go語言中的映射(map)是一種關(guān)聯(lián)數(shù)組或哈希表數(shù)據(jù)結(jié)構(gòu),它存儲(chǔ)鍵值對(duì),其中每個(gè)鍵都是唯一的。在Go中,你可以使用
map[keyType]valueType
來聲明一個(gè)映射。
一、映射
在Go語言中,映射(map)是一種內(nèi)置的數(shù)據(jù)結(jié)構(gòu),它提供了一種關(guān)聯(lián)鍵值對(duì)的方式,允許通過唯一的鍵(key)來存儲(chǔ)和檢索對(duì)應(yīng)的值(value)。映射中的鍵是唯一的,并且用于快速查找相關(guān)聯(lián)的值。這種數(shù)據(jù)結(jié)構(gòu)常被稱為關(guān)聯(lián)數(shù)組、哈希表或字典,在其他編程語言中也有類似的概念。
Go語言中的映射定義語法如下:
map[keyType]ValueType
例如,創(chuàng)建一個(gè)存儲(chǔ)字符串到整數(shù)的映射:
var m map[string]int
使用映射時(shí)需要注意以下幾點(diǎn):
- 映射在使用前必須初始化(可以通過
make
函數(shù)或者直接聲明并初始化),否則會(huì)引發(fā)運(yùn)行時(shí)錯(cuò)誤。 - 映射的鍵必須是可比較類型,也就是說,它們需要支持相等性判斷操作(== 和 !=)。
- 映射是無序的,因此不能保證迭代順序的一致性。
- Go 語言中的映射實(shí)現(xiàn)了高效的查找、插入和刪除操作,這些操作的時(shí)間復(fù)雜度通常接近 O(1)。
示例代碼:
// 初始化一個(gè)映射
m := make(map[string]int)// 插入鍵值對(duì)
m["apple"] = 1
m["banana"] = 2// 根據(jù)鍵查找值
value, ok := m["apple"]
if ok {fmt.Println("The value for key 'apple' is", value)
} else {fmt.Println("Key 'apple' not found")
}// 刪除鍵值對(duì)
delete(m, "banana")
在這個(gè)例子中,“ok”是一個(gè)布爾值,表示查找是否成功找到指定的鍵。如果鍵存在,則“ok”為true,同時(shí)返回相應(yīng)的值;如果鍵不存在,則“ok”為false,返回的值為零值。
二、映射的定義與初始化
// 定義并初始化一個(gè)字符串到整數(shù)的映射
var numbers map[string]int = map[string]int{"one": 1, "two": 2, "three": 3}// 或者直接初始化而不聲明變量類型
numbers := map[string]int{"one": 1, "two": 2, "three": 3}// 使用make函數(shù)創(chuàng)建一個(gè)新的映射(推薦方式)
numbers := make(map[string]int)
numbers["one"] = 1
numbers["two"] = 2
numbers["three"] = 3
三、基本操作
- 插入和訪問元素:
numbers["four"] = 4 // 插入新的鍵值對(duì)
value, exists := numbers["one"] // 訪問元素,exists為bool型,表示鍵是否存在
if exists {fmt.Println("The value of 'one' is", value)
}
- 刪除元素:
delete(numbers, "two") // 刪除鍵為"two"的鍵值對(duì)
- 遍歷映射:
for key, value := range numbers {fmt.Printf("Key: %s, Value: %d\n", key, value)
}
四、綜合示例程序
下面是一個(gè)綜合應(yīng)用的示例程序,該程序創(chuàng)建了一個(gè)學(xué)生姓名到分?jǐn)?shù)的映射,并實(shí)現(xiàn)了添加、查詢、刪除和遍歷操作:
package mainimport ("fmt"
)func main() {// 初始化一個(gè)映射scores := make(map[string]int)// 添加一些學(xué)生的分?jǐn)?shù)scores["Alice"] = 95scores["Bob"] = 85scores["Charlie"] = 90// 查詢并打印某個(gè)學(xué)生的分?jǐn)?shù)if score, ok := scores["Alice"]; ok {fmt.Printf("Alice's score is %d.\n", score)} else {fmt.Println("Alice is not in the records.")}// 更新一個(gè)學(xué)生的分?jǐn)?shù)scores["Bob"] = 90// 刪除一個(gè)學(xué)生記錄delete(scores, "Charlie")// 遍歷并打印所有學(xué)生的分?jǐn)?shù)fmt.Println("All students' scores:")for name, score := range scores {fmt.Printf("%s: %d\n", name, score)}
}
在這個(gè)示例中,我們首先創(chuàng)建了一個(gè)名為scores
的映射,用于存儲(chǔ)學(xué)生姓名及其對(duì)應(yīng)的分?jǐn)?shù)。然后演示了如何向映射中插入數(shù)據(jù)、通過鍵查詢值、更新現(xiàn)有鍵的值以及刪除鍵值對(duì)。最后,通過range
關(guān)鍵字遍歷映射并打印所有的學(xué)生分?jǐn)?shù)。