gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:42:06 26 4
gpt4 key购买 nike

我有这样的代码:

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 的强制转换使其更优化?

最佳答案

不,您无法避免将距离和时间重新转换为 float ,因为没有为这些类型定义除法。如前所述,Go 是强类型的。

因此,在您的情况下,您必须在各处进行强制转换(这不是一个好主意)。如果您想为您的类型编写自定义方法,则类型别名很好,但其目的不仅仅是将底层类型隐藏在自定义类型下。

但是,并非所有类型都以这种方式工作。如果您为 map 创建别名,那么您可以毫无问题地调用方括号运算符。

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 被视为无类型 float ,而 300 被视为无类型整型。

我知道这听起来很奇怪,但基本上这些值没有类型化,所以 Go 尝试将它们放入左侧的类型中。这就是为什么您可以编写 var f float64 = 1,即使 1 不是 float 。但是你不能写 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

// ...
}

关于go - 我可以使类型重新定义更优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37729349/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com