Go 为什么必须将整数转换为float64才能进行类型匹配?

Go 为什么必须将整数转换为float64才能进行类型匹配?,go,Go,我一直在玩围棋,在运行以下代码时遇到了围棋的(非?)功能: a := 1 //int b := 1.0 //float64 c := a/b //should be float64 当我运行此命令时,出现以下运行时错误: invalid operation: a / b (mismatched types int and float64) 我认为GoLang应该很擅长类型推断。为什么我有必要写: c := float64(a)/b //float64 通常,给定两

我一直在玩围棋,在运行以下代码时遇到了围棋的(非?)功能:

a := 1     //int
b := 1.0   //float64

c := a/b   //should be float64
当我运行此命令时,出现以下运行时错误:

invalid operation: a / b (mismatched types int and float64) 
我认为GoLang应该很擅长类型推断。为什么我有必要写:

c := float64(a)/b    //float64

通常,给定两种数字类型,c应该被推断为包含这两种类型的最小类型。我不认为这是一个疏忽,所以我只是想弄清楚为什么会做出这样的决定。仅出于可读性原因?或者我建议的行为会导致语言或其他方面的逻辑不一致吗?

常见问题解答中提到了这一点:

在C语言中,数字类型之间自动转换的便利性被它引起的混乱所抵消。表达式何时未签名?价值有多大?溢出来了吗?结果是否可移植,独立于执行它的机器?
它还使编译器复杂化

这就是为什么您需要:

  • 要执行显式,请执行以下操作:

    c := float64(a)/b
    
  • 或者使用
    var float64

    var a, b float64
    a = 1     //float64
    b = 1.0   //float64
    c := a/b 
    

谢谢!我不认为自动转换数字类型会打破严格静态类型的语言,如C.所示,我没有考虑与未签名VS签名和溢出问题有关的并发症。@布雷登是的,您可以看到该语言的创作者之一(Rob Pike)必须这样说:“在设计Go时,我们决定避免这个雷区,规定数字类型不能混合。如果你想添加i和u,你必须明确你想要的结果是什么。”另请参见。在你的具体示例中,使
a
成为一个非类型常量(即
const i=1
)可以避免显式转换的需要。@DaveC是的,我昨晚读到了。这是一个很好的阅读,为我澄清了一些细节。