2017-02-01 12 views
6

Tôi cần phải kiểm tra xem phím cùng tồn tại trong hai bản đồ:Kiểm tra nếu chính tồn tại trong nhiều bản đồ trong một điều kiện

if v1, ok1 := map1["aaa"]; ok1 { 
... 
} 
if v2, ok2 := map2["aaa"]; ok2 { 
... 
} 

Có thể tham gia hai điều kiện này thành một? Tôi cố gắng làm điều gì đó như thế này:

v1, ok1 := map1["aaa"] 
v2, ok2 := map2["aaa"] 
if ok1 && ok2 { 
... 
} 

nhưng tôi tò mò cho dù đó (gán và kiểm tra) có thể được thực hiện bằng một if điều kiện.

Trả lời

4

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 oktrue 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.

+0

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. –

+0

@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

0

bạn cũng có thể sử dụng tham số variadic (ba chấm) để kiểm tra nhiều phím:

// check map 1 and map2 is null or not 
func checkMap(m1, m2 map[string]interface{}, keys ...string) []bool { 
    var isExist []bool 

    for key := range keys { 
     //checking value from map 1 
     _, ok := m1[keys[key]] 
     if ok { 
      isExist = append(isExist, true) // append for the first time to avoid panic 
     } else { 
      isExist = append(isExist, false) // append for the first time to avoid panic 
     } 

     // checking value from map2 
     _, ok = m2[keys[key]] 
     if ok { 
      isExist[key] = true 
     } else { 
      isExist[key] = false 
     } 
    } 

    return isExist 
} 

Và sau đó bạn có thể kiểm tra các phím của bạn để như thế này:

result := checkMap(myMap, myMap2, "a", "b", "c", "d", "e", "f", "g") 
fmt.Printf("result = %+v\n", result) // print the result 

if result[0] { 
    fmt.Println("key a exist in both map") 
} 

if result[1] { 
    fmt.Println("key b exist in both map") 
} 
+0

Đó là một số tiền hợp lý của dự phòng và tôi không nghĩ rằng nó biên dịch rất tốt ... –

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