【问题标题】:How to work around "type interface has no field or method" error?如何解决“类型接口没有字段或方法”错误?
【发布时间】:2014-08-26 08:13:24
【问题描述】:

我想为 mgo API 写一个抽象:

package manager

import "labix.org/v2/mgo"

type Manager struct {
    collection *mgo.Collection
}

func (m *Manager) Update(model interface{}) error {
    return m.collection.UpdateId(model.Id, model)
}

编译时我得到“model.Id undefined (interface{} has no field or method Id)”,这本身很明显。

从我的角度来看,这是一种完全错误的方法,还是有一个简单的解决方法来让编译器“相信”在传递的结构上运行时会有一个 Id 属性。

【问题讨论】:

    标签: struct interface go


    【解决方案1】:

    你可以定义一个接口来声明一个 Id 函数

    type Ider interface {
        Id() interface{}
    }
    

    如果您的模型是 Ider,那么您的函数将起作用。

    func (m *Manager) Update(model Ider) error {
    

    考虑到mgo#Collection.UpdateId() function 接受interface{},它将接受Ider

    【讨论】:

    • 我也想过这个,但我不会覆盖存储实际 ID 的默认“Id”字段吗?我虽然接口只定义方法?
    • @bodokaiser 只要你的对象有一个 Id() 方法可以返回默认的 Id 字段,就可以了。
    • 啊,所以如果我有一个私有字段“id”,那么我可以实现一个方法“Id”,它返回这个,mgo 会自动使用它。谢谢!
    猜你喜欢
    • 2022-11-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 2023-04-10
    • 2012-12-06
    相关资源
    最近更新 更多