То, что вы делаете, на самом деле работает, потому что вы используете специальную идиому с запятой в утверждении типа, которое не паникует, если утверждение не выполняется, и потому что карты могут быть проиндексированы с ключами, которых нет в ней (что приведет к нулевому значению типа значения карты).
Это правда, что с этим вы не можете сказать, есть ли ключ в карте или нет, или он есть, но его значение nil
, но вы уже подозревали это, как будто утверждение не выполняется, вы печатаете "значение делает не существует или не является строкой".
Чтобы протестировать все «угловые» случаи, см. этот пример:
m := map[string]interface{}{
"key": "the value",
"key2": 2,
"key3": nil,
// "key4":"", // Uncommented on purpose
}
for _, k := range []string{"key", "key2", "key3", "key4"} {
if value, ok := m[k].(string); ok {
fmt.Printf("[key: %s] value exists and is a string: %s\n", k, value)
} else {
fmt.Printf("[key: %s] value does not exist or is not a string: %s\n",
k, value)
}
}
Вывод (попробуйте на Go Playground):
[key: key] value exists and is a string: the value
[key: key2] value does not exist or is not a string:
[key: key3] value does not exist or is not a string:
[key: key4] value does not exist or is not a string:
Таким образом, вы можете использовать это, от этого не произойдет ничего плохого (например, паника или утечка памяти), просто знайте его пределы (например, вы не можете получить значение, связанное с "key2"
, поскольку оно не относится к типу string
).
Если вы хотите получить значение ключа, если он существует и имеет тип string
, то именно это и делает ваш код. Хотя вам следует избегать структур данных и конструкций там, где они вам нужны, так как их сложнее понять и поддерживать в больших проектах.
Под этим я подразумеваю, например, что если в какой-то момент вашего кода вы ожидаете, что ключ "somekey"
будет иметь связанное значение string
, а это не так, вы не сразу узнаете, почему это так; это потому, что карта не содержит этого ключа, или это потому, что он есть, но со значением неправильного типа (или значение может быть даже nil
)? Необходимо дальнейшее тестирование/отладка, чтобы отследить первопричину.
person
icza
schedule
19.09.2017