我想将所有模型放在共享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/commonGo Modules 将下载它。我像这样导入使用它:import "gitlab.com/xxx/common/models"//String transparent methodfunc (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 回答
吃鸡游戏
TA贡献1829条经验 获得超7个赞
不允许在定义类型的包之外定义方法。这给你留下了几个选择:
定义包中的方法
models
。这是处理您自己的代码时最简单的方法,但当然不适用于第三方类型。创建常规函数而不是方法 (
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"
}
- 2 回答
- 0 关注
- 125 浏览
添加回答
举报
0/150
提交
取消