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

Mic*_*eds 0 struct interface go

我正在尝试编写一个最终可能采用任何结构的函数...让我们说它是这样的:

func setDate(s timestamp, data interface{}){
    data.Date = timestamp
}
Run Code Online (Sandbox Code Playgroud)

我意识到我不需要在现实生活中设置这个值的功能,我试图更多地了解接口的工作方式等.

icz*_*cza 5

你可以这样接近它,但是在里面setDate()你需要使用反射来设置Date字段.Go是一种静态类型的语言,所以如果(静态)类型datainterface{}(对它没有任何说明),你就不能用它做任何有用的事情(你不能参考它的Date字段,因为不能保证它的价值有一个Date领域).

相反,您应该定义一个HasDate包含单个方法的接口:

type HasDate interface {
    SetDate(s time.Time)
}
Run Code Online (Sandbox Code Playgroud)

设置日期的能力.并且您的函数应该期望此接口类型的值:

func setDate(s time.Time, data HasDate) {
    data.SetDate(s)
}
Run Code Online (Sandbox Code Playgroud)

任何实现此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
}
Run Code Online (Sandbox Code Playgroud)

测试示例(在Go Playground上尝试):

mt := &MyType{}

setDate(time.Now(), mt)

fmt.Println(mt.date)
Run Code Online (Sandbox Code Playgroud)