這可以:
type constraint interface {
~float32 | ~float64
}
type foo[T constraint] struct {
val T
}
func (f *foo[float64]) setValToPi() {
f.val = 3.14
}
但是,如果我更改constraint為還包含int型別,則會遇到錯誤:
type constraint interface {
~float32 | ~float64 | ~int
}
type foo[T constraint] struct {
val T
}
func (f *foo[float64]) setValToPi() {
f.val = 3.14 // IncompatibleAssign: cannot use 3.14 (untyped float constant) as float64 value in assignment
}
為什么包含不屬于同一“型別組”的型別的約束會導致此錯誤,我該如何處理?
uj5u.com熱心網友回復:
此語法:
func (f *foo[float64]) setValToPi() {
// ...
}
只是一個方法宣告。它不會實體化泛型型別foo。float64方括號內的識別符號是型別引數的名稱。它也可以是T,就像在型別定義中一樣。
就像你寫的:
type foo[float64 constraint] struct {
val float64
}
由于float64是預先宣告的識別符號,因此您可以使用型別引數名稱對其進行遮蔽。
因此,在該方法中setValToPi,關于 的型別的唯一已知資訊val是它被約束為constraint,例如 的并集~float32 | ~float64 | ~int。
如果將方法宣告更改為:
func (f *foo[T]) setValToPi() {
// ...
}
你會得到同樣的錯誤T:
不能在賦值中使用 3.14(無型別浮點常量)作為 T 值
而錯誤的事實,給定3.14(非型別化的浮點常量)不能總是被分配到所有可能的情況下foo[T],特別是一個地方T確實是~int。
以float64識別符號為型別引數的Playground :https : //gotipplay.golang.org/p/1EuAsSKdihK
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/384265.html
