有没有一种方法可以确保传递的值具有使用泛型的某些字段?这是许多开发者在使用泛型时常常遇到的问题。在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
函数的每个值都有一个属性 print
函数的每个值都有一个属性 id int
,该属性也可以在函数中访问。有什么方法可以在 go 中实现此目的,而无需在接口中定义方法(例如 getid() int
,该属性也可以在函数中访问。有什么方法可以在 go 中实现此目的,而无需在接口中定义方法(例如 getid() int
)?
有什么方法可以在 go 中实现此目的,而无需在接口中定义方法(例如 getid() int)?
不,您必须在接口中定义方法。
go 1.18 中的泛型实现不支持结构类型,尽管原始类型参数提案建议支持。要访问联合中的公共字段,另请参阅 这个解释。
尽管如此,我认为值得指出一个很容易从您的示例中产生的误解:近似值 ~t
(波形符类型)的含义意味着“基础类型为 t 的类型集。 p>
现在,当你写:
~struct{ id int }
这意味着其基础类型完全为 struct{ id int }
。无论如何,这不包括具有字段 struct{ id int }
。无论如何,这不包括具有字段 id int
和其他内容的结构。例如。 type foo struct { id int; 的底层类型;名称字符串 }
是 struct { id int;命名字符串 }
,而不是 struct{ id int }
和其他内容的结构。例如。 type foo struct { id int; 的底层类型;名称字符串 }
是 struct { id int;命名字符串 }
,而不是 struct{ id int }
,这样无论如何都无法满足约束。
当前时间参数实现没有指定部分结构类型的语法。我记得提案在接口约束中添加字段术语(以及类型术语和方法) ),上线了:
type IDer interface { ID int }
这将在不破坏波形符 ~
的含义的情况下实现您想要执行的操作。但这不会包含在 go 1.18 中。
以上是有没有一种方法可以确保传递的值具有使用泛型的某些字段?的详细内容。更多信息请关注PHP中文网其他相关文章!