亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我可以使類型重新定義更優化嗎?

我可以使類型重新定義更優化嗎?

Go
慕沐林林 2022-01-17 17:05:15
我有這樣的代碼:type Speed float64type Distance float64type Time float64func 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 來使其更優化嗎?
查看完整描述

2 回答

?
寶慕林4294392

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


    // ...

}


查看完整回答
反對 回復 2022-01-17
?
吃雞游戲

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))

}


查看完整回答
反對 回復 2022-01-17
  • 2 回答
  • 0 關注
  • 162 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號