我正在尝试编写一个函数,它可能会采用任何类型的结构。。。假设它是这样的:
func setDate(s timestamp, data interface{}){
data.Date = timestamp
}
我意识到,在现实生活中,我不需要一个函数来设置这个值,我正在努力了解更多关于接口如何工作的信息,等等。
您可以用这种方式来处理它,但在setDate()
中,您需要使用反射来设置Date
字段。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)