Lặp lại tất cả các phím của bản đồ


316

Có cách nào để lấy danh sách tất cả các phím trong bản đồ ngôn ngữ Go không? Số lượng phần tử được cung cấp bởi len(), nhưng nếu tôi có một bản đồ như:

m := map[string]string{ "key1":"val1", "key2":"val2" };

Làm thế nào để tôi lặp đi lặp lại trên tất cả các phím?

Câu trả lời:


546

https://play.golang.org/p/JGZ7mN0-U-

for k, v := range m { 
    fmt.Printf("key[%s] value[%s]\n", k, v)
}

hoặc là

for k := range m {
    fmt.Printf("key[%s] value[%s]\n", k, m[k])
}

Thông số kỹ thuật của ngôn ngữ cho các forcâu lệnh xác định rằng giá trị đầu tiên là khóa, biến thứ hai là giá trị, nhưng không phải có mặt.


22
Như một gotcha có thể, lưu ý rằng thứ tự lặp không được xác định. Groups.google.com/d/msg/golang-nuts/YfDxpkI34hY/4pktJI2ytusJ
mna

23
Sudhir: thông số ngôn ngữ golang xác định rõ ràng các bản đồ là có thứ tự các phím không xác định. Hơn nữa, kể từ Go 1, thứ tự chính được cố ý ngẫu nhiên giữa các lần chạy để ngăn chặn sự phụ thuộc vào bất kỳ thứ tự nhận thức nào.
Mark Renouf

6
Lưu ý rằng đây không phải là lần lặp có thể thay đổi, nghĩa là xóa một khóa sẽ yêu cầu bạn khởi động lại lần lặp.
Rick Smith

Ngoài ra đối với các tập dữ liệu nhỏ, thứ tự bản đồ có thể dự đoán được.
woot

14

Đây là một số cách dễ dàng để lấy slicecác phím bản đồ.

// Return keys of the given map
func Keys(m map[string]interface{}) (keys []string) {
    for k := range m {
        keys = append(keys, k)
    }
    return keys
}

// use `Keys` func
func main() {
    m := map[string]interface{}{
        "foo": 1,
        "bar": true,
        "baz": "baz",
    }
    fmt.Println(Keys(m)) // [foo bar baz]
}

Có thể cho Keyschức năng lấy bản đồ với các loại khóa, không chỉ các chuỗi?
Robert T. McGissa 9/2/2015

func Keys(m map[interface{}]interface{}) (keys []interface{}), @ RobertT.McGunk bạn cần thay đổi chức năng "nguyên mẫu"
a8m

1
@ArielM. Điều đó sẽ chỉ làm việc cho các loại chính xác map[interface{}]interface{}. Đi không hỗ trợ thuốc generic. Bạn không thể tạo một hàm với maptham số chấp nhận bản đồ với các loại khóa khác nhau.
icza

10

Có cách nào để lấy danh sách tất cả các phím trong bản đồ ngôn ngữ Go không?

ks := reflect.ValueOf(m).MapKeys()

Làm thế nào để tôi lặp lại tất cả các phím?

Sử dụng câu trả lời được chấp nhận:

for k, _ := range m { ... }

1
Tôi nghĩ ý bạn là for _, k := range v.MapKeys(), vì trong ví dụ của bạn, ksẽ là chỉ số int của lát khóa
Brian Leishman
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.