1. 程式人生 > 其它 >go map value 長度_Golang學習筆記五--map

go map value 長度_Golang學習筆記五--map

技術標籤: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來做就會非常的簡單,如圖:

8463fd7d4230e0970962b6cc7531532e.png

實現程式碼:

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