在编写可能最终被传递任何类型的结构的函数时,我可以使用接口作为参数吗



我正在尝试编写一个函数,它可能会采用任何类型的结构。。。假设它是这样的:

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)

相关内容

最新更新