2014-06-30 19 views
0

如何在Go中實現一個只使用一次查找從地圖彈出密鑰的函數?該版本能夠在地圖上兩個查找:使用一次查找從地圖中彈出一個值

package main 

import "fmt" 

func main() { 
    m := map[string]int{"a":1, "b":2} 
    a, ok := m["a"] 
    if ok { 
     delete(m, "a") 
    } 
    fmt.Println(a, m) 
} 

我也許檢查delete回報刪除鍵值:

package main 

func main() { 
    m := map[string]int{"a":1, "b":2} 
    println(delete(m, "a")) 
} 

但是,這並不工作:

prog.go:5: delete(m, "a") used as value 
+0

「Pop」是堆棧/堆的典型操作。地圖無序;套,如果你願意。改用['container/heap'](http://golang.org/pkg/container/heap/)。 – thwd

+0

@tomwilde我的意思是'pop'就像在[Python dicts](https://docs.python.org/2/library/stdtypes.html#dict.pop) – warvariuc

回答

0

圍棋沒有按對於地圖沒有Pop函數,所以總會有2個操作,一個索引和一個delete

如果您擔心的是詳細的性能,並且像這樣的小幫助函數會被內聯,所以沒有額外的運行時間開銷來使用它。

func pop(m map[string]int, key string) (int, bool) { 
    v, ok := m[key] 
    if ok { 
     delete(m, key) 
    } 
    return v, ok 
} 
+1

你有沒有對「將被內聯」的引用?我有興趣閱讀Go編譯器如何找到候選內聯。 –

+1

@SimonWhitehead你可以去:[inl.c](http://golang.org/src/cmd/gc/inl.c) – fuz