Go 我可以使类型重新定义更优化吗?

Go 我可以使类型重新定义更优化吗?,go,Go,我有这样的代码: type Speed float64 type Distance float64 type Time float64 func speed(a Distance, b Time) Speed { return Speed(float64(a) / float64(b)) } func main() { s := Distance(123.0) t := Time(300) fmt.Println(speed(s, t)) } 我可以通过在

我有这样的代码:

type Speed float64
type Distance float64
type Time float64


func speed(a Distance, b Time) Speed {
    return Speed(float64(a) / float64(b))
}

func main() {
    s := Distance(123.0)
    t := Time(300)
    fmt.Println(speed(s, t))
}

我可以通过在speed函数中删除对float64的强制转换来使它更优化吗?

您不能在自定义类型之间进行隐式强制转换——Go是强类型的

我知道这只是一个小例子,但也许你真的不需要这些自定义类型

package main

import "fmt"

func speed(distance float64, time float64) float64 {
    return distance / time
}

func main() {
    s := 123.0
    t := 300.0
    fmt.Println(speed(s, t))
}

不,您无法避免将距离和时间转换回浮动,因为没有为这些类型定义分割。正如前面所说,Go是强类型的

所以,在你的情况下,你必须把演员到处(不是一个好主意)。如果您想为您的类型编写自定义方法,那么类型别名是很好的,但它的目的不是仅将基础类型隐藏在自定义类型下

然而,并不是所有的类型都是这样工作的。如果创建贴图的别名,则可以毫无问题地调用括号操作符

type Map map[string]string

func main() {
    m := Map(make(map[string]string))
    m["answer"] = "42"
    fmt.Printf("m's type is %T and answer is %s\n", m, m["answer"]) 
    //
    // m's type is main.Map and answer is 42
}
此外,初始化自定义别名时,不需要强制转换:

type Speed float64
type Distance float64

func main() {
    var s Distance = 123.0
    var t Time = 300

    // ...
}
这是完美的编译和工作。幕后发生的事情是,literal
123.0
被视为非类型化浮点,
300
被视为非类型化int

我知道这听起来很奇怪,但基本上这些值并没有被键入,所以Go尝试将它们放入左边的类型中。这就是为什么您可以编写
var f float64=1
,即使
1
不是浮点。但是您不能编写
var f float64=int(1)
,因为1变成了一个类型化的int,不能在
float64
中翻译

这就是为什么以下方法不起作用:

func main() {
    var distance float64 = 123.0
    var time float64 = 300

    var s Distance = distance
    var t Time = time

    // ...
}

不,但对于这样的事情,如果你没有定义任何方法,我不认为有充分的理由不使用float64。原因(对我来说)很简单:我想确保我们在正确的类型上操作,编译器将使我免于编写大量规范。这是最佳的。如果你想使用类型系统,您需要明确说明转换。请注意,这仍然不能避免您调用
speed(123300)
,其中转换是在赋值时完成的,并且类型大部分是隐藏的。准确地说,Go中没有“casting”,赋值时的转换仍然是类型转换,即
var s Distance=123.0
相当于
s:=Distance(123.0)