xóa bản đồ [key] trong go?


166

Tôi có một bản đồ:

var sessions =  map[string] chan int{}

Làm thế nào để tôi xóa sessions[key]? Tôi đã thử:

sessions[key] = nil,false;

Điều đó đã không làm việc.


Cập nhật (tháng 11 năm 2011):

Cú pháp đặc biệt để xóa các mục bản đồ được xóa trong phiên bản 1 :

Go 1 sẽ xóa phép gán bản đồ đặc biệt và giới thiệu một hàm dựng sẵn mới , delete: delete(m, x)sẽ xóa mục nhập bản đồ được lấy bởi biểu thức m[x]. ...

Câu trả lời:


154

Thật kỳ lạ,

package main

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

dường như làm việc Điều này có vẻ như sử dụng tài nguyên kém!

Một cách khác là kiểm tra sự tồn tại và sử dụng chính giá trị đó:

package main

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

Tra cứu giá trị và tái sử dụng nó phải rẻ hơn: sessions["moo"] = sessions["moo"], false;(hoặc điều đó có sai không?)
u0b34a0f6ae

Đó là sự cố trừ khi chìa khóa có mặt. Tôi đã thêm một giải pháp khác dựa trên ý tưởng của bạn.

1
Điều này có an toàn để sử dụng trong khi tìm bản đồ không?
Jorge Ramirez

@JorgeRamirez tôi không tin như vậy. nếu bạn muốn làm điều đó, hãy tìm cách lặp lại một lát phím thay vì chính đối tượng bản đồ
Seaux

5
Tại sao giải pháp thứ hai là sử dụng tài nguyên tốt hơn? Trong giải pháp thứ hai, bạn thực hiện hai tra cứu chính, trong khi ở giải pháp thứ nhất, bạn tìm kiếm một khóa.
thebigestlebowski

86

Sao chép từ ghi chú phát hành Go 1

Trong ngôn ngữ cũ, để xóa mục nhập bằng khóa ktừ bản đồ được đại diện bởi m, người ta đã viết câu lệnh,

m[k] = value, false

Cú pháp này là một trường hợp đặc biệt, nhiệm vụ hai chỉ một. Nó yêu cầu chuyển một giá trị (thường bị bỏ qua) được đánh giá nhưng bị loại bỏ, cộng với một giá trị boolean gần như luôn luôn là sai. Nó đã làm công việc nhưng kỳ quặc và một điểm gây tranh cãi.

Trong Go 1, cú pháp đó đã biến mất; thay vào đó là một chức năng tích hợp mới , delete. Cuộc gọi

delete(m, k)

sẽ xóa mục nhập bản đồ được lấy bởi biểu thức m[k]. Không có giá trị quay lại. Xóa một mục không tồn tại là không có.

Cập nhật: Chạy go fixsẽ chuyển đổi các biểu thức của biểu mẫu m[k] = value, falsethành delete(m, k)khi rõ ràng rằng giá trị bị bỏ qua có thể được loại bỏ một cách an toàn khỏi chương trình và falsetham chiếu đến hằng số boolean được xác định trước. Công cụ sửa lỗi sẽ đánh dấu các cách sử dụng cú pháp khác để lập trình viên kiểm tra.


54

Từ đi hiệu quả :

Để xóa một mục bản đồ, sử dụng chức năng xóa tích hợp, có đối số là bản đồ và khóa cần xóa. An toàn để làm điều này ngay cả khi khóa đã vắng mặt trên bản đồ.

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

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

3
@Kinopiko: Tôi không nghĩ Jurily có nghĩa là để OP sử dụng đoạn mã đó. Ông chỉ sao chép một ví dụ từ các tài liệu.
Ê-sai

2
Có vẻ như điều này đã bị xóa kể từ khi nhận đượcassignment count mismatch: 1 = 2 (use delete)
ghayes


0

Sử dụng make (chan int)thay vì nil. Giá trị đầu tiên phải cùng loại với bản đồ của bạn.

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
}

CẬP NHẬT: Sửa câu trả lời của tôi.


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

Rất tiếc, tôi đã quên rằng tôi cũng đã xóa: P
Ê-sai

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

Các biên dịch trên và chạy trên phiên bản Go của tôi.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.