2010-08-18 45 views
13

Tôi đang tìm kiếm một khả năng ngôn ngữ đi tương tự như "từ điển" trong python để tạo thuận lợi cho việc chuyển đổi một số mã python.Có thư viện đi nào cung cấp khả năng kết hợp mảng không?

CHỈNH SỬA: Bản đồ hoạt động khá tốt cho ứng dụng loại trừ này. Tôi đã có thể ngưng tụ 1.3e6 mục được sao chép xuống còn 2.5e5 mục duy nhất bằng cách sử dụng bản đồ có chỉ mục chuỗi 16 byte chỉ trong vài giây. Mã liên quan đến bản đồ rất đơn giản nên tôi đã bao gồm nó bên dưới. Đáng chú ý là trước khi phân bổ của bản đồ với 1.3e6 yếu tố tăng tốc nó lên bằng cách chỉ một vài phần trăm:

var m = make(map[string]int, 1300000) // map with initial space for 1.3e6 elements 

ct, ok := m[ax_hash] 
if ok { 
    m[ax_hash] = ct + 1 
} else { 
    m[ax_hash] = 1 
} 
+0

Không cần điều kiện, nó thành ngữ hơn chỉ để thực hiện 'm [key] ++'. Nếu khóa không tồn tại, bạn nhận được giá trị bằng không. –

Trả lời

9

Loại bản đồ. http://golang.org/doc/effective_go.html#maps

Có một số khác biệt từ python trong đó các phím phải được nhập, vì vậy bạn không thể kết hợp các phím số và chuỗi (vì một số lý do tôi quên bạn có thể), nhưng chúng khá dễ sử dụng .

dict := make(map[string]string) 
dict["user"] = "so_user" 
dict["pass"] = "l33t_pass1" 
+1

Bạn có thể tạo một giao diện [string] bản đồ {} để chứa các loại hỗn hợp nếu bạn không nhớ các xác nhận kiểu, nhập công tắc hoặc thậm chí có thể phản ánh để lấy lại các giá trị. –

+0

Tất cả các phím sẽ là giá trị chuỗi vì vậy tôi nghĩ rằng điều này sẽ làm việc chỉ phạt – Hotei

+0

@ Chickencha yah Tôi chỉ đề cập đến loại khóa. Tôi sử dụng map [string] interface {} khá một chút – cthom06

0

Bạn đang có lẽ tìm kiếm một map.

29

Để mở rộng một chút về câu trả lời đã được đưa ra:

Một Go bản đồ là một đánh máy băm cấu trúc dữ liệu bản đồ. Chữ ký loại của bản đồ có dạng map[keyType]valueType trong đó keyTypevalueType là các loại khóa và giá trị tương ứng.

Để khởi tạo một bản đồ, bạn phải sử dụng chức năng make:

m := make(map[string]int) 

Một bản đồ chưa được khởi tạo bằng nil, và nếu đọc từ hay viết một hoảng loạn sẽ xảy ra khi chạy.

Cú pháp để lưu trữ các giá trị cũng tương tự như làm như vậy với mảng hoặc lát:

m["Alice"] = 21 
m["Bob"] = 17 

Tương tự như vậy, lấy giá trị từ một bản đồ được thực hiện như sau:

a := m["Alice"] 
b := m["Bob"] 

Bạn có thể sử dụng từ khóa range để lặp qua bản đồ với vòng lặp for:

for k, v := range m { 
    fmt.Println(k, v) 
} 

Mã này sẽ in:

Alice 21 
Bob 17 

Lấy một giá trị cho một chìa khóa mà không có trong bản đồ sẽ trở lại giá trị kiểu giá trị của số không:

c := m["Charlie"] 
// c == 0 

Bằng cách đọc nhiều giá trị từ một bản đồ, bạn có thể kiểm tra sự hiện diện của một chìa khóa.Giá trị thứ hai sẽ là một boolean chỉ ra sự hiện diện của chính:

a, ok := m["Alice"] 
// a == 21, ok == true 
c, ok := m["Charlie"] 
// c == 0, ok == false 

Để loại bỏ một mục quan trọng/giá trị từ một bản đồ, bạn lật nó xung quanh và gán false như giá trị thứ hai:

m["Bob"] = 0, false 
b, ok := m["Bob"] 
// b == 0, ok == false 

Bạn có thể lưu trữ các loại tùy ý trong bản đồ bằng cách sử dụng các loại giao diện trống interface{}:

n := make(map[string]interface{}) 
n["One"] = 1 
n["Two"] = "Two" 

các điều kiện duy nhất là khi lấy những giá trị bạn phải thực hiện một loại khẳng định để sử dụng chúng ở dạng ban đầu của họ:

a := n["One"].(int) 
b := n["Two"].(string) 

Bạn có thể sử dụng một công tắc loại để xác định loại các giá trị bạn đang kéo ra, và đối phó với chúng một cách thích hợp:

for k, v := range n { 
    switch u := v.(type) { 
     case int: 
      fmt.Printf("Key %q is an int with the value %v.\n", k, u) 
     case string: 
      fmt.Printf("Key %q is a string with the value %q.\n", k, u) 
    } 
} 

Bên trong mỗi khối case, u sẽ thuộc loại được chỉ định trong tuyên bố case; không có xác nhận loại rõ ràng là cần thiết.

Mã này sẽ in:

Key "One" is an int with the value 1. 
Key "Two" is a string with the value "Two". 

Chìa khóa có thể là bất kỳ loại mà các nhà điều hành bình đẳng được xác định, chẳng hạn như số nguyên, phao, dây, và con trỏ. Các loại giao diện cũng có thể được sử dụng, miễn là loại cơ bản hỗ trợ sự bình đẳng. (Struct, mảng và lát không thể được sử dụng như phím bản đồ, vì bình đẳng không được định nghĩa trên các loại.)

Ví dụ, bản đồ o có thể lấy chìa khóa của bất kỳ của các loại trên:

o := make(map[interface{}]int) 
o[1] = 1 
o["Two"] = 2 

Và đó là bản đồ trong một nutshell.

+0

Giống như các bản đồ và công tắc loại khác, với dấu gạch ngang của mặt trong rỗng {}. Câu trả lời tuyệt vời. – cthom06

+0

+1 cho khóa giao diện {}, tuyệt vời tôi đã bỏ lỡ cảm ơn – zupa

Các vấn đề liên quan