我有这样的代码:
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来使其更优化吗?
答案 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))
}