這可以: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}為什么包含不屬于同一“類型組”的類型的約束會導致此錯誤,我應該如何處理?
1 回答

慕妹3242003
TA貢獻1824條經驗 獲得超6個贊
這個語法:
func (f *foo[float64]) setValToPi() {
// ...
}
只是一個方法聲明。它不實例化泛型類型foo。float64方括號內的標識符是類型參數的名稱。T就像在類型定義中一樣,它也可以是。
就像你寫的:
type foo[float64 constraint] struct {
val float64
}
由于float64是一個預先聲明的標識符,您可以使用類型參數名稱來隱藏它。
因此,在該方法setValToPi中,關于 of 類型的唯一已知信息val是它被限制為constraint,例如 的并集~float32 | ~float64 | ~int。
如果將方法聲明更改為:
func (f *foo[T]) setValToPi() {
// ...
}
T相反,您將得到相同的錯誤:
不能在賦值中使用 3.14(無類型浮點常量)作為 T 值
并且錯誤是由于3.14(一個無類型的浮點常量)不能總是分配給所有可能的實例foo[T],特別T是確實是的實例~int。
float64以標識符為類型參數的游樂場: https ://gotipplay.golang.org/p/1EuAsSKdihK
- 1 回答
- 0 關注
- 168 瀏覽
添加回答
舉報
0/150
提交
取消