1 回答

TA貢獻1786條經(jīng)驗 獲得超11個贊
實例化必須發(fā)生在類型級別,而不是方法級別,并且方法不能引入新的類型參數(shù),請參閱如何在 Go 中創(chuàng)建泛型方法?(方法必須沒有類型參數(shù))
這意味著當你想使用 時R2
,你必須為類型參數(shù)選擇類型參數(shù),而方法不能改變這些,你會“卡住”你在實例化時選擇的類型R2
。
另請注意,由于 for 的約束IDTYPE
是comparable
,例如string
,整數(shù)123
不能在所有情況下分配給該ID
字段,因為它可能具有類型string
。
如果您想要/必須為 ID 處理多個具體類型,泛型不是正確的選擇。可以改用接口:
type R2 struct {
ID any
IsActive bool
}
另請注意,如果您希望修改接收器(例如結(jié)構的字段),則接收器必須是指針。
ID如果您希望限制存儲在to中的值comparable,請為其使用(通用)函數(shù)。
以下是您的操作方法:
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 關注
- 230 瀏覽
添加回答
舉報