Làm cách nào để xóa bản đồ trong cờ vây?


85

Tôi đang tìm một cái gì đó giống như hàm c ++ .clear() cho kiểu nguyên thủy map.

Hay tôi chỉ nên tạo một bản đồ mới để thay thế?

Cập nhật: Cảm ơn bạn đã trả lời. Bằng cách xem xét các câu trả lời, tôi chỉ nhận ra rằng đôi khi việc tạo một bản đồ mới có thể dẫn đến một số mâu thuẫn mà chúng tôi không muốn. Hãy xem xét ví dụ sau:

var a map[string]string
var b map[string]string

func main() {
    a = make(map[string]string)
    b=a
    a["hello"]="world"
    a = nil
    fmt.Println(b["hello"])
}

Ý tôi là, hàm này vẫn khác với .clear()hàm trong c ++, hàm này sẽ xóa nội dung trong đối tượng.



1
cũng có cuộc thảo luận về thanh trừng built-in
perreal

Câu trả lời:


108

Bạn có thể chỉ nên tạo một bản đồ mới. Không có lý do thực sự nào để bận tâm cố gắng xóa một bản đồ hiện có, trừ khi cùng một bản đồ đang được tham chiếu bởi nhiều đoạn mã và một đoạn cần phải xóa rõ ràng các giá trị để thay đổi này hiển thị với các đoạn mã khác.

Vì vậy, có thể bạn chỉ nên nói

mymap = make(map[keytype]valtype)

Nếu bạn thực sự cần xóa bản đồ hiện tại vì bất kỳ lý do gì, điều này đủ đơn giản:

for k := range m {
    delete(m, k)
}

1
Vì vậy, xóa từng phần tử một là cách duy nhất để làm điều đó?
lavin

@lavin: Đúng. Không có chức năng tích hợp nào để thực hiện việc này và bạn không thể có chức năng thư viện thực hiện việc này cho các bản đồ tùy ý. Nhưng dù sao nó cũng chỉ có 3 dòng.
Lily Ballard

6
Có thực sự OK khi sửa đổi nội dung của bản đồ trong khi lặp qua tất cả các giá trị không? Các ngôn ngữ khác sẽ không hoạt động chính xác với điều này.
John Jeffery

5
@JohnJeffery: Tôi đã thử nghiệm điều này trước khi đăng nó. Có vẻ hiệu quả. Ngôn ngữ thực tế từ thông số cho biết The iteration order over maps is not specified and is not guaranteed to be the same from one iteration to the next. If map entries that have not yet been reached are deleted during iteration, the corresponding iteration values will not be produced. If map entries are inserted during iteration, the behavior is implementation-dependent, but the iteration values for each entry will be produced at most once. If the map is nil, the number of iterations is 0.Điều này cho thấy nó được hỗ trợ.
Lily Ballard

18
Bắt đầu từ Go 1.11, các hoạt động xóa bản đồ của biểu mẫu này được trình biên dịch tối ưu hóa. github.com/golang/go/blob/master/doc/go1.11.html
Benjamin B.

20

Không giống như C ++, Go là một ngôn ngữ được thu thập rác. Bạn cần nghĩ mọi thứ khác đi một chút.

Khi bạn tạo một bản đồ mới

a := map[string]string{"hello": "world"}
a = make(map[string]string)

bản đồ gốc cuối cùng sẽ được thu gom; bạn không cần phải xóa nó theo cách thủ công. Nhưng hãy nhớ rằng bản đồ (và các lát cắt) là loại tham chiếu; bạn tạo chúng với make(). Bản đồ bên dưới sẽ chỉ được thu thập khi không có tham chiếu nào đến nó. Vì vậy, khi bạn làm

a := map[string]string{"hello": "world"}
b := a
a = make(map[string]string)

mảng ban đầu sẽ không được thu gom rác (cho đến khi b được thu thập rác hoặc b tham chiếu đến một thứ khác).


2
// Method - I , say book is name of map
for k := range book {
    delete(book, k)
}

// Method - II
book = make(map[string]int)

// Method - III
book = map[string]int{}

-5

Nếu bạn đang cố gắng thực hiện việc này trong một vòng lặp, bạn có thể tận dụng quá trình khởi tạo để xóa bản đồ cho bạn. Ví dụ:

for i:=0; i<2; i++ {
    animalNames := make(map[string]string)
    switch i {
        case 0:
            animalNames["cat"] = "Patches"
        case 1:
            animalNames["dog"] = "Spot";
    }

    fmt.Println("For map instance", i)
    for key, value := range animalNames {
        fmt.Println(key, value)
    }
    fmt.Println("-----------\n")
}

Khi bạn thực hiện điều này, nó sẽ xóa bản đồ trước đó và bắt đầu với một bản đồ trống. Điều này được xác minh bởi đầu ra:

$ go run maptests.go 
For map instance 0
cat Patches
-----------

For map instance 1
dog Spot
-----------

3
Đó không phải là xóa bản đồ mà là tạo một bản đồ mới và liên kết với một biến cục bộ có cùng tên mỗi vòng lặp.
Delaney
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.