go技巧分享(二)
這是一個系列文章,主要分享go的使用建議和技巧,每次分享3點,希望你能有所收穫。
1 併發訪問map
package mainimport "sync"type Map struct { sync.RWMutex Data map[int]int}func main() { m := Map{} m.Data = make(map[int]int) for i := 0; i註釋掉加鎖和解鎖的程式碼:
func (m *Map) Read(key int) int { // m.RLock() value := m.Data[key] // m.RUnlock() return value }func (m *Map) Write(key int, value int) { // m.Lock() m.Data[key] = value // m.Unlock()}/* fatal error: concurrent map read and map write 或者 fatal error: concurrent map writes */多協程併發訪問map時,有可能會導致程式退出,錯誤資訊為:fatal error: concurrent map read and map write 或者 fatal error: concurrent map writes,所以如果希望在多協程中併發訪問map,必須提供某種同步機制,一般情況下透過讀寫鎖sync.RWMutex實現對map的併發訪問控制,將map和sync.RWMutex封裝一下,可以實現對map的安全併發訪問。示例中,如果註釋掉加鎖和解鎖的程式碼,執行時就會出現併發訪問map錯誤。
2 結構體轉換成json字串時忽略欄位
package mainimport ( "encoding/json" "fmt")type User struct { Name string Age int Addr string `json:"-"` // addr string}func main() { jsonStr, _ := json.Marshal(User{"user1", 12, "addr"}) fmt.Printf("%sn", jsonStr) }/* {"Name":"user1","Age":12} */將結構體轉換成json字串時,如果想忽略某些欄位,可以透過在該欄位後面新增`json:"-"`實現,新增該tag後,轉換成json字串時會忽略該欄位。當然,你也可以透過將該欄位首字母改成小寫實現,只是這樣的話該欄位對其他包也隱藏了,兩種方法各有利弊,權衡使用。
3 判斷2個結構體是否相等
package mainimport ( "fmt" "reflect")type User struct { Name string Age int Addr string}func NewUser(name string, age int) User { u := User{} u.Name = name u.Age = age return u }func main() { u1 := NewUser("user1", 12) u2 := NewUser("user1", 12) fmt.Println(reflect.DeepEqual(u1, u2)) fmt.Println(reflect.DeepEqual([]int{1, 2}, []int{1, 2})) fmt.Println(reflect.DeepEqual([2]int{1, 2}, [2]int{1, 2})) fmt.Println(reflect.DeepEqual(map[int]int{1: 1, 2: 2}, map[int]int{1: 1, 2: 2})) }/* true true true true */在使用go語言過程中,有時需要比較2個結構體是否“相等”,即結構體欄位和欄位值都相同。如果自己實現比較函式,當結構體欄位多時比較麻煩。透過使用可以實現判斷2個結構體是否相等,但會有一定的效能影響。另外,reflect.DeepEqual不但可以比較結構體,像切片、陣列和字典等都可以比較。
作者:songleo
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1834/viewspace-2805004/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 小技巧分享:在 Go 如何實現列舉?Go
- 每週分享五個 PyCharm 使用技巧(二)PyCharm
- Go 開發技巧Go
- Java面試技巧分享Java面試
- PHPUnit 加速技巧分享PHP
- XShell 技巧分享
- CSS技巧(二)CSS
- mysqldump備份技巧分享MySql
- Python小技巧分享Python
- Linux開發技巧分享Linux
- 軟體漏洞分析技巧分享
- 職場辦公小技巧分享
- 下三路技巧分享
- java培訓面試技巧分享Java面試
- JavaScript 效能優化技巧分享JavaScript優化
- Flash builder 除錯技巧 (分享)UI除錯
- go context剖析之使用技巧GoContext
- go runtime debug 小技巧Go
- go習題二Go
- GO基礎知識分享Go
- go語言書籍分享Go
- 【音樂分享】Let Me GoGo
- Linux文字處理技巧分享Linux
- 乾貨分享:PPT製作技巧
- 分享一條history命令小技巧
- 分享100個原生JavaScript技巧JavaScript
- 【Go】slice的一些使用技巧Go
- go語言json的使用技巧GoJSON
- Go快速入門(二)Go
- GO基礎知識分享2Go
- 分享swoole/go底層內容Go
- GO的鎖和原子操作分享Go
- GO通道和 sync 包的分享Go
- 分享生成go的mysql orm工具GoMySqlORM
- 程式碼重構技巧(二)
- 分享一些 Broadcast 使用技巧AST
- 【譯】分享7個好用的JavaScript技巧JavaScript
- 開始起飛:Golang 編碼技巧分享Golang