Golang 使用map需要注意的幾個點

2022-09-24 11:00:09 字數 2636 閱讀 5606

1.簡介

map 是 golang 中的方便而強大的內建資料結構,是乙個同種型別元素的無序組,元素通過另一型別唯一的鍵進行索引。其鍵可以是任何相等性操作符支援的型別, 如整數、浮點數、複數、字串、指標、介面(只要其動態型別支援相等性判斷)、結構以及陣列。 切片不能用作對映鍵,因為它們的相等性還未定義。與切片一樣,對映也是引用型別。 若將對映傳入函式中,並更改了該對映的內容,則此修改對呼叫者同樣可見。未初始化的對映值為 nil。

使用示例如下:

package main

impoxadjcrlrt "fmt"

func main()

for k, v :=range nameage

}輸出結果:

v= 19

v= 19 ok= true

tom 19

2.注意事項

2.1 map的元素不可取址

map中的元素並不是乙個變數,而是乙個值。因此,我們不能對map的元素進行取址操作。

var m = map[int]int

func main()

執行報錯:

cannot take the address of m[0]

因此,當 map 的元素為結構體型別的值,那麼無法直接修改結構體程式設計客棧中的字段值。考察如下示例:

package main

import (

"fmt"

)type person struct

func whoisdead(personmap map[string]person)

} }func main()

p2 := person

p3 := person

personmap := map[string]person

whoisdead(personmap)

for _, v :=range personmap

} }

編譯報錯:

cannot assign to struct field personmap[name].isdead in map

原因是 map 元素是無法取址的,也就說可以得到 personmap[name],但是無法對其進行修改。解決辦法有二,一是 map 的 value用 strct 的指標型別,二是使用臨時變數,每次取出來後再設定回去。

(1)將map中的元素改為struct的指標。

package main

import (

"fmt"

)type person struct

func whoisdead(people map[string]*person)

} }func main()

p2 := &person

p3 := &person

personmap := map[string]*person

whoisdead(personmap)

for _, v :=range personmap

} }

輸出結果:

px is dead

(2)使用臨時變數覆蓋原來的元素。

package main

import (

"fmt"

)type person struct

func whoisdead(people map[string]person)

} }func main()

p2 := person

p3 := person

personmap := map[string]person

whoisdead(personmap)

for _, v :=range personmap

} }

輸出結果:

px is dead

2.2 map併發讀寫問題

共享 map 在併發讀寫時需要加鎖。先看錯誤示例:

package main

import (

"fmt"

"time"

)var m = make(map[int]int)

func main()

}()

//乙個go程讀map

go func()

}()

time.sleep(time.second*20)

}執行報錯:

fatal error: concurrent map read and map write

可以使用讀寫鎖(sync.rwmutex)實現互斥訪問。

package main

import (

"fmt"

"time"

"sync"

)var m = make(map[int]int)

var rwmutex sync.rwmutex

func main()

rwmutex.unlock()

}()

//乙個go程讀map

go func()

rwmutex.runlock()

}()

time.sleep(time.second*20)

}正常執行輸出:

01...

9999

使用Calendar需要注意clear

date是前台傳的值,格式為2014 01 01的形式 如下的 是去date日期當月的最大天數日期 int month integer.parseint date.substring 5,7 取天數 int year integer.parseint date.substring 0,4 取年份 d...

使用SqlSession 需要注意的

sqlsessionfactorybuilder 是用於建立sqlseesionfactory的,將sqlsessionfactorybuilder當成乙個工具類來使用 sqlseesionfactory 會話工廠,是乙個單例的,用於建立sqlsession,sqlsessionfactory一旦建...

constraintlayout 需要注意的事項

橫向和豎向至少都需要設定乙個約束條件,但是實際上下左右都是可以設定約束條件的。仔細觀察android studio 預設的建立專案的textview 如果上下左右都設定了約束條件就會產生邊距。劃重點 相同方向的屬性,比如說top to top 這樣的,實際上可以理解為是relativelayout中...