Go起步:6、複合類型3--字典(map)及其他

數組array、切片slice指針(pointer)、結構體(struct)之後,繼續Go的複合類型。

字典(map)

Go的字典類型類似於Java的Map,python的Dictionary,都是一種無序的鍵值對的集合。可以通過鍵(key)來檢索數據。
先看一個例子:

package main

import "fmt"

func main() {
    map1 := map[string]string{"1": "s"}
    fmt.Println("map1:", map1)
    map1["1"] = "www"
    fmt.Println("map1:", map1)
    var map2 map[string]string
    map2 = make(map[string]string)
    fmt.Println("map2:", map2)
    map2["1"] = "s"
    fmt.Println("map2:", map2)

    str, ok := map1["1"]
    if ok {
        fmt.Println("str:", str)
    }
}

這裏寫圖片描述
這個簡單的例子基本上包含了map的基本用法,包括聲明,賦值,取值等。

聲明,初始化

單是map的聲明和其他類型的變量聲明類似。

var map_variable map[keytype]valuetype
//聲明 一個map類型的變量,key和value的類型是string
var map2 map[string]string

單是聲明map變量如果不初始化map的話,那麼就會創建一個 nil map,默認值是 nil。nil map不能用來存放鍵值對。

package main

import "fmt"

func main() {
    var myMap map[string]string
    fmt.Println(myMap == nil)
    myMap["1"] = "11"
    fmt.Println("myMap:", myMap)
}

這裏寫圖片描述
初始化的方法也有兩種,可以直接初始化或者使用Go語言內置的函數make()來創建一個新map,這個和切片基本一樣。

//定義是初始化賦值
map1 := map[string]string{"1": "s"}
//使用make函數初始化
var map2 map[string]string
map2 = make(map[string]string)

元素賦值和修改

賦值過程非常簡單明瞭,就是將鍵和值用下面的方式對應起來即可:

map2["1"] = "s"

這樣就給map類型的變量map2的key值爲1的kery賦值爲s。
通過上面的程序執行結果可以看出,如果key值已存在會更新key對應的值;若key不存在,則會早map裏增加key值,並賦值。

元素查找

Go中,查找map中是否存在某個值是通過雙賦值檢測某個鍵是否存在。

vlaue, ok := map[key]

若key在map中,ok 爲true;否則,ok 爲false 。
若key不存在,那麼vlaue 是該map元素類型的默認值。即如果map的value對應類型的默認值。
同樣的,當從map中讀取某個不存在的鍵時,結果是map的元素類型的默認值。
這樣判斷是否成功找到特定的鍵,不需要檢查取到的值是否爲nil,只需查看第二個返回值ok,代碼表達更簡潔。

元素刪除

對於map元素的刪除,Go提供了一個內置函數delete()。

delete(myMap, "1") 

這樣就把myMap中鍵爲“1”的鍵值對刪除。如果“1”這個鍵不存在,那麼這個調 用將什麼都不發生。

package main

import "fmt"

func main() {
    myMap := map[string]string{"1": "a", "2": "b"}
    fmt.Println("myMap:", myMap)
    delete(myMap, "1")
    fmt.Println("myMap:", myMap)

    delete(myMap, "3")
    fmt.Println("myMap:", myMap)

}

這裏寫圖片描述

其他類型

一下類型只做概念性介紹,因爲涉及的東西比較深入,目前我也是初學,體會不出太深刻的東西。

通道(chan)

通道是連接併發夠程的管道。併發編程是個很大的論題,因此這裏只是大致說一點,希望可以以此看出Go在併發編程裏的優勢。詳細的內容,需要在以後使用中慢慢了解。
在併發編程中,爲實現對共享變量的正確訪問需要精確的控制,這在多數環境下都很困難。 Go語言另闢蹊徑,它將共享的值通過信道傳遞,實際上,多個獨立執行的線程從不會主動共享。 在任意給定的時間點,只有一個Go程能夠訪問該值。數據競爭從設計上就被杜絕了。 爲了提倡這種思考方式,Go將它簡化爲一句口號:

不要通過共享內存來通信,而應通過通信來共享內存。

Go程的概念:Go程在多線程操作系統上可實現多路複用,因此若一個線程阻塞,比如說等待I/O, 那麼其它的線程就會運行。Go程的設計隱藏了線程創建和管理的諸多複雜性。
在函數或方法前添加 go 關鍵字能夠在新的Go程中調用它。當調用完成後, 該Go程也會安靜地退出。有點像Unix Shell中的 & 符號,它能讓命令在後臺運行。

接口(interface)

對於接口的概念Go應該也其他支持接口的編程語言差別不大。
Go中的接口爲指定對象的行爲提供了一種方法:如果某樣東西可以完成這個, 那麼它就可以用在這裏。
若某種現有的類型僅實現了一個接口,且除此之外並無可導出的方法,則該類型本身就無需導出。 僅導出該接口能讓我們更專注於其行爲而非實現,其它屬性不同的實現則能鏡像該原始類型的行爲。

錯誤類型(error)

錯誤處理應該是任何編程語言都該涉及好的功能,Go也不例外。
Go語言的多值返回特性, 使得它在返回常規的值時,還能輕鬆地返回詳細的錯誤描述。按照約定,錯誤的類型通常爲 error,這是一個內建的簡單接口。

type error interface {
    Error() string
}

可以輕鬆實現這個接口以實現這樣不僅能看見錯誤, 還能提供一些上下文。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章