《Effective Go》--Maps

衣舞晨風發表於2017-11-11

    Map是一種方便,強大的內建資料結構,其將一個型別的值(key)與另一個型別的值(element或value) 關聯一起。key可以為任何定義了等於操作符的型別,例如整數,浮點和複數,字串,指標,介面(只要其動態型別支援等於操作),結構體和陣列。切片不能 作為map的key,因為它們沒有定義等於操作。和切片類似,map持有對底層資料結構的引用。如果將map傳遞給函式,其對map的內容做了改變,則這 些改變對於呼叫者是可見的。

    Map可以使用通常的複合文字語法來構建,使用分號分隔key和value,這樣很容易在初始化的時候構建它們。

var timeZone = map[string]int{
    "UTC":  0*60*60,
    "EST": -5*60*60,
    "CST": -6*60*60,
    "MST": -7*60*60,
    "PST": -8*60*60,
}

    賦值和獲取map的值,在語法上看起來跟陣列和切片類似,只不過索引不需要為一個整數。

offset := timeZone["EST"]

    嘗試使用一個不在map中的key來獲取map值,將會返回map中元素相應型別的零值。例如,如果map包含的是整數,則查詢一個不存在的key將會返回0。

package main

import (
    "fmt"
)

func main() {
    var timeZone = map[string]int{
        "UTC":  0*60*60,
        "EST": -5*60*60,
        "CST": -6*60*60,
        "MST": -7*60*60,
        "PST": -8*60*60,
    }
    t1 := timeZone["EST"]
    fmt.Println(t1)
    t2 := timeZone["EST111111"]
    fmt.Println(t2)
}

輸出結果:
這裡寫圖片描述

    有時你需要區分開沒有的項和值為零的項。是否有一個項為”UTC”,或者由於其根本不在map中,所以為空字串?你可以通過多賦值的形式來進行辨別。

var seconds int
var ok bool
seconds, ok = timeZone[tz]

    這被形象的稱作為“comma ok”用法。在這個例子中,如果tz存在,seconds將被設定為適當的值,ok將為真;如果不存在,seconds將被設定為零,ok將為假。這有個例子,並增加了一個友好的錯誤報告:

func offset(tz string) int {
    if seconds, ok := timeZone[tz]; ok {
        return seconds
    }
    log.Println("unknown time zone:", tz)
    return 0
}

    如果只測試是否在map中存在,而不關心實際的值,你可以將通常使用變數的地方換成空白識別符號(_)

_, present := timeZone[tz]

    要刪除一個map項,使用delete內建函式,其引數為map和要刪除的key。即使key已經不在map中,這樣做也是安全的。

delete(timeZone, "PDT")  // Now on Standard Time

本文整理自:https://www.kancloud.cn/kancloud/effective/72207

個人微信公眾號:
這裡寫圖片描述

作者:jiankunking 出處:http://blog.csdn.net/jiankunking

相關文章