Như đã lưu ý bởi các câu trả lời khác, giải pháp chung là sử dụng biểu thức chỉ mục trong một phép gán của dạng đặc biệt:
v, ok = a[x]
v, ok := a[x]
var v, ok = a[x]
var v, ok T = a[x]
Điều này là tốt đẹp và sạch sẽ. Nó có một số hạn chế mặc dù: nó phải là một sự phân công của hình thức đặc biệt. Biểu thức phía bên phải chỉ là biểu thức chỉ mục bản đồ và danh sách biểu thức bên trái phải chứa chính xác 2 toán hạng, đầu tiên là loại giá trị được gán và một bool
giá trị có thể gán được. Giá trị đầu tiên của kết quả của hình thức đặc biệt này sẽ là giá trị được liên kết với khóa và giá trị thứ hai sẽ cho biết nếu thực sự có một mục trong bản đồ với khóa đã cho (nếu khóa tồn tại trong bản đồ). Danh sách biểu thức phía bên trái cũng có thể chứa định danh trống nếu không cần một trong các kết quả.
Điều quan trọng cần biết là nếu giá trị bản đồ được lập chỉ mục có nil
hoặc không chứa khóa, biểu thức chỉ mục sẽ ước tính giá trị 0 của loại giá trị của bản đồ. Ví dụ:
m := map[int]string{}
s := m[1] // s will be the empty string ""
var m2 map[int]float64 // m2 is nil!
f := m2[2] // f will be 0.0
fmt.Printf("%q %f", s, f) // Prints: "" 0.000000
Hãy thử nó trên Sân chơi Go .
Vì vậy, nếu chúng tôi biết rằng chúng tôi không sử dụng giá trị 0 trong bản đồ của mình, chúng tôi có thể tận dụng lợi thế này.
Ví dụ: nếu loại giá trị là string
và chúng tôi biết rằng chúng tôi không bao giờ lưu trữ các mục trong bản đồ trong đó giá trị là chuỗi trống (giá trị 0 cho string
loại), chúng tôi cũng có thể kiểm tra xem khóa có trong bản đồ hay không bằng cách so sánh không đặc biệt dạng của biểu thức chỉ số (kết quả của) đến giá trị 0:
m := map[int]string{
0: "zero",
1: "one",
}
fmt.Printf("Key 0 exists: %t\nKey 1 exists: %t\nKey 2 exists: %t",
m[0] != "", m[1] != "", m[2] != "")
Đầu ra (thử trên Sân chơi Go ):
Key 0 exists: true
Key 1 exists: true
Key 2 exists: false
Trong thực tế, có nhiều trường hợp chúng ta không lưu trữ giá trị 0 trong bản đồ, vì vậy điều này có thể được sử dụng khá thường xuyên. Ví dụ: giao diện và loại chức năng có giá trị bằng 0 nil
, mà chúng ta thường không lưu trữ trong bản đồ. Vì vậy, kiểm tra nếu một khóa trong bản đồ có thể đạt được bằng cách so sánh nó với nil
.
Sử dụng "kỹ thuật" này cũng có một lợi thế khác: bạn có thể kiểm tra sự tồn tại của nhiều khóa theo cách nhỏ gọn (bạn không thể làm điều đó với biểu mẫu "dấu phẩy ok" đặc biệt). Thông tin thêm về điều này: Kiểm tra xem khóa có tồn tại trong nhiều bản đồ trong một điều kiện không
Lấy giá trị 0 của loại giá trị khi lập chỉ mục với khóa không tồn tại cũng cho phép chúng tôi sử dụng bản đồ với bool
các giá trị thuận tiện dưới dạng bộ . Ví dụ:
set := map[string]bool{
"one": true,
"two": true,
}
fmt.Println("Contains 'one':", set["one"])
if set["two"] {
fmt.Println("'two' is in the set")
}
if !set["three"] {
fmt.Println("'three' is not in the set")
}
Nó xuất ra (thử trên Sân chơi Go ):
Contains 'one': true
'two' is in the set
'three' is not in the set
Xem liên quan: Làm thế nào tôi có thể tạo một mảng có chứa các chuỗi duy nhất?