有没有一种方法可以确保传递的值具有使用泛型的某些字段?这是许多开发者在使用泛型时常常遇到的问题。在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 的类型集。 p>
现在,当你写:
~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 中。
以上就是有没有一种方法可以确保传递的值具有使用泛型的某些字段?的详细内容,更多请关注编程网其它相关文章!