1. 程式人生 > >go語言中map型別的用法

go語言中map型別的用法

map是一堆鍵值對的未排序集合。比如以身份證號作為唯一鍵來標識一個人的資訊,則這個 map可以定義為程式碼清單 2-3所示的方式。

程式碼清單2-3 map1.go package main

import "fmt"

// PersonInfo是一個包含個人詳細資訊的型別 type PersonInfo struct {

ID string
Name string Address string

}

func main() {
var personDB map[string] PersonInfo

personDB = make(map[string] PersonInfo)

// 往這個map裡插入幾條資料
personDB["12345"] = PersonInfo{"12345", "Tom", "Room 203,..."}

personDB["1"] = PersonInfo{"1", "Jack", "Room 101,..."}

// 從這個map查詢鍵為"1234"的資訊 person, ok := personDB["1234"]

// ok是一個返回的bool型,返回true表示找到了對應的資料

if ok {

     fmt.Println("Found person", person.Name, "with ID 1234.")

} else {
fmt.Println("Did not find person with ID 1234.")

} }

上面這個簡單的例子基本上已經覆蓋了map的主要用法,下面對其中的關鍵點進行細述。

1. 變數宣告

map的宣告基本上沒有多餘的元素,比如: var myMap map[string] PersonInfo

其中,myMap是宣告的map變數名,string是鍵的型別,PersonInfo則是其中所存放的值型別。

2. 建立

我們可以使用Go語言內建的函式make()來建立一個新map。

下面的這個例子建立了一個鍵 型別為string、值型別為PersonInfo的map:

myMap = make(map[string] PersonInfo) 也可以選擇是否在建立時指定該map的初始儲存能力,下面的例子建立了一個初始儲存能力

為100的map:
myMap = make(map[string] PersonInfo, 100)

關於儲存能力的說明,可以參見2.3.6節中的內容。 建立並初始化map的程式碼如下:

myMap = map[string] PersonInfo{
"1234": PersonInfo{"1", "Jack", "Room 101,..."},

}

3. 元素賦值

賦值過程非常簡單明瞭,就是將鍵和值用下面的方式對應起來即可:
myMap["1234"] = PersonInfo{"1", "Jack", "Room 101,..."}

4. 元素刪除

delete(myMap, "1234") 上面的程式碼將從myMap中刪除鍵為“1234”的鍵值對。如果“1234”這個鍵不存在,那麼這個調 8

用將什麼都不發生,也不會有什麼副作用。但是如果傳入的map變數的值是nil,該呼叫將導致 程式丟擲異常(panic)。

5. 元素查詢 在Go語言中,map的查詢功能設計得比較精巧。而在其他語言中,我們要判斷能否獲取到一

個值不是件容易的事情。判斷能否從map中獲取一個值的常規做法是:
(1) 宣告並初始化一個變數為空;
(2) 試圖從map中獲取相應鍵的值到該變數中;
(3) 判斷該變數是否依舊為空,如果為空則表示map中沒有包含該變數。 這種用法比較囉唆,而且判斷變數是否為空這條語句並不能真正表意(是否成功取到對應的

值),從而影響程式碼的可讀性和可維護性。有些庫甚至會設計為因為一個鍵不存在而丟擲異常, 讓開發者用起來膽戰心驚,不得不一層層巢狀try-catch語句,這更是不人性化的設計。在Go 語言中,要從map中查詢一個特定的鍵,可以通過下面的程式碼來實現:

