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

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

你如何編寫一個允許指向多個原始類型的指針的通用 Go 函數?

你如何編寫一個允許指向多個原始類型的指針的通用 Go 函數?

Go
斯蒂芬大帝 2022-11-23 20:13:03
我正在嘗試使用 Go 泛型來編寫一個函數來減少我們代碼中的一些樣板 if/else 塊。我想出了一些適用于單個類型參數的東西,如下所示:func valueOrNil[T *int](value T) any {    if value == nil {        return nil    }    return *value}雖然這很好用,但它并不是很有用,因為它只允許*int, 并且我希望這段代碼適用于任何原始類型。我試圖擴展它以支持第二種類型,如下所示:func valueOrNil[T *int | *uint](value T) any {    if value == nil {        return nil    }    return *value}但是,此變體因編譯器錯誤而失敗:invalid operation: pointers of value (variable of type T constrained by *int|*uint) must have identical base types誰能發現我在這里做錯了什么,或者只是“不支持”這樣的事情?
查看完整描述

2 回答

?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

問題似乎是您試圖通過指向類型的指針而不是類型本身來實現通用。如果我們將指針移動到參數本身而不是類型參數上,它就可以工作。


解釋如下,但這是工作代碼:


func valueOrNil[T ~int | ~uint](value *T) T {

    if value == nil {

        var zero T

        return zero

    }

    return *value

}

所以而不是這個(這是行不通的):


func valueOrNil[T *int | *uint](value T) any

你可以這樣做:


func valueOrNil[T int | uint](value *T) any

但是,您可能希望更進一步并處理基礎類型:


func valueOrNil[T ~int | ~uint](value *T) any

這將允許自定義類型與函數一起使用:


type Thing int


var thing Thing

println(valueOrNil(thing))

您可能要考慮的另一個方面是對返回類型也進行泛化。您可以使用相同的T參數來執行此操作。


例如:


func valueOrNil([T ~int | ~uint](value *T) T

但這意味著您需要更改部分實現。而不是這個:


if value == nil {

    return nil

}

你可以這樣做:


if value == nil {

    var zero T

    return zero

}


查看完整回答
反對 回復 2022-11-23
?
www說

TA貢獻1775條經驗 獲得超8個贊

我從Miquella那里接受的答案(感謝您的見解;我也了解了 的用法)讓我意識到,一旦我將 the移到參數類型上,我實際上并不需要指定特定類型,所以這就是我結束了~*

func valueOrNil[T any](value *T) any {

    if value == nil {

        return nil

    }

    return *value

}




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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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