Избежание необходимости избыточной проверки для отображения заданного нулевого значения строки? - PullRequest
0 голосов
/ 24 февраля 2020

У нас есть map[string]string, я предполагаю, что это означает, что нулевое значение строки, извлеченной из карты, равно ""

Так не значит ли это, что:

var userId, ok = params["user_id"];

if !ok || userId == "" {
    return 422, "Missing user_id in request"
}

- это та же логика c, что и эта:

var userId = params["user_id"];

if  userId == "" {
    return 422, "Missing user_id in request"
}

, только чтобы убедиться, что мое понимание верно.

1 Ответ

5 голосов
/ 24 февраля 2020

Это не то же самое, если вы намереваетесь сохранить нулевое значение типа значения.

См. Этот пример:

m := map[string]string{
    "empty": "",
}

if v, ok := m["empty"]; ok {
    fmt.Printf("'empty' is present: %q\n", v)
} else {
    fmt.Println("'empty' is not present")
}
if v, ok := m["missing"]; ok {
    fmt.Printf("'missing' is present: %q\n", v)
} else {
    fmt.Printf("'missing' is not present")
}

Он выводит (попробуйте на Go Детская площадка ):

'empty' is present: ""
'missing' is not present

Это правда, что если вы никогда не сохраняете нулевое значение на карте, вы можете просто использовать if m[value] == zeroValue {}. Это подробно описано здесь: Как проверить, содержит ли карта ключ в Go?

Это «свойство» карт можно использовать для элегантного создания наборов. См. Как я могу создать массив, содержащий уникальные строки?

И использование этой "методики" имеет и другое преимущество: вы можете компактно проверить наличие нескольких ключей (вы можете ' сделать это с помощью специальной формы "запятая нормально"). Подробнее об этом: Проверьте, существует ли ключ на нескольких картах в одном условии

...