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
// ...
}
这是完美的编译和工作。幕后发生的事情是,literal123.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)
。