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

时间:2019-07-19 10:01:12

标签: go go-modules

我想将所有模型放入共享的Common库中。

所以,我做了一个新的仓库: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

为什么会发生这种情况,我该怎么解决?

2 个答案:

答案 0 :(得分:1)

不允许在定义类型的包外部定义方法。这给您提供了两个选择:

  1. models包中定义方法。这是处理您自己的代码时最简单的方法,但当然不适用于第三方类型。

  2. 创建常规函数而不是方法(func String(meter models.Meter) string)。但是,这可能不那么惯用(特别是对于String方法而言),并且也无权访问私有字段(除非您在models包中定义函数,在这种情况下,您只能定义方法)。

  3. 创建一个嵌入原始类型的新类型。使用起来有点麻烦,但是可以扩展现有行为。像这样:

`

package main

import (
    "fmt"
    "time"
)

func main() {
    myTime := MyTime{time.Now()}
    fmt.Println(myTime)        /* behaves as time.Time */ 
    fmt.Println(myTime.Foo())  /* also has extra methods */
}

type MyTime struct {
  time.Time
}

func (m MyTime) Foo() string {
  return "foo"
}

答案 1 :(得分:1)

简单,

import ...bla/bla/Meter

type extended Meter

参考:https://github.com/golang/go/issues/31631#issuecomment-486075295