gpt4 book ai didi

go - 不能在非本地类型模型上定义新方法。Meter

转载 作者:数据小太阳 更新时间:2023-10-29 03:40:23 28 4
gpt4 key购买 nike

我想将我所有的模型放在一个共享的Common 库中。

所以,我创建了一个新的 repo: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

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

最佳答案

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

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

  2. 创建一个常规函数而不是方法 (func String(meter models.Meter) string)。不过,这可能不那么惯用(尤其是对于 String 方法),并且也无法访问私有(private)字段(除非您在 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"
}

关于go - 不能在非本地类型模型上定义新方法。Meter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57110030/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com