value, ok := myMap["1234"] ifok{// 找到了

// 處理找到的value }

判斷是否成功找到特定的鍵,不需要檢查取到的值是否為nil,只需檢視第二個返回值ok, 這讓表意清晰很多。配合:=操作符,讓你的程式碼沒有多餘成分,看起來非常清晰易懂。

相關推薦

go言中map型別用法

map是一堆鍵值對的未排序集合。比如以身份證號作為唯一鍵來標識一個人的資訊,則這個 map可以定義為程式碼清單 2-3所示的方式。 程式碼清單2-3 map1.go package main import "fmt" // PersonInfo是一個包含個人詳細資訊的型

Go言中string的用法(轉載)

Go語言中string的用法總結,以後有用得到的地方可查到 package main import ( "fmt" "strings" //"unicode/utf8" ) func main() { fmt.Println

Go言中Time的用法[2]

Date函式: 定義:func Date(yearint, month Month, day, hour, min, sec, nsec int, loc *Location) Time

Go言中map用法

package main import ( "fmt" "strconv" ) func main() { var m map[int]map[int]string m = make(ma

GO言中的StructTag型別

StructTag是什麼?在Go語言裡,StructTag是一個標記字串,此字串可跟隨在Struct中欄位定義的後面。StructTag就是一系列的 key:”value” 形式的組合,其中key是一個不可為空的字串,key-value組合可以有多個,空格分隔。 Struc

go言中json轉成map結構

package main import (     "encoding/json"     "fmt" ) //把請求包定義成一個結構體 type Requestbody struct {     req string } //以指標的方式傳入,但在使用時卻可以不用關心 // result 是函式內的臨時變數

go言中json轉成map結構,新增根的元素

package main import ( "encoding/json" "fmt" "log" ) type A struct { Name string `

go言中fallthrough用法

switch sExpr { case expr1: some instructions case expr2: some other instructions case expr3: some other instructions de

go言中container容器數據結構heap、list、ring

func 都是 slice 比較 next println div less 插入元素 heap堆的使用: package main import ( "container/heap" "fmt" ) type IntHeap []int

go言中os/exec包的學習與使用

pipe 設置 int 管道 baidu 標準輸出 byte Go語言 println package main; import ( "os/exec" "fmt" "io/ioutil" "bytes" ) func main() {

go言中bytes包的常用函數,Reader和Buffer的使用

函數 tolower 參數 比較 新建 切分 any dst 操作 bytes中常用函數的使用: package main; import ( "bytes" "fmt" "unicode" ) //bytes包中實現了大量對[]byte操作

C言中#define的用法

inux 就是 linu head 突出 開發 ffffff 條件 就會 1.簡單的define定義#define MAXTIME 1000一個簡單的MAXTIME就定義好了,它代表1000,如果在程序裏面寫if(i<MAXTIME){.........}編譯器在處理

go 言中的args多參數的傳遞

color ... ++ 使用 i++ int light style imp 多個參數類型一樣的時候,如何進行傳遞 package main import "fmt" func main() { myfunc(1) myfunc(5,6) } // 要是使用

Go言中mysql數據庫操作(一)

Go語言中mysql數據庫操作 Go語言mysql數據庫 Go數據庫操作 數據的持久化是程序中必不可少的,所以編程語言中對數據庫的操作是非常重要的一塊,本文介紹Go語言對mysql數據庫的操作。 基本操作 建立連接 db, err := sql.Open("mysql", "root:root@t

go言中goroute使用:=遇到的坑

而是 但是 源代碼 val AI AR 所有 () for 先看下源代碼,預想從1至N總取出所有能被a或b整除的正整數之和,為了利用go語言的並行優勢,特使用goroute特性來實現,同時使用普通順序計算進行效率比較分析 package changoimport ( "

go言中make與new操作

make用於內建型別(map、slice和channel)的記憶體分配。new用於各種型別的記憶體分配。 內建函式new本質上說跟其它語言中的同名函式功能醫院:new(T)分配了零值填充的T型別的記憶體空間,並且返回其地址,即一個*T型別的值。用Go的術語說,它返回了一個指標,指向新分配的型別T

go言中interface的實踐

package main import ( "fmt" "math" ) type geometry interface { area() float64 perim() float64 } type square struct { width, height f

C言中的volatile用法

Part 1:字首理論知識介紹 1 > 編譯器的優化         由於記憶體訪問速度遠不及CPU處理速度,為提高機器整體效能,在硬體上引入硬體快取記憶體Cache,加速對記憶體的訪問。另外在現代CPU中指令的執行並不一定嚴格按照

Go言中Printf和Println

 1. Printf   如果是空字串,輸出了空字串的 雙引號 "" 例如 func variableZeroValue(){ var a int var s string fmt.Printf("%d %q\n", a, s) } 輸出結果

關於go言中的defer\panic\recover

defer的作用 類似其他語言的finally{},可以非常方便地在獲得資源之後直接defer釋放資源,保證資源釋放,或者其他的一些處理工作 defer的執行時機 在函式體執行完成之後,回到呼叫點之前。這意味這你可以在defer中修改return的值 函式中出現了錯誤(panic)d