卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章35233本站已运行394

有没有一种方法可以确保传递的值具有使用泛型的某些字段?

有没有一种方法可以确保传递的值具有使用泛型的某些字段?

有没有一种方法可以确保传递的值具有使用泛型的某些字段?这是许多开发者在使用泛型时常常遇到的问题。在PHP中,我们可以通过类型约束和接口实现来实现这一功能。首先,我们可以使用类型约束来确保传递的值是某个类的实例。然后,我们可以使用接口来定义某些字段的规范,确保传递的值具有这些字段。这样,我们就可以在代码中使用泛型,并确保传递的值满足特定的字段要求。通过这种方式,我们可以更好地利用泛型的优势,并确保代码的可靠性和安全性。

问题内容

我试图在 go 中定义一个通用函数,它接受具有某些字段的值,例如 id int。我尝试了几种方法,但似乎都不起作用。这是我尝试过的示例。

package main

import (
    "fmt"
)

func Print[T IDer](s T) {
    fmt.Print(s.ID)
}

func main() {
    Print(Person{3, "Test"})
}

type IDer interface {
    ~struct{ ID int }
}

type Person struct {
    ID   int
    Name string
}

type Store struct {
    ID     int
    Domain string
}

这是游乐场链接:https://gotipplay.golang.org/p/2i4rsucwagf

在上面的示例中,我想保证传递给 print 函数的每个值都有一个属性 id int,该属性也可以在函数中访问。有什么方法可以在 go 中实现此目的,而无需在接口中定义方法(例如 getid() int)?

解决方法

有什么方法可以在 go 中实现此目的,而无需在接口中定义方法(例如 getid() int)?

不,您必须在接口中定义方法。

go 1.18 中的泛型实现不支持结构类型,尽管原始类型参数提案建议支持。要访问联合中的公共字段,另请参阅 这个解释。

尽管如此,我认为值得指出一个很容易从您的示例中产生的误解:近似值 ~t (波形符类型)的含义意味着“基础类型为 t 的类型集。

现在,当你写:

~struct{ id int }

这意味着其基础类型完全struct{ id int }。无论如何,这不包括具有字段 id int 其他内容的结构。例如。 type foo struct { id int; 的底层类型;名称字符串 }struct { id int;命名字符串 },而不是 struct{ id int },这样无论如何都无法满足约束。

当前时间参数实现没有指定部分结构类型的语法。我记得提案在接口约束中添加字段术语(以及类型术语和方法) ),上线了:

type IDer interface {
    ID int
}

这将在不破坏波形符 ~ 的含义的情况下实现您想要执行的操作。但这不会包含在 go 1.18 中。

卓越飞翔博客
上一篇: 用新的映射对象替换映射变量线程安全吗?
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