我正在玩 golang 泛型,试图对所有 mongo 集合实施 CRUD 操作,但我在尝试直接更新结构上的某些字段时遇到问题,但出现错误package mainimport ( "fmt")type TModel interface { MyUser | AnotherModel SetName(string)}type MyUser struct { ID string `bson:"_id"` Name string `bson:"name"`}type AnotherModel struct { ID string `bson:"_id"` Name string `bson:"name"`}// Using this function compiles, but never update the structfunc (s MyUser) SetName(name string) { s.Name = name}/*This should be the right way, but fails at compile time *//*func (s *MyUser) SetName(name string) { s.Name = name}*/type Crud[model TModel] interface { UpdateObj(m model) (*model, error)}type CrudOperations[model TModel] struct {}func (c *CrudOperations[model]) UpdateObj(m model) error { fmt.Printf("\n Obj: %v", m) m.SetName("NewName") fmt.Printf("\n Obj: %v", m) return nil}func main() { c := CrudOperations[MyUser]{} m := MyUser{Name: "Initial-Name"} c.UpdateObj(m)}./prog.go:44:22: MyUser 没有实现 TModel(SetName 方法有指针接收器)我尝试从更改func(s *MyUser)为func (s MyUser)但是结构没有反映更改ineffective assignment to field MyUser.Name (staticcheck)游乐场:https ://go.dev/play/p/GqKmu_JfVtC
1 回答
泛舟湖上清波郎朗
TA贡献1818条经验 获得超3个赞
你放了一个类型约束:
type TModel interface {
MyUser | AnotherModel
...
在您的界面中,因此您不能将 a*MyUser用作类型参数TModel
要修复编译时错误:更改类型约束
type TModel interface {
*MyUser | *AnotherModel
...
}
https://go.dev/play/p/1oP2LzeqXIa
一个额外的评论:除非你别有用心地明确列出唯一可以用作 a 的类型,否则TModel我会说
type TModel interface {
SetName(s string)
}
对你的泛型类型来说可能已经足够了。
- 1 回答
- 0 关注
- 117 浏览
添加回答
举报
0/150
提交
取消