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

标签 go struct interface

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

func setDate(s timestamp, data interface{}){
    data.Date = timestamp
}

我意识到我在现实生活中不需要一个函数来设置这个值,我正在尝试了解更多关于接口(interface)如何工作等的信息。

最佳答案

您可以那样处理它,但随后在 setDate() 中您需要使用反射来设置 Date 字段。 Go 是一种静态类型语言,所以如果 data 的(静态)类型是 interface{}(什么也没说),你真的不能做任何有用的事情用它(你不能引用它的 Date 字段,因为不能保证它的值有一个 Date 字段)。

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

type HasDate interface {
    SetDate(s time.Time)
}

设置日期的能力。你的函数应该期望这个接口(interface)类型的值:

func setDate(s time.Time, data HasDate) {
    data.SetDate(s)
}

任何实现此HasDate 接口(interface)的人都可以传递给您的setDate() 函数。请注意,在 Go 中实现接口(interface)是隐式的:没有意图声明。这意味着任何具有 SetDate(time.Time) 方法的类型都会实现此 HasDate 接口(interface),甚至不知道此接口(interface)的存在。

这是一个实现它的示例类型(更准确地说是它的指针 *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)

关于go - 在编写可能最终被传递给任何类型的结构的函数时,我可以使用接口(interface)作为参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53708429/

相关文章:

linux - 使用golang调用systemd-coredump程序失败

go - 如何将多个数据传递给 Go 模板?

go - 我可以在 Go 中创建不同对象的关联数组吗?

并发模式帮助 - 扇入并返回结果?

c# - 我可以忽略 C# 接口(interface)中的泛型类型吗?

inheritance - 如何检测对象中分配给 Dart 基类变量的接口(interface)?

c - 需要帮助重置 C 中的静态全局变量

将 char 数组转换为 struct * 类型

c - Realloc 结构数组作为函数参数产生段错误?

ios - iPhone 应用编程 : best element from the interface builder to display calculated values