Неявная константа преобразования типа против переменных - PullRequest
0 голосов
/ 23 октября 2018

Я столкнулся с ситуацией, когда у меня есть некоторое целочисленное значение в константе и умножение его на math.Pi константа, как показано ниже:

func main() {
    const a = 5
    fmt.Printf("%v", a*math.Pi)
}

Вкл.выполнение дает следующий результат:

15.707963267948966

Но, когда я изменяю постоянную на переменную (variable a) , как показано ниже:

func main() {
    a := 5
    fmt.Printf("%v", a*math.Pi)
}

При компиляциивыдает следующую ошибку:

constant 3.14159 truncated to integer

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

Но почему это происходит?

1 Ответ

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

Это происходит из-за нетипизированных констант Го .В обоих случаях вы явно не указываете тип.

В первом случае вы определяете нетипизированную константу (вы также можете определить типизированную константу, используя const a float64 = 5).Для нетипизированной константы, тип будет выведен только тогда, когда он используется в контексте, который требует тип - то есть, когда вы умножаете его на math.Pi, компилятор «догадывается», что вы хотите, чтобы там был float, и всеработает нормально.

Во втором случае переменная, конечно, должна иметь тип, поэтому вывод типа происходит при объявлении переменной, и, поскольку вы использовали "5", компилятор "выведет" intи умножение int и float невозможно в Go.Вы можете использовать, например, a:=5.0 или var a float64 = 5, чтобы объявить как float64, тогда этот код также будет работать.

См. этот пост для получения дополнительной информации.

...