登录
首页 >  Golang >  Go问答

可以在函数中使用接口作为参数吗?

来源:stackoverflow

时间:2024-03-02 18:42:25 234浏览 收藏

今天golang学习网给大家带来了《可以在函数中使用接口作为参数吗?》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

问题内容

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

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)

本篇关于《可以在函数中使用接口作为参数吗?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>