2 回答

TA貢獻2021條經驗 獲得超8個贊
不,您無法避免將距離和時間轉換回浮點數,因為沒有為這些類型定義除法。如前所述,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 變成了一個不能在 a 中翻譯的類型 int float64。
這就是為什么以下內容不起作用的原因:
func main() {
var distance float64 = 123.0
var time float64 = 300
var s Distance = distance
var t Time = time
// ...
}

TA貢獻1829條經驗 獲得超7個贊
你不能在自定義類型之間進行隱式轉換——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))
}
- 2 回答
- 0 關注
- 162 瀏覽
添加回答
舉報