我最近尝试学习golang。但是我对来自https://tour.golang.org/basics/13的代码感到困惑。
package main
import (
"fmt"
"math"
)
func main() {
var x, y int = 3, 4
var f float64 = math.Sqrt(float64(x*x + y*y))
var z uint = uint(f)
fmt.Println(x, y, z)
}
那个效果很好。然后我试了
var f = math.Sqrt(9 + 16)
也有效。但当我将其更改为var f = math.Sqrt(x*x + y*y)
时,为什么它不起作用?它说cannot use x * x + y * y (type int) as type float64 in argument to math.Sqrt
我有javascript背景,而且我无法理解上面的代码。
答案 0 :(得分:4)
math.Sqrt函数签名:
func Sqrt(x float64) float64
要求您传递float64
在这种情况下:
var f float64 = math.Sqrt(float64(x*x + y*y))
您正在直接转换为float64
在这种情况下:
var f = math.Sqrt(x*x + y*y)
当您需要int
时,您正在传递float64
。
在这种情况下:
var f = math.Sqrt(9 + 16)
编译器能够推断出类型,并为您传递float64
。
答案 1 :(得分:3)
但是当我们直接传递一个数字时,会自动转换?
不,不是真的*)。你的“直接数字”在Go中称为“常量”,常量通常是“无类型”和(几乎)任意精度。常量有一些特殊规则:常量5
和a
定义的整数a := 5
表现不同,因为5
是一个具有特殊规则而不是{{1}的常量}。
在 compile time 时评估像int
这样的常量表达式,就像键入了9 + 16
一样。这个25
仍然是(常量。
虽然Go没有类型的自动类型转换,但 从常量到多种类型的自动转换。常量25
可以自动转换为float64或int,uint8甚至complex128。
请阅读博客文章https://blog.golang.org/constants和官方语言规范,以获取完整说明和所有详细信息:https://golang.org/ref/spec#Constants。这解释了奇怪的概念 “无类型整数”比我更好。
*)“不是真的”,因为以这种方式思考是没有帮助的。常量的区别在Go中是特殊的:大多数其他语言将3 + 5作为两个整数的总和导致int,而Go看到两个无类型的整数常量并将此表达式计算为新的任意精度,无类型常量。只有在以后才能将常量转换为实际整数。