go map value 長度_Golang學習筆記五--map
阿新 • • 發佈:2021-01-29
技術標籤:go map value 長度
map的建立
func main() { //建立 map studens := map[string]string{ "name": "張三", "age": "18", "sex": "男", } //直接建立有值的map var m2 map[string]int //map == nil m3 := make(map[string]string) //map == empty map }
可以看出,在go中可以建立map的方式還是很多的,就算是不初始化,也可以賦值
map key的型別
在map的key可以使用那些型別?
- 首先map是使用雜湊表的,必須可以比較相等
- 除了slice,map,function 的內建型別其他的都可以作為key
- struct 型別不包含以上欄位的也可以作為key(struct 型別後面會專門寫道)
map取值
//獲取key元素
name := studens["name"]
fmt.Println(name) //"張三"
取出不存在的元素呢?
//獲取不存在元素 idCard := studens["idCard"] fmt.Println(idCard) //列印空 ""所以我們怎麼判斷,key是否取到了呢?
key是否取到了呢?
idCard,ok := studens["idCard"] //其實 獲取map可以返回兩個引數,第二個就是bool型別,false表示不存在 fmt.Println(idCard,ok) // 列印 "" false if idCard,ok := studens["idCard"];ok { fmt.Println(idCard) }else { fmt.Println("key idCard not exist") }// key idCard not exist
map遍歷
//遍歷 map
fmt.Println("----------key value一起遍歷------n")
//key value一起遍歷
for k, v := range studens {
fmt.Println(k,v)
}
fmt.Println("---------只遍歷key-------n")
//只遍歷key
for k := range studens {
fmt.Println(k)
}
fmt.Println("---------只遍歷 value-------n")
//只遍歷 value
for _, v := range studens {
fmt.Println(v)
}
遍歷就很簡單了,可以使用range關鍵字
map刪除
直接使用delete函式刪除
//刪除存在的鍵
delete(studens, "age")
fmt.Println("delete age after:",studens) //delete age after: map[sex:男 name:張三]
//刪除不存的鍵
delete(studens,"idCard")
fmt.Println("delete ont exist key after:",studens) //delete ont exist key after: map[name:張三 sex:男]
map小測試
打印出字串中最長不重複字元長度
舉例:
"asdjkh" -> "asdjkh" 6個字元
"aaaa" -> "a" 1個字元
"abccba" -> "abc" 3個字元
我們先來整理思路,其實這個題使用map來做就會非常的簡單,如圖:
實現程式碼:
package main
import "fmt"
/**
查詢到一個字串中
最長不重複字串
例如:
asdasdss -> asd
*/
func findMaxNoRepeatString(s string) int {
start := 0
keysIndex := make(map[byte]int)
lenth := 0
for i, v := range []byte(s) { //這裡將字串轉為 byte陣列的原因,string遍歷每一個元素是int32型別
lastIndex, ok := keysIndex[v]
if ok && lastIndex >= start {
start = lastIndex + 1
} else {
lenth = i - start + 1
}
keysIndex[v] = i
}
return lenth
}
func main() {
fmt.Println(findMaxNoRepeatString("abc")) //3
fmt.Println(findMaxNoRepeatString("abccba")) //3
fmt.Println(findMaxNoRepeatString("aaaaa")) //1
fmt.Println(findMaxNoRepeatString("")) //0
fmt.Println(findMaxNoRepeatString("asdfghjk")) //8
}
思路是對的,也出現結果了,但是其實還是有bug的.
fmt.Println(findMaxNoRepeatString("我是小智")) //8
fmt.Println(findMaxNoRepeatString("小智智小")) //6
發現這個 8 和 6 是什麼鬼?想到搞清楚這個問題,就需要了解,go的字串編碼,go中是使用utf編碼(可變長度編碼). 下章專門講解go的string編碼.
作者所有的學習原始碼在 go學習原始碼github地址,如果覺得有用的話幫小智貢獻一個star