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
}

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)
}
- 3 回答
- 0 關注
- 112 瀏覽
添加回答
舉報