hapus peta [kunci] dalam perjalanan?

166

Saya punya peta:

var sessions =  map[string] chan int{}

Bagaimana cara saya menghapus sessions[key]? Saya mencoba:

sessions[key] = nil,false;

Itu tidak berhasil.


Pembaruan (November 2011):

Sintaks khusus untuk menghapus entri peta dihapus di Go versi 1 :

Pergi 1 akan menghapus peta tugas khusus dan memperkenalkan baru built-in fungsi, delete: delete(m, x)akan menghapus entri peta diambil oleh ekspresi m[x]. ...

Jonas
sumber

Jawaban:

154

Cukup aneh,

package main

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

sepertinya berhasil. Ini tampaknya penggunaan sumber daya yang buruk!

Cara lain adalah dengan memeriksa keberadaan dan menggunakan nilai itu sendiri:

package main

func main () {
    var sessions = map[string] chan int{};
    sessions["moo"] = make (chan int);
    _, ok := sessions["moo"];
    if ok {
        delete(sessions, "moo");
    }
}
coolaj86
sumber
Melihat ke atas nilai dan menggunakan kembali itu harus lebih murah: sessions["moo"] = sessions["moo"], false;(? Atau yang salah)
u0b34a0f6ae
Itu crash kecuali kuncinya ada. Saya telah menambahkan solusi lain berdasarkan ide Anda.
1
Apakah ini aman untuk digunakan sementara untuk rentang peta itu sendiri?
Jorge Ramirez
@JorgeRamirez saya tidak percaya begitu. jika Anda ingin melakukan itu, temukan cara untuk beralih di atas sepotong tombol alih-alih objek peta itu sendiri
Seaux
6
Mengapa solusi kedua adalah penggunaan sumber daya yang lebih baik? Di solusi kedua Anda melakukan dua pencarian kunci, sedangkan di solusi pertama, Anda mencari kunci.
thebiggestlebowski
86

Disalin dari catatan rilis Go 1

Dalam bahasa lama, untuk menghapus entri dengan kunci kdari peta yang diwakili oleh m, seseorang menulis pernyataan,

m[k] = value, false

Sintaks ini adalah kasus khusus yang khas, satu-satunya tugas dua-ke-satu. Untuk itu diperlukan melewati nilai (biasanya diabaikan) yang dievaluasi tetapi dibuang, ditambah boolean yang hampir selalu bernilai false konstan. Itu melakukan pekerjaan tetapi aneh dan titik pertengkaran.

Dalam Go 1, sintaks itu telah hilang; alih-alih ada fungsi bawaan baru delete,. Panggilan

delete(m, k)

akan menghapus entri peta yang diambil oleh ekspresi m[k]. Tidak ada nilai balik. Menghapus entri yang tidak ada adalah no-op.

Memperbarui: Menjalankan go fixakan mengubah ekspresi formulir m[k] = value, falsemenjadi delete(m, k)ketika jelas bahwa nilai yang diabaikan dapat dengan aman dibuang dari program dan falsemengacu pada konstanta boolean yang telah ditentukan. Alat perbaikan akan menandai penggunaan sintaks lain untuk diperiksa oleh programmer.

hannson
sumber
55

Dari Go Efektif :

Untuk menghapus entri peta, gunakan fungsi hapus bawaan, yang argumennya adalah peta dan kunci yang akan dihapus. Aman untuk melakukan ini bahkan jika kunci sudah tidak ada di peta.

delete(timeZone, "PDT")  // Now on Standard Time
György Andrasek
sumber
sessions.go:6: cannot use 0 (type int) as type chan int
3
@Kinopiko: Saya kira Jurily tidak bermaksud agar OP menggunakan potongan kode itu. Dia hanya menyalin contoh dari dokumen.
Yesaya
2
Sepertinya ini telah dihapus sejak, mendapatkanassignment count mismatch: 1 = 2 (use delete)
ghayes
0

Gunakan make (chan int)sebagai ganti nil. Nilai pertama harus jenis yang sama dengan yang dipegang oleh peta Anda.

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
}

PEMBARUAN: Memperbaiki jawaban saya.

Yesaya
sumber
sessions.go:6: cannot use 0 (type int) as type chan int
Ups, lupa bahwa saya menghapusnya juga: P
Yesaya
package main func main () {var sessions = map[string] chan int{};sessions["moo"] = make (chan int);}
Di atas mengkompilasi dan berjalan pada versi Go saya.