在golang

时间:2017-07-06 04:36:43

标签: go

我最近尝试学习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背景,而且我无法理解上面的代码。

2 个答案:

答案 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中称为“常量”,常量通常是“无类型”和(几乎)任意精度。常量有一些特殊规则:常量5a定义的整数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看到两个无类型的整数常量并将此表达式计算为新的任意精度,无类型常量。只有在以后才能将常量转换为实际整数。