2016-06-09 29 views
2

我有這樣的代碼:我可以使類型重新定義更優化嗎?

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它更優化?

+1

沒有,但但這樣的事情,我不認爲有一個堅實的理由不只是使用float64如果你沒有定義任何方法。 – JimB

+2

原因是(對我來說)很簡單:我想確保我們正在使用適當的類型,編譯器會使我無法編寫大量的規範。 –

+0

這是_is_最佳。 – Volker

回答

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 

    // ... 
} 
+2

準確地說,Go中沒有「投射」賦值轉換仍然是類型轉換,即'var s Distance = 123.0'相當於's:= Distance(123.0)'。 – JimB

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)) 
} 
相關問題