我正在尝试编写一个函数,它最终可能采用任何类型的结构......假设它是这样的:
func setDate(s timestamp, data interface{}){
data.Date = timestamp
}
我意识到我在现实生活中不需要一个函数来设置这个值,我正在尝试了解更多关于接口(interface)如何工作等的信息。
最佳答案
您可以那样处理它,但随后在 setDate()
中您需要使用反射来设置 Date
字段。 Go 是一种静态类型语言,所以如果 data
的(静态)类型是 interface{}
(什么也没说),你真的不能做任何有用的事情用它(你不能引用它的 Date
字段,因为不能保证它的值有一个 Date
字段)。
相反,您应该定义一个包含单个方法的 HasDate
接口(interface):
type HasDate interface {
SetDate(s time.Time)
}
设置日期的能力。你的函数应该期望这个接口(interface)类型的值:
func setDate(s time.Time, data HasDate) {
data.SetDate(s)
}
任何实现此HasDate
接口(interface)的人都可以传递给您的setDate()
函数。请注意,在 Go 中实现接口(interface)是隐式的:没有意图声明。这意味着任何具有 SetDate(time.Time)
方法的类型都会实现此 HasDate
接口(interface),甚至不知道此接口(interface)的存在。
这是一个实现它的示例类型(更准确地说是它的指针 *MyType
):
type MyType struct {
date time.Time
}
func (mt *MyType) SetDate(s time.Time) {
mt.date = s
}
示例测试(在 Go Playground 上尝试):
mt := &MyType{}
setDate(time.Now(), mt)
fmt.Println(mt.date)
关于go - 在编写可能最终被传递给任何类型的结构的函数时,我可以使用接口(interface)作为参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53708429/