Почему отдельная переменная объявлена ​​в переключателе типа Go? - PullRequest
0 голосов
/ 10 мая 2019

У меня проблемы с пониманием того, почему переключатели типов записываются с дополнительной переменной, определенной в операторе switch.Приведенный ниже код, по-видимому, является санкционированным способом выполнения действий:

func test_func(i interface{}) {
    switch v := i.(type) {
    case int:
        fmt.Printf("%T\n", v)
    case float64:
        fmt.Printf("%T\n", v)
    case int:
        fmt.Printf("I don't know about type %T!\n", v)
    }
}

func main() {
    test_func(float64(34))
    test_func(int(34))
    test_func("hello world")
}

Как и ожидалось, это возвращает:

float64
int
I don't know about type string!

Однако я могу немного изменить test_func, чтобы v не определен в операторе switch, и вместо этого мы используем i внутри наших операторов case:

func test_func(i interface{}) {
    switch i.(type) {
    case int:
        fmt.Printf("%T\n", i)
    case float64:
        fmt.Printf("%T\n", i)
    case int:
        fmt.Printf("I don't know about type %T!\n", i)
    }
}

func main() {
    test_func(float64(34))
    test_func(int(34))
    test_func("hello world")
}

И вывод не изменяется.Кажется, две формы взаимозаменяемы.Зачем мне пытаться определить v, когда я могу просто использовать i?Последний случай проще, так как есть одна переменная, которую нужно отслеживать;может быть, это даже более производительно.

1 Ответ

0 голосов
/ 10 мая 2019

Они не взаимозаменяемы;вы просто передаете i функции, которая может принимать ее независимо от ее типа (аргументы fmt.Printf после строки формата имеют тип interface{}).i по-прежнему является ее исходным типом, поскольку тип переменной не может измениться .

Если вы действительно хотите что-то сделать с ним на основе его типа, вам потребуется первая форма, так что v будет иметь тип в выражении case.Независимо от того, назначаете ли вы введенное значение переменной или нет, исходная переменная i сохраняет свой исходный тип.

Это хорошо описано в Tour of Go: переключатели типа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...