Как работает автоматический тип с постоянным значением в golang? - PullRequest
2 голосов
/ 11 апреля 2020

Вот фрагмент кода:

a := 40
f := float64(a/100.0)
fmt.Println("Hello, playground", f)

f=0, почему?

Ответы [ 2 ]

2 голосов
/ 11 апреля 2020

Здесь тип по умолчанию для a равен int, поскольку вы используете a:=40, но 100.0 - это просто константа, поэтому нет автоматического определения типа для переменной. Таким образом, a/100.0 рассматривается как целочисленное деление, и результат равен 0, что означает f := float64(0) выполнено

Анализ случая

Если вы установите 100.0 в переменной .

a := 40
b := 100.0
f := float64(a/b)

Тогда b относится к типу float64. Таким образом, вы получаете ошибку типа

invalid operation: a / b (mismatched types int and float64)

Поскольку вы пытаетесь выполнить операцию деления на два разных типа

И если тип cast a на float64(), тогда он работает

a := 40
b := 100.0
f := float64(a)/b

Итак, здесь обе переменные имеют тип float64 в операции деления.

Теперь, когда мы приводим a в float64, то в операции деления мы можем напрямую использовать 100.0 без переменной.

a := 40
f := float64(a)/100.0
2 голосов
/ 11 апреля 2020

Spe c: Константы:

Нетипизированная константа имеет тип по умолчанию , который является типом, в который константа неявно преобразуется в контексты, где требуется типизированное значение, например, в кратком объявлении переменной , таком как i := 0, где нет явного типа. Тип по умолчанию для нетипизированной константы - bool, rune, int, float64, complex128 или string соответственно, в зависимости от того, является ли она логической, рунической, целой, с плавающей точкой, сложной или строковая константа.

a := 40 - краткое объявление переменной, нетипизированная целочисленная константа 40 имеет тип по умолчанию int, поэтому a будет иметь тип int.

В a/100.0, поскольку a имеет тип int, а 100.0 представлен целым числом, он будет принимать тип int, а a/100.0 будет целочисленным делением, в результате 0.

Это значение 0 int будет затем преобразовано в float64.

Обратите внимание, что если вы измените первую строку на:

a := 40.0

Тогда вывод будет 0.4, потому что 40.0 является нетипизированным литералом с плавающей запятой и поэтому имеет тип по умолчанию float64. Таким образом, a будет иметь тип float64, а a/100.0 будет делением с плавающей запятой, что приведет к 0.4. Попробуйте на Go Playground .

Вы получите тот же результат, если будете использовать типизированную константу, потому что здесь не используется тип по умолчанию, float64(40) является типизированной константой, очевидно, типа float64 (попробуйте на Go Playground ):

a := float64(40)

См. Блог Go: Константы .

...