2013-11-27 8 views
6

Yapabileceğim:Go'da setdefault eşdeğeri?

_, ok := some_go_map[a_key] 

anahtarın varlığını sınamak için.

Ancak Python'un dict'nin setdefault yöntemiyle (bir anahtar "map" [dict == ilişkisel dizi] olarak ayarlanmış bir değere sahip değilse, verilen bir varsayılan değere ayarlayın ve sonra alın. almak).

Aynı şey elde etmek için Go'da bir deyim olup olmadığını mı merak ediyorsunuz?

+0

Python'da, her zaman 'defaultdict' kullanabilirsiniz. – thefourtheye

+0

Erm Biliyorum ama sorum şu Python'a (setdefault) benzer bir şeyle ilgili. – LetMeSOThat4U

+0

Biliyorsunuz, ancak haritada bir anahtar bulunmadığında, git size değer türünün "sıfır değeri" değerini verir. Bu ''' '' '' '' '' '' '' 'n'' için bir' '' '' '' nil'' için nil' 'bir tür nilâl türler. Yani sıfır bir varsayılan değer ise, şanslısınız demektir. Değilse, aşağıdaki yanıtlardan biri iyi görünmektedir. Burada, hem Go'nun yerleşik behavvior'unda [SetDefault] hem de set-with- (nonzero) -default için '[]' işlevini kullanmanıza izin veren kodlarının bir varyasyonu vardır. Aynı sözlük: http://play.golang.org/p/5SIJSWNWO7 – twotwotwo

cevap

6

Hep kendiniz tanımlayabilirsiniz:

func setDefault(h map[string]int, k string, v int) (set bool, r int) { 
    if r, set = h[k]; !set { 
     h[k] = v 
     r = v 
     set = true 
    } 
    return 
} 

Ama hayır, stdlib değil. Genellikle bunu satır içi yaparsınız.

1

olarak bildiğim kadarıyla, yerleşik böyle bir şey yoktur . Sen

Go varsayılan davranışı "dönmek olduğunu http://play.golang.org/p/pz34p7w6fP

package main 

import "fmt" 

type Default struct { 
    vals  map[string]int 
    defaults int 
} 

func (d *Default) Get(key string) int { 
    if val, ok := d.vals[key]; ok { 
     return val 
    } 
    return d.defaults 
} 

func main() { 
    someMap := Default{map[string]int{"foo": 1, "bar": 2}, 5} 
    fmt.Println(someMap.Get("foo")) 
    fmt.Println(someMap.Get("doesn't exist")) 
} 
5

Not yardım etmek bir tür ekleyebilirsiniz zero value "bir arama anahtarı eksik olduğunda, değer türü (örneğin, 0 veya "") için, istediğiniz varsayılan değer varsa, zaten ayarlanmışsınız demektir.

http://play.golang.org/p/5SIJSWNWO7

package main 

import "fmt" 

type Dict map[string]float64 

func (d Dict) SetDefault(key string, val float64) (result float64) { 
    if v, ok := d[key]; ok { 
     return v 
    } else { 
     d[key] = val 
     return val 
    } 
} 

func main() { 
    dd := Dict{} 
    dd["a"] = 3 
    fmt.Println(dd.SetDefault("a", 1)) 
    fmt.Println(dd.SetDefault("b", 2)) 
} 
- Eğer Go yerleşik davranış veya d.SetDefault(key, val) için d[key] kullanabilir ya Buddy ve larsmans yanıtlarını kapalı riffing

, burada adlandırılmış Dict türüne yeni bir yöntem ekler kod, bu yüzden