恒值自动类型在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是的,没错。