Hi,大家好,
我是明哥,在自己學習 Golang 的這段時間里,我寫了詳細的學習筆記放在我的個人微信公眾號 《Go編程時光》,對于 Go 語言,我也算是個初學者,因此寫的東西應該會比較適合剛接觸的同學,如果你也是剛學習 Go 語言,不防關注一下,一起學習,一起成長,
我的在線博客:http://golang.iswbm.com
我的 Github:github.com/iswbm/GolangCodingTime
1. 字典
字典(Map 型別),是由若干個 key:value 這樣的鍵值對映射組合在一起的資料結構,
它是哈希表的一個實作,這就要求它的每個映射里的key,都是唯一的,可以使用 == 和 != 來進行判等操作,換句話說就是key必須是可哈希的,
什么叫可哈希的?簡單來說,一個不可變物件,都可以用一個哈希值來唯一表示,這樣的不可變物件,比如字串型別的物件(可以說除了切片、 字典,函式之外的其他內建型別都算),
意思就是,你的 key 不能是切片,不能是字典,不能是函式,,
字典由key和value組成,它們各自有各自的型別,
在宣告字典時,必須指定好你的key和value是什么型別的,然后使用 map 關鍵字來告訴Go這是一個字典,
map[KEY_TYPE]VALUE_TYPE
宣告初始化字典
三種宣告并初始化字典的方法
// 第一種方法
var scores map[string]int = map[string]int{"english": 80, "chinese": 85}
// 第二種方法
scores := map[string]int{"english": 80, "chinese": 85}
// 第三種方法
scores := make(map[string]int)
scores["english"] = 80
scores["chinese"] = 85
要注意的是,第一種方法如果拆分成多步(宣告、初始化、再賦值),和其他兩種有很大的不一樣了,相對會比較麻煩,
import "fmt"
func main() {
// 宣告一個名為 score 的字典
var scores map[string]int
// 未初始化的 score 的零值為nil,無法直接進行賦值
if scores == nil {
// 需要使用 make 函式先對其初始化
scores = make(map[string]int)
}
// 經過初始化后,就可以直接賦值
scores["chinese"] = 90
fmt.Println(scores)
}
字典的相關操作
添加元素
scores["math"] = 95
更新元素,若key已存在,則直接更新value
scores["math"] = 100
讀取元素,直接使用 [key] 即可 ,如果 key 不存在,也不報錯,會回傳其value-type 的零值,
fmt.Println(scores["math"])
洗掉元素,使用 delete 函式,如果 key 不存在,delete 函式會靜默處理,不會報錯,
delete(scores, "math")
當訪問一個不存在的key時,并不會直接報錯,而是會回傳這個 value 的零值,如果 value的型別是int,就回傳0,
package main
import "fmt"
func main() {
scores := make(map[string]int)
fmt.Println(scores["english"]) // 輸出 0
}
判斷 key 是否存在
當key不存在,會回傳value-type的零值 ,所以你不能通過回傳的結果是否是零值來判斷對應的 key 是否存在,因為 key 對應的 value 值可能恰好就是零值,
其實字典的下標讀取可以回傳兩個值,使用第二個回傳值都表示對應的 key 是否存在,若存在ok為true,若不存在,則ok為false
import "fmt"
func main() {
scores := map[string]int{"english": 80, "chinese": 85}
math, ok := scores["math"]
if ok {
fmt.Printf("math 的值是: %d", math)
} else {
fmt.Println("math 不存在")
}
}
我們將上面的代碼再優化一下
import "fmt"
func main() {
scores := map[string]int{"english": 80, "chinese": 85}
if math, ok := scores["math"]; ok {
fmt.Printf("math 的值是: %d", math)
} else {
fmt.Println("math 不存在")
}
}
如何對字典進行回圈
Go 語言中沒有提供類似 Python 的 keys() 和 values() 這樣方便的函式,想要獲取,你得自己回圈,
回圈還分三種
- 獲取 key 和 value
import "fmt"
func main() {
scores := map[string]int{"english": 80, "chinese": 85}
for subject, score := range scores {
fmt.Printf("key: %s, value: %d\n", subject, scores)
}
}
- 只獲取key,這里注意不用占用符,
import "fmt"
func main() {
scores := map[string]int{"english": 80, "chinese": 85}
for subject := range scores {
fmt.Printf("key: %s\n", subject)
}
}
- 只獲取 value,用一個占位符替代,
import "fmt"
func main() {
scores := map[string]int{"english": 80, "chinese": 85}
for _, score := range scores {
fmt.Printf("value: %d\n", score)
}
}
2. 布爾型別
關于布林值,無非就兩個值:true 和 false,只是這兩個值,在不同的語言里可能不同,
在 Python 中,真值用 True 表示,與 1 相等,假值用 False 表示,與 0 相等
>>> True == 1
True
>>> False == 0
True
>>>
而在 Go 中,真值用 true 表示,不但不與 1 相等,并且更加嚴格,不同型別無法進行比較,而假值用 false 表示,同樣與 0 無法比較,
如下圖所示,Goland 直接波浪線提示型別不匹配,不能比較,

