Go 无法在非本地类型模型上定义新方法。Meter

Go 无法在非本地类型模型上定义新方法。Meter,go,go-modules,Go,Go Modules,我想把我所有的模型放在一个共享的Commonlib中 所以,我做了一个新的回购:gitlab.com/xxx/common 我在里面放了一个包裹:models 以下是对象的定义: type Meter struct { ID string OperationID string Type ConsoProd Unit string Timestep time.Duration Measur

我想把我所有的模型放在一个共享的
Common
lib中

所以,我做了一个新的回购:
gitlab.com/xxx/common

我在里面放了一个包裹:
models

以下是对象的定义:

type Meter struct {
    ID           string
    OperationID  string
    Type         ConsoProd
    Unit         string
    Timestep     time.Duration
    Measures     []Measure 
    FetchMethod  AcquisitionMethod
    Metadata     interface{}
}
现在,我想在外部项目中使用它,我会:

go get gitlab.com/xxx/common
Go模块将下载它

我会这样使用它:

import "gitlab.com/xxx/common/models"

//String transparent method
func (meter models.Meter) String() string {
    var stringifyMeter string
    stringifyMeter += "Meter " + meter.ID + " is a " + meter.Type.String() + " and compute in operation #" + meter.OperationID + "."
    return stringifyMeter
}
但Goland不会解决它,当我编译时,我得到:

cannot define new methods on non-local type models.Meter

为什么会发生这种情况?我可以做些什么来修复它?

不允许在定义类型的包之外定义方法。这给您留下了两个选择:

  • 模型
    包中定义方法。在处理自己的代码时,这是最简单的方法,但对于第三方类型当然不起作用

  • 创建常规函数而不是方法(
    func String(meter models.meter)String
    )。但是,这可能不太惯用(特别是对于
    字符串
    方法),并且也不能访问私有字段(除非您在
    模型
    包中定义函数,在这种情况下,您可以只定义方法)

  • 创建嵌入原始类型的新类型。这将有点麻烦,但允许您扩展现有的行为。大概是这样的:

  • `

    简单,

    import ...bla/bla/Meter
    
    type extended Meter
    

    参考:

    好的!选择一是有意义的!谢谢你的帮助
    import ...bla/bla/Meter
    
    type extended Meter