Checking Existence of Keys in Multiple Maps Simultaneously
Question:
In Go, when checking if the same key exists in multiple maps, one approach is to use the ok flag within an if condition, as shown below:
if v1, ok1 := map1["aaa"]; ok1 { ... } if v2, ok2 := map2["aaa"]; ok2 { ... }
However, it's desirable to condense these two conditions into one. Can this be achieved with a single if statement?
Answer:
Unfortunately, it is not possible to perform key existence checks in multiple maps using a single if condition. The Go language specification mandates that index expressions (such as map1["aaa"]) in assignments or initializations of the form v, ok := m[k] yield an additional untyped boolean value (ok).
This implies that the special v, ok := m[k] form can only be used when nothing else is being assigned. However, there is an alternative approach if the value type of the maps is an interface type and the nil value is not used. In this case, you can use a simple tuple-assignment:
if v1, v2 := m1["aaa"], m2["aaa"]; v1 != nil && v2 != nil { fmt.Printf("Both maps contain key '%s': %v, %v\n", "aaa", v1, v2) }
To simplify this process further, you can create a helper function that performs the key check and returns the values and ok flags for both maps:
func idx(m1, m2 map[string]interface{}, k string) ( v1, v2 interface{}, ok1, ok2 bool) { v1, ok1 = m1[k] v2, ok2 = m2[k] return }
Then, you can use this function to perform a single-step check:
if v1, v2, ok1, ok2 := idx(m1, m2, "aaa"); ok1 && ok2 { fmt.Printf("Both maps contain key '%s': %v, %v\n", "aaa", v1, v2) }
By utilizing these techniques, you can efficiently check the existence of keys in multiple maps in Go.
The above is the detailed content of How Can I Efficiently Check for the Existence of a Key in Multiple Go Maps Simultaneously?. For more information, please follow other related articles on the PHP Chinese website!