我正在尝试编写一个函数,该函数最终可能采用任何类型的结构...让我们说它像这样:
func setDate(s timestamp, data interface{}){
data.Date = timestamp
}
我意识到我不需要在现实生活中设置此值的函数,而是尝试了解有关接口如何工作的更多信息,等等。
您可以采用这种方法,但是在内部,setDate()
您需要使用反射来设置Date
字段。Go是一种静态类型的语言,因此,如果go的(静态)类型data
是interface{}
(它什么也没说),您将无法对其真正有用(您不能引用其Date
字段,因为无法保证其值包含一个Date
字段)。
相反,您应该定义一个HasDate
包含单个方法的接口:
type HasDate interface {
SetDate(s time.Time)
}
设置日期的能力。并且您的函数应该期望此接口类型的值:
func setDate(s time.Time, data HasDate) {
data.SetDate(s)
}
任何实现此HasDate
接口的人都可以传递给您的setDate()
函数。请注意,在Go中,实现接口是隐式的:没有意图的声明。这意味着任何具有SetDate(time.Time)
方法的类型都将实现该HasDate
接口,甚至不知道该接口的存在。
这是实现它的示例类型(更确切地说是其指针*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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句