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

时间:2016-06-09 14:51:21

标签: 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))
}

我可以通过在速度函数中以某种方式转换为float64来使其更优化吗?

2 个答案:

答案 0 :(得分:2)

不,您无法避免将距离和时间投射到浮点数,因为没有为这些类型定义除法。如前所述,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

    // ...
}

这可以完美地编译和工作。场景背后发生的是文字123.0被视为无类型浮点数,300被视为无类型int。

我知道这听起来很奇怪,但基本上这些值都没有打字,所以Go试图让它们适合左边的类型。这就是为什么你可以编写var f float64 = 1,即使1不是浮点数。但是你不能写var f float64 = int(1)因为1成为一个无法在float64中翻译的类型int。

这就是为什么下面的工作没有成功的原因:

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

    var s Distance = distance
    var t Time = time

    // ...
}

答案 1 :(得分:0)

您无法在自定义类型之间进行隐式转换 - 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))
}