【问题标题】:Confused with Type conversions in golang对 golang 中的类型转换感到困惑
【发布时间】:2017-07-06 04:36:43
【问题描述】:

我最近尝试学习 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背景,但不知怎么看不懂上面的代码。

【问题讨论】:

标签: go


【解决方案1】:

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)

当需要float64 时,您传递的是int

在这种情况下:

var f = math.Sqrt(9 + 16)

编译器能够推断类型,并为您传递float64

【讨论】:

  • 那么当传递一个具有数字值的变量时,编译器不会自动转换它?但是当我们直接传递一个数字时,它会自动转换吗?
  • @muhajir,基本上是的,当你传入一个变量时,xy 被显式声明为 int,这不是 float64,所以编译器会拒绝.当您直接传入一个数字时,编译器会检查函数签名并查看输入是否对 float64 有效,并且它是有效的,就像这样是有效的:var x float64 = 4
【解决方案2】:

但是当我们直接传递一个数字时,它会自动转换?

不,不是*)。您的“直接数字”在 Go 中被称为“常量”,而常量通常是“无类型的”并且(几乎)具有任意精度。常量有特殊规则:常量5a := 5 定义的整数a 行为不同,因为5 是具有特殊规则的常量,而不是int

9 + 16 这样的常量表达式在编译 时间 被评估,就像你输入了25 一样。这个25 仍然是一个(常量。

虽然 Go 没有类型的自动类型转换,但它确实 从常量到多种类型的自动转换。常量25可以自动转换为float64或int、uint8甚至complex128。

请阅读博文https://blog.golang.org/constants 和官方语言规范以获得完整解释和所有详细信息:https://golang.org/ref/spec#Constants。这解释了奇怪的概念 “无类型整数”比我做得更好。

*) “不是真的”,因为这样想是没有帮助的。常量的区别在 Go 中是特殊的:大多数其他语言将 3+5 视为两个 int 的总和,从而产生一个 int,而 Go 看到两个无类型整数常量并将这个表达式计算为一个新的任意精度、无类型常量。仅在稍后将常量转换为实际整数。

【讨论】:

    猜你喜欢
    • 2011-02-02
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2018-08-30
    • 1970-01-01
    相关资源
    最近更新 更多