harita [anahtar] silinsin mi?


166

Bir haritam var:

var sessions =  map[string] chan int{}

Nasıl silebilirim sessions[key]? Denedim:

sessions[key] = nil,false;

Bu işe yaramadı.


Güncelleme (Kasım 2011):

Harita sürümlerini silmek için özel sözdizimi Go sürüm 1'de kaldırılır :

Go 1, özel harita atamasını kaldıracak ve yeni bir yerleşik işlev sunacaktır delete: delete(m, x)İfade tarafından alınan harita girişini silecektir m[x]. ...

Yanıtlar:


154

Yeterince garip,

package main

func main () {
    var sessions = map[string] chan int{};
    delete(sessions, "moo");
}

işe yarıyor gibi görünüyor. Bu kaynakların kötü kullanımı gibi görünüyor!

Başka bir yol varlığını kontrol etmek ve değerin kendisini kullanmaktır:

package main

func main () {
    var sessions = map[string] chan int{};
    sessions["moo"] = make (chan int);
    _, ok := sessions["moo"];
    if ok {
        delete(sessions, "moo");
    }
}

Değeri aramak ve yeniden kullanmak daha ucuz olmalı: sessions["moo"] = sessions["moo"], false;(ya da bu yanlış mı?)
u0b34a0f6ae

Anahtar yoksa bu kilitlenir. Fikrinize dayanarak başka bir çözüm ekledim.

1
Haritanın kendisini değiştirirken bu güvenli midir?
Jorge Ramirez

@JorgeRamirez inanmıyorum. bunu yapmak istiyorsanız, harita nesnesinin kendisi yerine bir dilim anahtar üzerinde yineleme yapmanın bir yolunu bulun
Seaux

6
İkinci çözüm neden kaynakları daha iyi kullanıyor? İkinci çözümde iki anahtar arama yaparken, ilk çözümde bir anahtar arama yaparsınız.
thebiggestlebowski

86

Go 1 sürüm notlarından kopyalandı

Eski dilde, anahtarı ktemsil ettiği haritadan girişi silmek için m, ifadeyi yazdı,

m[k] = value, false

Bu sözdizimi kendine özgü özel bir durumdu, sadece iki bire bir ödevdi. Değerlendirilen ancak atılan bir değerin (genellikle yoksayılır) yanı sıra neredeyse her zaman sabit yanlış olan bir boole iletilmesi gerekiyordu. İşi yaptı ama tuhaftı ve tartışma konusu oldu.

Go 1'de bu sözdizimi gitti; bunun yerine yeni bir yerleşik işlev vardır delete. Arama

delete(m, k)

ifadesi tarafından alınan harita girişini siler m[k]. Dönüş değeri yok. Var olmayan bir girişi silmek işlem yapılmaz.

Güncellenmesi: Koşu go fixformun ifadeleri dönüştürür m[k] = value, falseiçine delete(m, k)göz ardı değer güvenle programdan atılır ve edilebileceği açık olduğunda falseönceden boolean sabiti ifade etmektedir. Düzeltme aracı, programcı tarafından incelenmek üzere sözdiziminin diğer kullanımlarını işaretleyecektir.


55

Gönderen Etkili Go :

Bir harita girişini silmek için, argümanları harita ve silinecek anahtar olan yerleşik sil işlevini kullanın. Anahtar haritada bulunmasa bile bunu yapmak güvenlidir.

delete(timeZone, "PDT")  // Now on Standard Time

sessions.go:6: cannot use 0 (type int) as type chan int

3
@Kinopiko: Jurily'nin OP'nin bu kod snippet'ini kullanması anlamına geldiğini düşünmüyorum. Dokümanlardan sadece bir örnek kopyaladı.
Isaiah

2
Görünüşe göre bu kaldırıldı, almaassignment count mismatch: 1 = 2 (use delete)
ghayes


0

Yerine make (chan int)kullanın nil. İlk değer, haritanızın sahip olduğu türle aynı olmalıdır.

package main

import "fmt"

func main() {

    var sessions = map[string] chan int{}
    sessions["somekey"] = make(chan int)

    fmt.Printf ("%d\n", len(sessions)) // 1

    // Remove somekey's value from sessions
    delete(sessions, "somekey")

    fmt.Printf ("%d\n", len(sessions)) // 0
}

GÜNCELLEME: Cevabım düzeltildi.


sessions.go:6: cannot use 0 (type int) as type chan int

Hata! Bunu da kaldırdığımı unuttum: P
Yeşaya

package main func main () {var sessions = map[string] chan int{};sessions["moo"] = make (chan int);}

Yukarıdakiler Go sürümümü derler ve çalışır.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.