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

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

我可以為通用函數創建別名嗎?我收到錯誤“無法在沒有實例化的情況下使用通用函數”

我可以為通用函數創建別名嗎?我收到錯誤“無法在沒有實例化的情況下使用通用函數”

Go
慕雪6442864 2022-11-23 16:00:05
我可以定義一個通用函數:package hellofunc IsZero[T int64|float64](value T) bool {   return value == 0}然后,如果我嘗試在另一個包中為該函數起別名,它將失?。簆ackage worldimport "hello"var IsZero = hello.IsZero以上不編譯:沒有實例化就不能使用通用函數 hello.IsZero相反,這有效:var IsZero = hello.IsZero[int64]是否可以使用其他語法來做到這一點?
查看完整描述

3 回答

?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

那不是別名。實際上,您已經有了答案。但是如果你想要一個正式的參考,從語言規范,Instantiations:


未調用的泛型函數需要類型參數列表進行實例化


因此,當您嘗試初始化函數類型的變量時,hello.IsZero不會調用該函數,因此需要使用特定類型參數進行實例化:


// not called, instantiated with int64

var IsZero = hello.IsZero[int64]

此時變量(為了清楚起見,我們給它起一個不同的名字)zeroFunc有一個具體的函數類型:


    var zeroFunc = IsZero[int64]

    fmt.Printf("type: %T\n", zeroFunc) 

印刷:


type: func(int64) bool

這可能是也可能不是您想要的,因為這有效地單態化了函數。


如果您只想擁有一個具有相同實現(或其調整版本)的本地符號,則可以聲明一個“包裝器”函數。請記住,您的包裝器的類型參數只能與包裝器的類型參數一樣嚴格或更嚴格


例如給定


IsZero[T int64 | float64](v T)

你的包裝紙不能


WrapIsZeroPermissive[T int64 | float64 | complex128](v T) bool {

    return IsZero(v) // does not compile, T's type set is a superset

}

但可以_


WrapIsZeroStricter[T int64](v T) bool {

    return IsZero(v) // ok, T's type set is a subset

}


查看完整回答
反對 回復 2022-11-23
?
慕田峪9158850

TA貢獻1794條經驗 獲得超7個贊

如果功能很小,就像在問題中一樣,那么將它賣掉可能會更容易:


package vendor


func thisIsJustCopy[T int64|float64](value T) bool {

   return value == 0

}

但如果功能很大,你可以這樣做:


package world

import "hello"


func IsZero[T int64|float64](value T) bool {

   return hello.IsZero(value)

}


查看完整回答
反對 回復 2022-11-23
?
慕哥6287543

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

我嘗試在另一個包中為該函數起別名

別名僅適用于類型。您的代碼只是試圖聲明一個變量。

是否可以使用其他語法來做到這一點?

不。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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