我试图在 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
}
Run Code Online (Sandbox Code Playgroud)
这是游乐场链接:https ://gotipplay.golang.org/p/2I4RsUCwagF
在上面的示例中,我想保证传递给Print
函数的每个值都有一个属性ID int
,该属性也可以在函数中访问。有什么方法可以在 Go 中实现此目的,而无需在接口中定义方法(例如GetID() int
)?
有什么方法可以在 Go 中实现这一点,而无需在接口中定义方法(例如,GetID() int)?
不,您必须在接口中定义方法。
Go 1.18 中的泛型实现不支持结构类型,尽管原始类型参数提案建议支持。要访问联合中的公共字段,另请参阅此说明。
尽管如此,我认为值得指出一个很容易从您的示例中产生的误解:近似值~T
(波形符类型)的含义意味着“基础类型为 T 的类型集。
现在,当你写:
~struct{ ID int }
Run Code Online (Sandbox Code Playgroud)
这意味着其基础类型正是 struct{ ID int }
. 无论如何,这不包括具有字段ID int
和其他内容的结构。例如, 的基础类型type Foo struct { ID int; Name string }
是struct { ID int; Name string }
,而不是struct{ ID int }
,因此无论如何都不会满足约束。
当前时间参数实现没有指定部分结构类型的语法。我记得有人建议在接口约束中添加字段术语(以及类型术语和方法),如下:
type IDer interface {
ID int
}
Run Code Online (Sandbox Code Playgroud)
这将使您能够在不破坏波形符含义的情况下完成您想要做的事情~
。但这不会包含在 Go 1.18 中。
归档时间: |
|
查看次数: |
2220 次 |
最近记录: |