恒值自动类型在golang中是如何工作的?

恒值自动类型在golang中是如何工作的?,go,constants,Go,Constants,以下是代码片段: a := 40 f := float64(a/100.0) fmt.Println("Hello, playground", f) f=0,为什么? 非类型化常量有一个默认类型,该类型是在需要类型化值的上下文中(例如,在没有显式类型的情况下,i:=0中),该常量隐式转换为的类型。非类型化常量的默认类型分别为bool、rune、int、float64、complex128或string,具体取决于它是布尔、rune、整数、浮点、复数还是字符串常量 a:=40是一个短变量声明,非

以下是代码片段:

a := 40
f := float64(a/100.0)
fmt.Println("Hello, playground", f)
f=0
,为什么?

非类型化常量有一个默认类型,该类型是在需要类型化值的上下文中(例如,在没有显式类型的情况下,
i:=0
中),该常量隐式转换为的类型。非类型化常量的默认类型分别为
bool
rune
int
float64
complex128
string
,具体取决于它是布尔、rune、整数、浮点、复数还是字符串常量

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
。试穿一下

如果使用类型化常量,则会得到相同的结果,因为这里没有使用默认类型,
float64(40)
是一个类型化常量,类型显然是
float64
(请在上尝试):


请参阅。

此处
a
的默认类型为
int
,因为您使用
a:=40
,但是
100.0
只是一个常量,因此不会自动检测变量的类型。 所以<代码> A/100 考虑为整数除法,其结果是<代码> 0 < /代码>,这意味着<代码> f:= FLUAT64(0)< /代码>执行< /P> 案例分析

如果在变量中设置
100.0

a := 40
b := 100.0
f := float64(a/b)
a := 40
f := float64(a)/100.0
然后
b
float64
类型。所以你会得到这样的错误

invalid operation: a / b (mismatched types int and float64)
因为您正在尝试使用两种不同的类型执行除法操作

如果将
a
类型转换为
float64()
,则它会工作

a := 40
b := 100.0
f := float64(a)/b
因此,这两个变量都是divide操作中的
float64
类型

现在,当我们将
a
转换为float64时,在除法操作中,我们可以直接使用
100.0
而不使用变量

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

我懂了。由于变量“a”的类型是固定的,因此表达式编译常量100.0必须是整数。我通过将100.0更改为100.1来确认这一点,但它不会编译。我将“a”增加为float的意图从一开始就是错误的。@user1206899是的,没错。