?? 博主 libin9iOak帶您 Go to Golang Language.?
?? 個人主頁——libin9iOak的博客??
?? 《面試題大全》 文章圖文并茂??生動形象??簡單易學!歡迎大家來踩踩~??
?? 《IDEA開發(fā)秘籍》學會IDEA常用操作,工作效率翻倍~??
?? 希望本文能夠給您帶來一定的幫助??文章粗淺,敬請批評指正!??
摘要:
本文是《100天精通Golang(基礎入門篇)》系列的第12天,主要深入解析Go語言中的集合(Map)及常用函數(shù)的應用。文章從介紹什么是Map開始,然后詳細講解了Map的使用方法,包括使用make()函數(shù)創(chuàng)建map、delete()函數(shù)的使用、ok-idiom的應用、獲取map的長度以及map作為引用類型的特點。此外,還提供了多個綜合代碼案例,幫助讀者更好地理解和應用所學知識。通過本文的學習,讀者將對Go語言中的集合(Map)有更深入的了解。
前言:
Go語言中的集合(Map)是一種重要的數(shù)據(jù)結(jié)構,它可以存儲鍵值對,并提供了快速的查找和插入操作。在本篇文章中,我們將詳細介紹Map的使用方法,并結(jié)合實際代碼案例進行講解。通過學習本文,讀者將能夠掌握如何正確地創(chuàng)建和操作Map,并了解其常用的函數(shù)應用。這將為讀者打下堅實的基礎,為進一步深入學習和應用Go語言打下基礎。
一、集合(Map)
1.1 什么是Map
map是Go中的內(nèi)置類型,它將一個值與一個鍵關聯(lián)起來。可以使用相應的鍵檢索值。
Map 是一種無序的鍵值對的集合。Map 最重要的一點是通過 key 來快速檢索數(shù)據(jù),key 類似于索引,指向數(shù)據(jù)的值
Map 是一種集合,所以我們可以像迭代數(shù)組和切片那樣迭代它。不過,Map 是無序的,我們無法決定它的返回順序,這是因為 Map 是使用 hash 表來實現(xiàn)的,也是引用類型
使用map過程中需要注意的幾點:
- map是無序的,每次打印出來的map都會不一樣,它不能通過index獲取,而必須通過key獲取
- map的長度是不固定的,也就是和slice一樣,也是一種引用類型
- 內(nèi)置的len函數(shù)同樣適用于map,返回map擁有的key的數(shù)量
- map的key可以是所有可比較的類型,如布爾型、整數(shù)型、浮點型、復雜型、字符串型……也可以鍵。
1.2 Map的使用
1.2.1 使用make()創(chuàng)建map
可以使用內(nèi)建函數(shù) make 也可以使用 map 關鍵字來定義 Map:
/* 聲明變量,默認 map 是 nil */
var map_variable map[key_data_type]value_data_type
/* 使用 make 函數(shù) */
map_variable = make(map[key_data_type]value_data_type)
rating := map[string]float32 {"C":5, "Go":4.5, "Python":4.5, "C++":2 }
如果不初始化 map,那么就會創(chuàng)建一個 nil map。nil map 不能用來存放鍵值對
package main
import "fmt"
func main() {
var countryCapitalMap map[string]string
/* 創(chuàng)建集合 */
countryCapitalMap = make(map[string]string)
/* map 插入 key-value 對,各個國家對應的首都 */
countryCapitalMap["France"] = "Paris"
countryCapitalMap["Italy"] = "Rome"
countryCapitalMap["Japan"] = "Tokyo"
countryCapitalMap["India"] = "New Delhi"
/* 使用 key 輸出 map 值 */
for country := range countryCapitalMap {
fmt.Println("Capital of",country,"is",countryCapitalMap[country])
}
/* 查看元素在集合中是否存在 */
captial, ok := countryCapitalMap["United States"]
/* 如果 ok 是 true, 則存在,否則不存在 */
if(ok){
fmt.Println("Capital of United States is", captial)
}else {
fmt.Println("Capital of United States is not present")
}
}
運行結(jié)果:
Capital of France is Paris
Capital of Italy is Rome
Capital of Japan is Tokyo
Capital of India is New Delhi
Capital of United States is not present
1.2.2 delete() 函數(shù)
delete(map, key) 函數(shù)用于刪除集合的元素, 參數(shù)為 map 和其對應的 key。刪除函數(shù)不返回任何值。
package main
import "fmt"
func main() {
/* 創(chuàng)建 map */
countryCapitalMap := map[string] string {"France":"Paris","Italy":"Rome","Japan":"Tokyo","India":"New Delhi"}
fmt.Println("原始 map")
/* 打印 map */
for country := range countryCapitalMap {
fmt.Println("Capital of",country,"is",countryCapitalMap[country])
}
/* 刪除元素 */
delete(countryCapitalMap,"France");
fmt.Println("Entry for France is deleted")
fmt.Println("刪除元素后 map")
/* 打印 map */
for country := range countryCapitalMap {
fmt.Println("Capital of",country,"is",countryCapitalMap[country])
}
}
運行結(jié)果:
原始 map
Capital of France is Paris
Capital of Italy is Rome
Capital of Japan is Tokyo
Capital of India is New Delhi
Entry for France is deleted
刪除元素后 map
Capital of Italy is Rome
Capital of Japan is Tokyo
Capital of India is New Delhi
1.2.3 ok-idiom
我們可以通過key獲取map中對應的value值。語法為:
map[key]
但是當key如果不存在的時候,我們會得到該value值類型的默認值,比如string類型得到空字符串,int類型得到0。但是程序不會報錯。
所以我們可以使用ok-idiom獲取值,可知道key/value是否存在
value, ok := map[key]
示例代碼:
package main
import (
"fmt"
)
func main() {
m := make(map[string]int)
m["a"] = 1
x, ok := m["b"]
fmt.Println(x, ok)
x, ok = m["a"]
fmt.Println(x, ok)
}
運行結(jié)果:
0 false
1 true
1.2.4 map的長度
使用len函數(shù)可以確定map的長度。
len(map) // 可以得到map的長度
1.2.5 map是引用類型的
與切片相似,映射是引用類型。當將映射分配給一個新變量時,它們都指向相同的內(nèi)部數(shù)據(jù)結(jié)構。因此,一個的變化會反映另一個。
示例代碼:
package main
import (
"fmt"
)
func main() {
personSalary := map[string]int{
"steve": 12000,
"jamie": 15000,
}
personSalary["mike"] = 9000
fmt.Println("Original person salary", personSalary)
newPersonSalary := personSalary
newPersonSalary["mike"] = 18000
fmt.Println("Person salary changed", personSalary)
}
運行結(jié)果:
Original person salary map[steve:12000 jamie:15000 mike:9000]
Person salary changed map[steve:12000 jamie:15000 mike:18000]
map不能使用==操作符進行比較。==只能用來檢查map是否為空。否則會報錯:invalid operation: map1 == map2 (map can only be comparedto nil)
綜合代碼案例
綜合代碼案例1 :
package main
import "fmt"
func main() {
/*
map:映射,是一種專門用于存儲鍵值對的集合。屬于引用類型
存儲特點:
A:存儲的是無序的鍵值對
B:鍵不能重復,并且和value值一一對應的。
map中的key不能重復,如果重復,那么新的value會覆蓋原來的,程序不會報錯。
語法結(jié)構:
1.創(chuàng)建map
var map1 map[key類型]value類型
nil map,無法直接使用
var map2 = make(map[key類型])value類型
var map3 = map[key類型]value類型{key:value,key:value,key:value...}
2.添加/修改
map[key]=value
如果key不存在,就是添加數(shù)據(jù)
如果key存在,就是修改數(shù)據(jù)
3.獲取
map[key]-->value
value,ok := map[key]
根據(jù)key獲取對應的value
如果key存在,value就是對應的數(shù)據(jù),ok為true
如果key不存在,value就是值類型的默認值,ok為false
4.刪除數(shù)據(jù):
delete(map,key)
如果key存在,就可以直接刪除
如果key不存在,刪除失敗
5.長度:
len()
每種數(shù)據(jù)類型:
int:0
float:0.0-->0
string:""
array:[00000]
slice:nil
map:nil
*/
//1.創(chuàng)建map
var map1 map[int]string //沒有初始化,nil
var map2 = make(map[int]string) //創(chuàng)建
var map3 = map[string]int{"Go": 98, "Python": 87, "Java": 79, "Html": 93}
fmt.Println(map1)
fmt.Println(map2)
fmt.Println(map3)
fmt.Println(map1 == nil)
fmt.Println(map2 == nil)
fmt.Println(map3 == nil)
//2.nil map
if map1 == nil {
map1 = make(map[int]string)
fmt.Println(map1 == nil)
}
//3.存儲鍵值對到map中
//map1[key] = value
map1[1] = "hello" //panic: assignment to entry in nil map
map1[2] = "world"
map1[3] = "memeda"
map1[4] = "libin9ioak"
map1[5] = "ruby"
map1[6] = "libin9iOak"
map1[7] = ""
//4.獲取數(shù)據(jù),根據(jù)key獲取對應的value值
//根據(jù)key獲取對應的value,如果key存在,獲取數(shù)值,如果key不存在,獲取的是value值類型的零值
fmt.Println(map1)
fmt.Println(map1[4]) //根據(jù)key為4,獲取對應的value值
fmt.Println(map1[40]) //""
v1, ok := map1[40]
if ok {
fmt.Println("對應的數(shù)值是:", v1)
} else {
fmt.Println("操作的key不存在,獲取到的是零值:", v1)
}
//5.修改數(shù)據(jù)
fmt.Println(map1)
map1[3] = "李如花"
fmt.Println(map1)
//6.刪除數(shù)據(jù)
delete(map1, 3)
fmt.Println(map1)
delete(map1, 30)
fmt.Println(map1)
//7.長度
fmt.Println(len(map1))
}
運行結(jié)果:
GOROOT=D:\Go #gosetup
GOPATH=C:\Users\DELL\go #gosetup
D:\Go\bin\go.exe build -o C:\Users\DELL\AppData\Local\JetBrains\GoLand2023.1\tmp\GoLand\___go_build_Day12_Map.exe Day12-Map #gosetup
C:\Users\DELL\AppData\Local\JetBrains\GoLand2023.1\tmp\GoLand\___go_build_Day12_Map.exe
map[]
map[]
map[Go:98 Html:93 Java:79 Python:87]
true
false
false
false
map[1:hello 2:world 3:memeda 4:libin9ioak 5:ruby 6:libin9iOak 7:]
libin9ioak
操作的key不存在,獲取到的是零值:
map[1:hello 2:world 3:memeda 4:libin9ioak 5:ruby 6:libin9iOak 7:]
map[1:hello 2:world 3:李如花 4:libin9ioak 5:ruby 6:libin9iOak 7:]
map[1:hello 2:world 4:libin9ioak 5:ruby 6:libin9iOak 7:]
map[1:hello 2:world 4:libin9ioak 5:ruby 6:libin9iOak 7:]
6
進程 已完成,退出代碼為 0
運行截圖:
綜合代碼案例2:
package main
import (
"fmt"
"sort"
)
func main() {
/*
map的遍歷:
使用:for range
數(shù)組,切片:index,value
map:key,value
*/
map1 := make(map[int]string)
map1[1] = "小紅"
map1[2] = "小風"
map1[3] = "小白"
map1[4] = "小貞"
map1[5] = "大王"
map1[6] = "小王"
//1.遍歷map
for k, v := range map1 {
fmt.Println(k, v)
}
fmt.Println("----------------------")
for i := 1; i <= len(map1); i++ {
fmt.Println(i, "--->", map1[i])
}
/*
1.獲取所有的key,-->切片/數(shù)組
2.進行排序
3.遍歷key,--->map[key]
*/
keys := make([]int, 0, len(map1))
fmt.Println(keys)
for k, _ := range map1 {
keys = append(keys, k)
}
fmt.Println(keys)
//冒泡排序,或者使用sort包下的排序方法
sort.Ints(keys)
fmt.Println(keys)
for _, key := range keys {
fmt.Println(key, map1[key])
}
s1 := []string{"Apple", "Windows", "Orange", "Inter", "小王", "18", "女"}
fmt.Println(s1)
sort.Strings(s1)
fmt.Println(s1)
}
運行結(jié)果:
GOROOT=D:\Go #gosetup
GOPATH=C:\Users\DELL\go #gosetup
D:\Go\bin\go.exe build -o C:\Users\DELL\AppData\Local\JetBrains\GoLand2023.1\tmp\GoLand\___go_build_Day12_Map__1_.exe D:\GolandProjects\Day12-Map\MapDemo2.go #gosetup
C:\Users\DELL\AppData\Local\JetBrains\GoLand2023.1\tmp\GoLand\___go_build_Day12_Map__1_.exe
3 小白
4 小貞
5 大王
6 小王
1 小紅
2 小風
----------------------
1 ---> 小紅
2 ---> 小風
3 ---> 小白
4 ---> 小貞
5 ---> 大王
6 ---> 小王
[]
[5 6 1 2 3 4]
[1 2 3 4 5 6]
1 小紅
2 小風
3 小白
4 小貞
5 大王
6 小王
[Apple Windows Orange Inter 小王 18 女]
[18 Apple Inter Orange Windows 女 小王]
進程 已完成,退出代碼為 0
運行截圖:
綜合代碼案例3 :
package main
import "fmt"
func main() {
/*
map和slice的結(jié)合使用:
1.創(chuàng)建map用于存儲人的信息
name,age,sex,address
2.每個map存儲一個人的信息
3.將這些map存入到slice中
4.打印遍歷輸出
*/
//1.創(chuàng)建map存儲第一個人的信息
map1 := make(map[string]string)
map1["name"] = "小張"
map1["age"] = "22"
map1["sex"] = "男"
map1["address"] = "北京市海淀區(qū)XX路XX號"
fmt.Println(map1)
//2.第二個人
map2 := make(map[string]string)
map2["name"] = "小李"
map2["age"] = "20"
map2["sex"] = "女性"
map2["address"] = "上海市閔行三角洲"
fmt.Println(map2)
//3.
map3 := map[string]string{"name": "go", "age": "16", "sex": "女性", "address": "谷歌"}
fmt.Println(map3)
//將map存入到slice中
s1 := make([]map[string]string, 0, 3)
s1 = append(s1, map1)
s1 = append(s1, map2)
s1 = append(s1, map3)
//遍歷切片
for i, val := range s1 {
//val :map1,map2,map3
fmt.Printf("第 %d 個人的信息是:\n", i+1)
fmt.Printf("\t姓名:%s\n", val["name"])
fmt.Printf("\t年齡:%s\n", val["age"])
fmt.Printf("\t性別:%s\n", val["sex"])
fmt.Printf("\t地址:%s\n", val["address"])
}
}
運行結(jié)果:
GOROOT=D:\Go #gosetup
GOPATH=C:\Users\DELL\go #gosetup
D:\Go\bin\go.exe build -o C:\Users\DELL\AppData\Local\JetBrains\GoLand2023.1\tmp\GoLand\___go_build_Day12_Map__2_.exe D:\GolandProjects\Day12-Map\MapDemo3.go #gosetup
C:\Users\DELL\AppData\Local\JetBrains\GoLand2023.1\tmp\GoLand\___go_build_Day12_Map__2_.exe
map[address:北京市海淀區(qū)XX路XX號 age:22 name:小張 sex:男]
map[address:上海市閔行三角洲 age:20 name:小李 sex:女性]
map[address:谷歌 age:16 name:go sex:女性]
第 1 個人的信息是:
姓名:小張
年齡:22
性別:男
地址:北京市海淀區(qū)XX路XX號
第 2 個人的信息是:
姓名:小李
年齡:20
性別:女性
地址:上海市閔行三角洲
第 3 個人的信息是:
姓名:go
年齡:16
性別:女性
地址:谷歌
進程 已完成,退出代碼為 0
運行截圖:
綜合代碼案例4 :
package main
import "fmt"
func main() {
/*
一:數(shù)據(jù)類型:
基本數(shù)據(jù)類型:int,float,string,bool
復合數(shù)據(jù)類型:array,slice,map,function,pointer,struct。。。
array:[size]數(shù)據(jù)類型
slice:[]數(shù)據(jù)類型
map:map[key的類型]value的類型
二:存儲特點:
值類型:int,float,string,bool,array,struct
引用類型:slice,map
make(),slice,map,chan
*/
map1 := make(map[int]string)
map2 := make(map[string]float64)
fmt.Printf("%T\n", map1)
fmt.Printf("%T\n", map2)
map3 := make(map[string]map[string]string) //map[string]map[string]string
m1 := make(map[string]string)
m1["name"] = "小李"
m1["age"] = "22"
m1["salary"] = "999999"
map3["hr"] = m1
m2 := make(map[string]string)
m2["name"] = "go"
m2["age"] = "16"
m2["salary"] = "80000"
map3["總經(jīng)理"] = m1
fmt.Println(map3)
fmt.Println("---------------")
map4 := make(map[string]string)
map4["小王"] = "美"
map4["小李"] = "富"
map4["小文"] = "白"
fmt.Println(map4)
map5 := map4
fmt.Println(map5)
map5["小昭"] = "富"
fmt.Println(map4)
fmt.Println(map5)
}
運行結(jié)果:
GOROOT=D:\Go #gosetup
GOPATH=C:\Users\DELL\go #gosetup
D:\Go\bin\go.exe build -o C:\Users\DELL\AppData\Local\JetBrains\GoLand2023.1\tmp\GoLand\___go_build_Day12_Map__3_.exe D:\GolandProjects\Day12-Map\MapDemo4.go #gosetup
C:\Users\DELL\AppData\Local\JetBrains\GoLand2023.1\tmp\GoLand\___go_build_Day12_Map__3_.exe
map[int]string
map[string]float64
map[hr:map[age:22 name:小李 salary:999999] 總經(jīng)理:map[age:22 name:小李 salary:999999]]
---------------
map[小文:白 小李:富 小王:美]
map[小文:白 小李:富 小王:美]
map[小文:白 小昭:富 小李:富 小王:美]
map[小文:白 小昭:富 小李:富 小王:美]
進程 已完成,退出代碼為 0
運行截圖:
今日學習總結(jié):
在今天的學習中,我們深入解析了Go語言中的集合(Map)及其常用函數(shù)應用。首先,我們了解了什么是Map,它是一種存儲鍵值對的數(shù)據(jù)結(jié)構。然后,我們學習了創(chuàng)建Map的方法,使用make()函數(shù)進行創(chuàng)建,并了解了delete()函數(shù)的使用以及ok-idiom的應用。我們還了解到,Map是引用類型的,可以傳遞和修改。最后,我們通過多個綜合代碼案例加深了對Map的理解,提供了實際應用的示例。通過今天的學習,我們對Go語言中的Map有了更深入的了解,并掌握了一些常用的函數(shù)應用。
結(jié)語
通過今天的學習,您已經(jīng)踏上了Golang的學習之旅。在未來的日子里,您將探索Golang的各個方面,從基礎概念到高級技巧,從實際應用到性能優(yōu)化。
學習一門編程語言是一個持續(xù)的過程,每一天都是您向Golang的精通邁進的重要一步。我鼓勵您堅持每天學習,保持熱情和好奇心,解決挑戰(zhàn)并享受成功的喜悅。
在您的學習旅程中,不要忘記參與社區(qū)和與其他Golang開發(fā)者交流。分享您的見解和經(jīng)驗,向他人學習,并在開源項目或?qū)嶋H應用中展示您的技能。
如果您在學習過程中遇到困難或有任何問題,不要猶豫向社區(qū)和專家尋求幫助。持續(xù)學習,勇敢探索,您將在Golang領域取得令人矚目的成就。
最后,感謝您的閱讀和支持!祝愿您在未來的每一天中都能夠成為一名精通Golang的開發(fā)者!
期待聽到您在學習過程中的進展和成就。如果您需要進一步的幫助,請隨時告訴我。祝您在學習Golang的旅程中取得巨大成功!
點擊
下方名片
,加入IT技術核心學習團隊。一起探索科技的未來,共同成長。文章來源:http://www.zghlxwxcb.cn/news/detail-518484.html
如果您在學習過程中有任何疑惑,請點擊下方名片,帶您一對一快速入門 Go語言 的世界 ~
文章來源地址http://www.zghlxwxcb.cn/news/detail-518484.html
到了這里,關于100天精通Golang(基礎入門篇)——第12天:深入解析Go語言中的集合(Map)及常用函數(shù)應用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!