例如,我定义了以下接口:

type MyTypeConstraint interface {
    ~int | ~string
}

除了使用switch reflect.TypeOf(v)语句将值与MyTypeConstraint内的每个类型进行比较之外,有没有一种方法可以判断给定值是否满足这个约束?例如,这里我不希望用户将不满足约束的类型传递给函数v:

type ErrNode struct {
    Data map[string]interface{}
    // Err  error -- irrelevant
    // next *ErrNode -- irrelevant
}

// `GetData()` is constrained but `Set()` is not.
// Of course I could pass `ErrNode` as parameter into `Set()` 
// like bellow but then I won't be able to chain `Set()` calls.
func GetData[T ErrData](list *ErrNode, k string) (v T, ok bool) {
    v, ok = list.Data[k].(T)
    return v, ok
}

func (e *ErrNode) Set(k string, v interface{}) (self *ErrNode) {
    e.Data[k] = v // v must be of type listed in `MyTypeConstraint`
    return e
}

推荐答案

您不能(至少在go1.181.19*中)对方法施加类型约束:

//syntax error: method must have no type parameters

func (e *ErrNode) Set[T MyTypeConstraint](k string, v T) (self *ErrNode) {
    e.Data[k] = v
    return e
}

您可以将类型约束放在函数上:

func Setter[T MyTypeConstraint](e *ErrNode, k string, v T) {
    e.Data[k] = v
}

(*)从go 1.18 release notes:We hope to remove this restriction in a future release.开始-从go 1.19开始仍然不允许:

Go编译器仅支持对类型为x的值调用方法m 如果由P的约束显式声明m,则参数类型为P 界面.类似地,方法值X.m和方法表达式Pm 仅当P显式声明了m时才支持,即使 M可能在P的方法集中,因为所有类型 在P中实现M.We hope to remove this restriction in a future release.

Go相关问答推荐

gorm插入不支持的数据

为什么我不能使用Docker从本地访问我的Gin应用程序?

AWS S3 SelectObjectContent在AWS SDK v2 for Go中不返回结果

如何使用gopher-lua定义一个Lua函数,该函数有一个预定义的表作为param,Lua脚本可以在其中访问该函数中的表?

如何执行asn 1 marshal/unmarshal和omit字段?

如何在gofiber/websocket/v2中设置状态代码和原因

使用goroutines在Golang中验证 struct

git ls-remote 成功而 go get 失败

由于 main.go 文件中的本地包导入导致构建 docker 容器时出错

判断一个区域内的纬度/经度点

如何将整数哈希细分为范围

如何使用 Docker 引擎 SDK 和 Golang 运行 docker 挂载卷

为什么在单独的 go routine 中需要 wg.Wait() 和 close() ?

没有堆栈跟踪的 go 程序崩溃是什么意思?

在 Go 中将指针传递给函数的正确方法是什么,以便我可以读取和/或修改指针表示的值?

函数的递归调用以 goroutine 和惯用方式开始,以在所有工作 goroutine 完成时继续调用者

泛型:对具有返回自身的函数的类型的约束

map和struct golang的合并

如何解决在mac m1中运行gcc失败退出状态1?

Beego - 我需要context.Context而不是 Beego 上下文