不,你不能避免把你的距離和時間轉換回浮動,因爲沒有爲這些類型定義除法。如前所述,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
// ...
}
沒有,但但這樣的事情,我不認爲有一個堅實的理由不只是使用float64如果你沒有定義任何方法。 – JimB
原因是(對我來說)很簡單:我想確保我們正在使用適當的類型,編譯器會使我無法編寫大量的規範。 –
這是_is_最佳。 – Volker