代码之家  ›  专栏  ›  技术社区  ›  MickeyThreeSheds

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

  •  0
  • MickeyThreeSheds  · 技术社区  · 7 年前

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

    我意识到在现实生活中我不需要函数来设置这个值,我正在努力学习更多关于接口如何工作的知识,等等。

    1 回复  |  直到 7 年前
        1
  •  5
  •   icza    7 年前

    你可以这样接近它,但在里面 setDate() 您需要使用反射来设置 Date 领域Go是一种静态类型的语言,因此如果 data 是 interface{} (这并没有说明什么),你不能用它做任何有用的事情(你不能参考它的 日期 字段,因为不能保证其值具有 日期 字段)。

    相反,您应该定义一个 HasDate

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

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

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

    任何实施这一点的人 接口可以传递给您的 设置日期() SetDate(time.Time) 方法实现了这一点 哈斯代特 甚至不知道该接口存在的接口。

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