Go 中確實不如 Python 那樣靈活,bool 與 int 不能直接轉換,如果要轉換,需要你自己實作函式,
bool 轉 int
func bool2int(b bool) int {
if b {
return 1
}
return 0
}
int 轉 bool
func int2bool(i int) bool {
return i != 0
}
在 Python 中使用 not 對邏輯值取反,而 Go 中使用 ! 符號
import "fmt"
var male bool = true
func main() {
fmt.Println( !male == false)
// 或者
fmt.Println( male != false)
}
// output: true
一個 if 判斷陳述句,有可能不只一個判斷條件,在 Python 中是使用 and 和 or 來執行邏輯運算
>>> age = 15
>>> gender = "male"
>>>
>>> gender == "male" and age >18
False
而在 Go 語言中,則使用 && 表示且,用 || 表示或,并且有短路行為(即左邊運算式已經可以確認整個運算式的值,那么右邊將不會再被求值,
import "fmt"
var age int = 15
var gender string = "male"
func main() {
// && 兩邊的運算式都會執行
fmt.Println( age > 18 && gender == "male")
// gender == "male" 并不會執行
fmt.Println( age > 18 || gender == "male")
}
// output: false
// output: true
系列導讀
01. 開發環境的搭建(Goland & VS Code)
02. 學習五種變數創建的方法
03. 詳解資料型別:****整形與浮點型
04. 詳解資料型別:byte、rune與string
05. 詳解資料型別:陣列與切片
06. 詳解資料型別:字典與布爾型別
07. 詳解資料型別:指標
08. 面向物件編程:結構體與繼承
09. 一篇文章理解 Go 里的函式
10. Go語言流程控制:if-else 條件陳述句
11. Go語言流程控制:switch-case 選擇陳述句
12. Go語言流程控制:for 回圈陳述句
13. Go語言流程控制:goto 無條件跳轉
14. Go語言流程控制:defer 延遲呼叫
15. 面向物件編程:介面與多型
16. 關鍵字:make 和 new 的區別?
17. 一篇文章理解 Go 里的陳述句塊與作用域
18. 學習 Go 協程:goroutine
19. 學習 Go 協程:詳解信道/通道
20. 幾個信道死鎖經典錯誤案例詳解
21. 學習 Go 協程:WaitGroup
22. 學習 Go 協程:互斥鎖和讀寫鎖
23. Go 里的例外處理:panic 和 recover
24. 超詳細解讀 Go Modules 前世今生及入門使用
25. Go 語言中關于包匯入必學的 8 個知識點
26. 如何開源自己寫的模塊給別人用?
27. 說說 Go 語言中的型別斷言?
28. 這五點帶你理解Go語言的select用法

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/17381.html
標籤:Go
上一篇:golang的命令列程式開發
下一篇:Gin+Gorm小專案
