作者:手机用户2502907993 | 来源:互联网 | 2022-11-25 18:16
我正在尝试编写一个最终可能采用任何结构的函数...让我们说它是这样的:
func setDate(s timestamp, data interface{}){
data.Date = timestamp
}
我意识到我不需要在现实生活中设置这个值的功能,我试图更多地了解接口的工作方式等.
1> icza..:
你可以这样接近它,但是在里面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中,实现接口是隐式的:没有intent的声明.这意味着任何具有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)