Вопрос об операциях, которые смешивают числовые типы в Go

# #go #constants #typechecking

Вопрос:

Я знаю, что Go-это статически типизированный язык, который не допускает операций, в которых смешиваются числовые типы, например, вы не можете добавить int в float64 :

 package main

import (
    "fmt"
)

func main() {
        var a int = 1
        var b float64 = 1.1
        fmt.Println(a   b)
}
 

Запуск этой программы приведет к ошибке:

недопустимая операция: a b (несоответствующие типы int и float64)

Но когда я делаю математику 1 1.1 без объявления переменных, программа возвращает желаемый результат, который 2.1 :

 package main

import (
    "fmt"
)

func main() {
        fmt.Println(1   1.1)
}
 

Поэтому мой вопрос таков: почему это 1 1.1 работает? Каков числовой тип 1 и 1.1 когда я использую их непосредственно в добавлении?

Комментарии:

1. 1 1.1 оценивается как постоянное выражение. Видишь tour.golang.org/basics/15 и go.dev/блог/константы . Выполнение всего тура Go действительно стоит двух часов и намного проще, чем гадать и экспериментировать.

2. Спасибо Волкер, я действительно прохожу экскурсию по Go, в ней объясняется, что такое константа и как объявлять константу с помощью ключевого слова const, но в ней не упоминается, что что-то вроде «1 1.1» оценивается как нетипизированная константа, поэтому я обращаюсь за помощью к StackOverflow. В любом случае, еще раз спасибо за вашу помощь.

Ответ №1:

Как упоминал @Volker, это происходит потому 1 1.1 , что оценивается как нетипизированное постоянное выражение.

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

 package main

import (
    "fmt"
)

func main() {
        const a = 1
        const b = 1.1
        fmt.Println(a   b)
}