登录
首页 >  Golang >  Go问答

限制泛型类型中 setter 方法的用法

来源:stackoverflow

时间:2024-03-26 12:12:39 485浏览 收藏

在 Go 泛型中,作者遇到了使用类型约束限制泛型类型中 setter 方法的用法问题。作者希望对所有 MongoDB 集合实现 CRUD 操作,但在尝试直接更新结构上的字段时遇到错误。具体来说,当使用指针接收器时,编译器会抱怨该类型未实现接口,而当不使用指针接收器时,会遇到无效赋值错误。

问题内容

我正在使用 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


正确答案


你设置了一个类型约束:

type tmodel interface {
    myuser | anothermodel
    ...

在您的界面中,因此您不能使用 *myuser 作为 tmodel 的类型参数

要修复编译时错误:更改类型约束

type tmodel interface {
    *myuser | *anothermodel
    ...
}

https://go.dev/play/p/1oP2LzeqXIa

额外说明:除非您别有用心地明确列出唯一可以用作 tmodel 的类型,否则我会这么说

type TModel interface {
    SetName(s string)
}

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

好了,本文到此结束,带大家了解了《限制泛型类型中 setter 方法的用法》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>