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

我想将所有模型放在共享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 Modules 将下载它。


我像这样导入使用它:


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

为什么会发生这种情况以及我可以采取什么措施来解决它?


九州编程
浏览 92回答 2
2回答

吃鸡游戏

不允许在定义类型的包之外定义方法。这给你留下了几个选择:定义包中的方法models。这是处理您自己的代码时最简单的方法,但当然不适用于第三方类型。创建常规函数而不是方法 ( func String(meter models.Meter) string)。不过,这可能不太惯用(尤其是对于String方法),并且也无法访问私有字段(除非您在包中定义函数models,在这种情况下您可以只定义方法)。创建嵌入原始类型的新类型。这使用起来有点麻烦,但允许您扩展现有的行为。像这样的东西:`package mainimport (    "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"}

largeQ

简单的,import ...bla/bla/Meter type extended Meter
打开App,查看更多内容
随时随地看视频慕课网APP