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