无法在非本地类型上定义新方法 models.Meter
cannot define new methods on non-local type models.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
为什么会发生这种情况,我该如何解决?
不允许在定义类型的包外定义方法。这给您留下了几个选择:
定义models
包中的方法。这是处理您自己的代码时最简单的方法,但当然不适用于第 3 方类型。
创建常规函数而不是方法 (func String(meter models.Meter) string
)。不过,这可能不那么惯用(尤其是对于 String
方法),并且也无法访问私有字段(除非您在 models
包中定义该函数,在这种情况下您可以只定义方法代替)。
创建嵌入原始类型的新类型。这使用起来有点麻烦,但允许您扩展现有行为。像这样:
`
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"
}
简单,
import ...bla/bla/Meter
type extended Meter
参考:https://github.com/golang/go/issues/31631#issuecomment-486075295
我想将我所有的模型放在一个共享的 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
为什么会发生这种情况,我该如何解决?
不允许在定义类型的包外定义方法。这给您留下了几个选择:
定义
models
包中的方法。这是处理您自己的代码时最简单的方法,但当然不适用于第 3 方类型。创建常规函数而不是方法 (
func String(meter models.Meter) string
)。不过,这可能不那么惯用(尤其是对于String
方法),并且也无法访问私有字段(除非您在models
包中定义该函数,在这种情况下您可以只定义方法代替)。创建嵌入原始类型的新类型。这使用起来有点麻烦,但允许您扩展现有行为。像这样:
`
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"
}
简单,
import ...bla/bla/Meter
type extended Meter
参考:https://github.com/golang/go/issues/31631#issuecomment-486075295