天天看點

從零學 Go:清單與字典

前文回顧

前面的文章主要介紹了 Go 容器的數組和切片的基本概念以及使用。切片是 Go 中提供了一種靈活,功能強悍的内置類型("動态數組")。與數組相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。本文将會介紹清單與字典在 Go 語言中相關的使用。

清單與字典

Golang 的清單通過雙向連結清單的方式實作,能夠高效進行元素的插入和删除操作。清單的初始化樣式如下所示:

var name list.List
// or
name := list.New()      

我們可以直接聲明初始化清單,也可以使用 `container/list` 包中的 `New` 函數初始化清單,後者将傳回清單對應的指針。可以注意到,清單沒有限制其内儲存成員的類型,即任意類型的成員可以同時存在清單中。

下面我們将通過一個簡單的例子示範清單的插入、删除和周遊操作,代碼如下所示:

package main
import (
    "container/list"
    "fmt"
)
func main()  {
    tmpList := list.New()
    for i:= 1 ; i <= 10 ; i++ {
  tmpList.PushBack(i)
    }
    first := tmpList.PushFront(0)
    tmpList.Remove(first)
    for l := tmpList.Front(); l != nil; l = l.Next(){
  fmt.Print(l.Value, " ")
    }
}      

清單的每次插入操作都會傳回一個 `*list.Element` 結構,用以指向目前插入值所在的節點,如果要對清單中的成員進行删除、移動或者指定插入操作,需要配合指定的 `*list.Element` 的進行,如`Remove`函數。周遊清單的方式與其他容器稍微不同,需要配合 `Front` 函數擷取清單的頭元素,再使用其`Next`函數依次往下周遊,代碼如上所示。

Golang 中提供的映射關系容器為 `map` ,其内部通過散清單的方式實作。定義一個 map 的樣式如下所示:

name := make(map[keyType]valueType)      

`map` 需要使用 `make` 函數進行初始化,其中 `keyType` 即鍵類型,`valueType` 即鍵對應的值類型。我們将通過一個簡單的例子樣式 `map` 的使用方式,代碼如下所示:

package main
import "fmt"
func main() {
    classMates1 := make(map[int]string)
    // 添加映射關系
    classMates1[0] = "小明"
    classMates1[1] = "小紅"
    classMates1[2] = "小張"
    // 根據 key 擷取 value
    fmt.Printf("id %v is %v\n", 1, classMates1[1])
    // 在聲明時初始化資料
    classMates2 := map[int]string{
  0 : "小明",
  1 : "小紅",
  2 : "小張",
    }
    fmt.Printf("id %v is %v\n", 3, classMates2[3])
}      

如上代碼所示,我們可以使用 `make` 函數構造好對應的 `map` 之後,再使用鍵值對的方式為 `map` 添加成員,也可以直接在聲明時通過類 JSON 格式進行内容定義。可以通過鍵直接查詢對應的值,如果不存在這樣的鍵,将會傳回值類型的預設值。可以采用以下的方式來查詢某個鍵是否存在于 `map` 中:

mate,ok := classMate2[1]      

如果鍵存在于 `map` 中,布爾型 `ok` 将會是 `true`。

小結

本文主要介紹了清單與字典的基本使用,Go 語言中提供了 list 清單和 Map 映射關系容器,這兩種容器都是我們日常經常使用到的。list 的實作基于雙向連結清單。而 Map 是一種無序的鍵值對的集合。Map 最重要的一點是通過 key 來快速檢索資料,key 類似于索引,指向資料的值。

下面的文章,我們将繼續介紹容器相關的知識:容器的周遊。