Không, không thể thực hiện được. Spec: Index expressions:
Một biểu thức chỉ số trên bản đồ một loại map[K]V
sử dụng trong một assignment hoặc khởi tạo có dạng đặc biệt
v, ok = a[x]
v, ok := a[x]
var v, ok = a[x]
mang lại thêm giá trị boolean untyped. Giá trị của ok
là true
nếu khóa x
có trong bản đồ và ngược lại.
Vì vậy, bạn chỉ có thể sử dụng biểu mẫu đặc biệt v, ok := m[k]
nếu không có gì khác được chỉ định.
Tuy nhiên, nếu bạn không sử dụng zero value của loại giá trị của bản đồ, bạn có thể thực hiện kiểm tra bằng cách sử dụng phân công tuple đơn giản; bằng cách không sử dụng biểu mẫu đặc biệt nhưng 2 biểu thức chỉ mục đơn giản.
Ví dụ nếu kiểu giá trị của bạn là một số loại giao diện (ví dụ interface{}
), và bạn biết bạn không sử dụng giá trị nil
, bạn có thể làm như sau:
if v1, v2 := m1["aaa"], m2["aaa"]; v1 != nil && v2 != nil {
fmt.Printf("Both map contains key '%s': %v, %v\n", "aaa", v1, v2)
}
Dĩ nhiên với một hàm helper , bạn có thể làm điều đó chỉ trong một bước:
func idx(m1, m2 map[string]interface{}, k string) (
v1, v2 interface{}, ok1, ok2 bool) {
v1, ok1 = m1[k]
v2, ok2 = m2[k]
return
}
Sử dụng nó:
if v1, v2, ok1, ok2 := idx(m1, m2, "aaa"); ok1 && ok2 {
fmt.Printf("Both map contains key '%s': %v, %v\n", "aaa", v1, v2)
}
Hãy thử các ví dụ trên Go Playground.
Là tương đối mới để golang tôi phải nói rằng 'if v1, v2, ok1, ok2: = idx (m1, m2," aaa "); ok1 && ok2 {'trông giống như một yếu tố nguy cơ đóng góp cho u ác tính nội nhãn. A.k.a. ung thư mắt. –
@jangroth Tôi sẽ không sử dụng nó, nhưng đó là một khả năng để làm những gì người hỏi muốn. – icza