1 回答

TA貢獻1786條經驗 獲得超11個贊
實例化必須發生在類型級別,而不是方法級別,并且方法不能引入新的類型參數,請參閱如何在 Go 中創建泛型方法?(方法必須沒有類型參數)
這意味著當你想使用 時R2
,你必須為類型參數選擇類型參數,而方法不能改變這些,你會“卡住”你在實例化時選擇的類型R2
。
另請注意,由于 for 的約束IDTYPE
是comparable
,例如string
,整數123
不能在所有情況下分配給該ID
字段,因為它可能具有類型string
。
如果您想要/必須為 ID 處理多個具體類型,泛型不是正確的選擇??梢愿挠媒涌冢?/p>
type R2 struct {
ID any
IsActive bool
}
另請注意,如果您希望修改接收器(例如結構的字段),則接收器必須是指針。
ID如果您希望限制存儲在to中的值comparable,請為其使用(通用)函數。
以下是您的操作方法:
type R2 struct {
ID any
IsActive bool
}
func (r *R2) Store(ctx context.Context) error {
setID(r, 123)
return nil
}
func setID[ID comparable](r *R2, id ID) {
r.ID = id
}
測試它:
r := &R2{}
var s Storable = r
s.Store(context.TODO())
fmt.Println(r)
哪些輸出(在Go Playground上嘗試):
&{123 false}
ID這提供了靈活性(您可以使用為字段設置任何可比較的值setID()),并提供編譯時安全性:嘗試設置不可比較的值將導致編譯時錯誤,例如:
setID(r, []int{1}) // Error: []int does not implement comparable
- 1 回答
- 0 關注
- 235 瀏覽
添加回答
舉報