为了账号安全,请及时绑定邮箱和手机立即绑定

在其他泛型类型中使用 setter 方法的约束

在其他泛型类型中使用 setter 方法的约束

Go
蛊毒传说 2022-12-19 21:34:32
我正在玩 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)

}

对你的泛型类型来说可能已经足够了。


查看完整回答
反对 回复 2022-12-19
  • 1 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信