Go语言中字面量1+1.1可正常执行的原因及二者的数值类型是什么?
Go混合类型常量运算合法的原因
这个差异是Go语言的**无类型常量(untyped constant)**机制导致的,和静态类型检查规则并不冲突:
- 你之前声明的
var a int = 1、var b float64 = 1.1都是已经绑定了明确类型的变量,Go的静态类型规则禁止不同类型的变量直接运算,所以抛出类型不匹配的报错符合预期。 - 直接书写的
1、1.1属于未绑定具体类型的无类型常量,不会提前固定类型,只会在需要确定类型的上下文里自动推导适配的类型。
1 + 1.1运算时的类型推导逻辑
当无类型常量参与运算时,Go会自动向精度更高的类型做隐式转换:
- 无类型整数常量
1的默认候选类型是int,无类型浮点数常量1.1的默认候选类型是float64 - 做加法运算时,Go会自动把精度更低的无类型整数常量
1隐式转换为float64类型,保证两个操作数类型一致,所以运算合法 - 最终
1 + 1.1的运算结果也是无类型浮点数常量,传入fmt.Println时会按默认候选类型float64处理,输出2.1
你可以通过下面的代码验证最终推导的类型:
package main import ( "fmt" "reflect" ) func main() { res := 1 + 1.1 fmt.Printf("运算结果:%v,结果类型:%s", res, reflect.TypeOf(res)) }
运行后可以看到输出的结果类型为float64,和推导逻辑一致。
内容的提问来源于stack exchange,提问作者Parry Wang
相关产品推荐
相关产品推荐

