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

MickeyThreeSheds:

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

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

我意识到我不需要在现实生活中设置此值的函数,而是尝试了解有关接口如何工作的更多信息,等等。

icza:

您可以采用这种方法,但是在内部,setDate()您需要使用反射来设置Date字段。Go是一种静态类型的语言,因此,如果go的(静态)类型datainterface{}(它什么也没说),您将无法对其真正有用(您不能引用其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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Typescript:可以使用enum作为函数参数类型吗?

带有接口的函数可以作为参数传递吗?

OBJ-C,我可以使用协议作为函数参数的参数类型吗?

我可以使用类型作为值(或从构造函数参数正确推断通用类类型)吗?

我可以使用DataKinds编写一个返回参数编码类型的值的函数吗?

我可以传递“类型”作为函数参数吗?

我可以使用void *作为函数的参数吗?

swift while循环可以使用函数作为参数吗?

我可以将基类类型作为通用参数传递给接口吗

函数可以作为参数传递吗?

是否可以使用函数参数的名称作为接口的属性来动态键入函数的输出?

Coq:我可以使用类型参数作为连续参数的类型吗?

为多态变体类型编写类型签名时,可以使用类型变量吗?

如果没有作为函数参数传递任何内容,请使用接口的默认实现

我可以使用指向嵌套结构的指针作为接收器参数吗?

当您不想传递任何变量时,您可以在 C 中使用可变长度参数函数吗?

我可以使用其他函数的类型信息作为Python中的返回类型吗?

我可以将类型作为参数传递给这个函数吗?

我可以使用Mypy存根作为接口吗?

您可以将函数参数结构传递给函数吗?

在Python中传递参数时,我可以使用相同的参数名称吗?

非类型模板参数中的占位符类型可以涉及作为模板参数传递的函数的重载解析吗?

可以使用成员函数调用作为默认参数吗?

如果基类作为参数调用,我可以使用派生类函数吗?

我可以使用成员函数作为EnumWindows的第一个参数吗

我可以使用std :: string * argv作为主要函数参数吗?

我可以使用变量的值作为函数的参数名称吗?

我可以使用命名参数作为变量在python中调用函数吗?

我可以使用枚举作为结构名称吗?