вывод типа при комбинировании нетипизированных и типизированных конст - PullRequest
0 голосов
/ 04 мая 2019

При объявлении двух константных переменных (одной типизированной и одной нетипизированной) и распечатки типа второй, например:

const x float32 = 10000
const y = 1e8 / x

fmt.Printf("the type of y: %T \n", y)
// or with reflect:
fmt.Println(reflect.TypeOf(y))

это говорит мне, что y имеет тип float32.

Что ж, это не удивительно, поскольку нетипизированная константная переменная y определяется как деление нетипизированной константы с плавающей точкой на типизированную константу с плавающей точкой, и поэтому тип может быть выведен.
Согласно "Go by Example" (https://gobyexample.com/constants), константы никогда не имеют типа, если это не указано явно. Однако, согласно официальной документации блога Go, нетипизированные константы do имеют скрытые типы, которые выводятся, но пусть константа остается нетипизированной до тех пор, пока не потребуется тип.

Я бы предположил, что y все еще будет нетипизированной константой с плавающей точкой. Однако, когда он используется для назначения новой переменной, инспектор Голанда говорит мне, что тип может быть опущен:

const z float32 = y 
//        ^^^ type can be ommitted

Итак, наконец, мой вопрос будет:
Разве невозможно объявить нетипизированную константу из типизированных константных выражений?

1 Ответ

1 голос
/ 04 мая 2019

Мне не ясно, в чем здесь проблема. В предложении IDE, похоже, говорится, что тип z может быть выведен из типа y, поэтому вы можете опустить явное объявление. Это кажется правильным.

Объявление y все еще нетипизировано, так что же, похоже, не так? Предполагаемый тип констант зависит от его составляющих - их нельзя игнорировать, иначе вы получите несоответствие типов. Возможно, вам будет интересно прочитать как обычно осуществляется вывод типа ; Это не обязательно относится к Go, но в целом это должно быть достойное введение, чтобы помочь вам понять основной механизм здесь.


Обратите внимание, что вы также можете опустить тип x, и тип конечного результата будет float64, поэтому все это можно вывести без типов.

...