Синтаксис Голанга в выражении «если» с картой - PullRequest
0 голосов
/ 08 октября 2018

Я читаю учебник здесь: http://www.newthinktank.com/2015/02/go-programming-tutorial/

В разделе «Карты в Картах» он имеет:

package main

import "fmt"

func main() {

    // We can store multiple items in a map as well

    superhero := map[string]map[string]string{
        "Superman": map[string]string{
            "realname":"Clark Kent",
            "city":"Metropolis",
        },

        "Batman": map[string]string{
            "realname":"Bruce Wayne",
            "city":"Gotham City",
        },
    }

    // We can output data where the key matches Superman

    if temp, hero := superhero["Superman"]; hero {
        fmt.Println(temp["realname"], temp["city"])
    }

}

Я не понимаю утверждения «если».Может кто-нибудь объяснить мне синтаксис в этой строке:

if temp, hero := superhero["Superman"]; hero {

Как if temp кажется посторонним бессмысленным, так как temp даже нигде не определен.Что бы это даже достигло?Тогда hero := superhero["Superman"] выглядит как задание.Но что делает точка с запятой?почему последний hero там?

Может ли кто-нибудь помочь новичку?

Большое спасибо.

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Проверка двухзначного присваивания на наличие ключа:

i, ok := m["route"]

В этом выражении первому значению (i) присваивается значение, хранящееся под ключом «route».Если этот ключ не существует, i является нулевым значением типа значения (0).Второе значение (ok) - это bool, которое имеет значение true, если ключ существует на карте, и false, если нет.

Эта проверка в основном используется, когда мы не подтверждены данные внутри карты,Поэтому мы просто проверяем конкретный ключ и, если он существует, присваиваем значение переменной.Это проверка O (1).

В вашем примере попробуйте найти внутри карты ключ, который не существует как:

package main

import "fmt"

func main() {

    // We can store multiple items in a map as well

    superhero := map[string]map[string]string{
        "Superman": map[string]string{
            "realname": "Clark Kent",
            "city":     "Metropolis",
        },

        "Batman": map[string]string{
            "realname": "Bruce Wayne",
            "city":     "Gotham City",
        },
    }

    // We can output data where the key matches Superman

    if temp, hero := superhero["Superman"]; hero {
        fmt.Println(temp["realname"], temp["city"])
    }

    // try to search for a key which doesnot exist

    if value, ok := superhero["Hulk"]; ok {
        fmt.Println(value)
    } else {
        fmt.Println("key not found")
    }

}

Пример игровой площадки

0 голосов
/ 08 октября 2018
if temp, hero := superhero["Superman"]; hero

на ходу похоже на запись:

temp, hero := superhero["Superman"]
if hero {
    ....
}

Здесь «Супермен» сопоставлен со значением, герой будет true

else false

При каждом запросе к карте будет возвращаться необязательный второй аргумент, который сообщит, присутствует определенный ключ или нет

https://play.golang.org/p/Hl7MajLJV3T

0 голосов
/ 08 октября 2018

Более нормально использовать ok для логического имени переменной.Это эквивалентно:

temp, ok := superhero["Superman"]
if ok {
    fmt.Println(temp["realname"], temp["city"])
}

ОК - это правда, если на карте был ключ.Таким образом, в язык встроены две формы доступа к карте и две формы этого утверждения.Лично я думаю, что эта немного более многословная форма с еще одной строкой кода намного понятнее, но вы можете использовать и другую. Так что другая форма будет:

if temp, ok := superhero["Superman"]; ok {
    fmt.Println(temp["realname"], temp["city"])
}

Как указано выше.Подробнее см. эффективное движение здесь:

По понятным причинам это называется идиомой «запятая нормально».В этом примере, если ключ присутствует, значение будет установлено соответствующим образом, и ok будет true;если нет, значение будет установлено равным нулю, и ok будет ложным.

Две формы для доступа к картам:

// value and ok set if key is present, else ok is false
value, ok := map[key]

// value set if key is present
value := map[key]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...