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

我正在玩 golang 泛型,试图对所有 mongo 集合实施 CRUD 操作,但我在尝试直接更新结构上的某些字段时遇到问题,但出现错误


package main


import (

    "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 struct

func (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


蛊毒传说
浏览 118回答 1
1回答

泛舟湖上清波郎朗

你放了一个类型约束: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)}对你的泛型类型来说可能已经足够了。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go