ลบแผนที่ [คีย์] ในระหว่างการเดินทางหรือไม่


166

ฉันมีแผนที่:

var sessions =  map[string] chan int{}

ฉันจะลบได้sessions[key]อย่างไร ฉันเหนื่อย:

sessions[key] = nil,false;

นั่นไม่ได้ผล


อัปเดต (พฤศจิกายน 2554):

ไวยากรณ์พิเศษสำหรับการลบรายการแผนที่จะถูกลบในรุ่น Go 1 :

ไป 1 จะลบการกำหนดแผนที่พิเศษและแนะนำใหม่ที่สร้างขึ้นในฟังก์ชั่นdelete: จะลบรายการแผนที่เรียกโดยการแสดงออกdelete(m, x) m[x]...

คำตอบ:


154

แปลกพอ

package main

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

ดูเหมือนว่าจะทำงาน ดูเหมือนจะเป็นการใช้ทรัพยากรที่ไม่ดี!

อีกวิธีหนึ่งคือการตรวจสอบการมีอยู่และใช้ค่าตัวเอง:

package main

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

ค้นหาค่าและการนำกลับมาใช้ใหม่จะต้องมีราคาถูกกว่า: sessions["moo"] = sessions["moo"], false;(หรือเป็นสิ่งที่ผิด?)
u0b34a0f6ae

เกิดขัดข้องยกเว้นว่ามีคีย์อยู่ ฉันได้เพิ่มโซลูชันอื่นตามความคิดของคุณ

1
มีความปลอดภัยในการใช้งานหรือไม่สำหรับการปรับแผนที่เอง?
Jorge Ramirez

@JorgeRamirez ฉันไม่เชื่อเช่นนั้น หากคุณต้องการทำเช่นนั้นหาวิธีที่จะย้ำผ่านชิ้นส่วนของคีย์แทนวัตถุแผนที่ตัวเอง
Seaux

6
เหตุใดโซลูชันที่สองจึงใช้ทรัพยากรได้ดีกว่า ในโซลูชันที่สองคุณค้นหาสองคีย์ขณะที่ในโซลูชันแรกคุณค้นหาคีย์เดียว
thebiggestlebowski

86

คัดลอกจากบันทึกประจำรุ่น Go 1

ในภาษาเก่าเมื่อต้องการลบรายการด้วยคีย์kจากแผนที่ที่แสดงโดยmหนึ่งเขียนคำสั่ง

m[k] = value, false

ไวยากรณ์นี้เป็นกรณีพิเศษเฉพาะการมอบหมายแบบสองต่อหนึ่งเท่านั้น มันต้องผ่านค่า (มักจะถูกละเว้น) ที่ถูกประเมิน แต่ถูกทิ้งรวมถึงบูลีนที่เกือบจะเป็นค่าคงที่เท็จเสมอ มันทำงานได้ แต่แปลกและเป็นประเด็นของการโต้แย้ง

ใน Go 1 ไวยากรณ์นั้นหายไป มีฟังก์ชั่นในตัวใหม่, delete. โทร

delete(m, k)

จะลบรายการแผนที่ที่นิพจน์ดึงm[k]มา ไม่มีค่าส่งคืน การลบรายการที่ไม่มีอยู่คือไม่มี

กำลังอัปเดต: การทำงานgo fixจะแปลงนิพจน์ของฟอร์มm[k] = value, falseเป็นdelete(m, k)เมื่อชัดเจนว่าค่าที่ละเว้นสามารถละทิ้งได้อย่างปลอดภัยจากโปรแกรมและfalseอ้างอิงถึงค่าคงที่บูลีนที่กำหนดไว้ล่วงหน้า เครื่องมือแก้ไขจะตั้งค่าสถานะการใช้งานอื่น ๆ ของไวยากรณ์สำหรับการตรวจสอบโดยโปรแกรมเมอร์


55

จากการเริ่มต้นที่มีประสิทธิภาพ :

ในการลบรายการแผนที่ให้ใช้ฟังก์ชั่นลบในตัวซึ่งมีข้อโต้แย้งคือแผนที่และกุญแจที่จะลบ มันปลอดภัยที่จะทำสิ่งนี้แม้ว่ากุญแจจะหายไปจากแผนที่แล้ว

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

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

3
@Kinopiko: ฉันไม่คิดว่ากฎหมายมีความหมายสำหรับ OP ที่จะใช้ข้อมูลโค้ด เขาเพิ่งคัดลอกตัวอย่างจากเอกสาร
อิสยาห์

2
ดูเหมือนว่าสิ่งนี้จะถูกลบตั้งแต่รับassignment count mismatch: 1 = 2 (use delete)
ghayes


0

ใช้แทนmake (chan int) nilค่าแรกจะต้องเป็นประเภทเดียวกันกับแผนที่ของคุณ

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
}

อัปเดต:แก้ไขคำตอบของฉัน


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

โอ๊ะลืมว่าฉันก็ลบออกเช่นกัน: P
Isaiah

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

ข้างต้นรวบรวมและทำงานบน Go รุ่นของฉัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.