调用提升函数时发生未定义的错误

时间:2019-01-08 19:43:20

标签: go logging methods struct embedding

在GO中使用提升功能时,出现 public void test() { uint firstInt = 987654321; var array = IntToBCD5(firstInt); var outInt = BCD5ToInt(array); MessageBox.Show(outInt.ToString()); } 错误。

undefined

这会导致编译器错误:

import "log"
type logger struct {
    log.Logger
}

logError := logger.New(os.Stderr, "ERROR", log.LstdFlags)
logOut := logger.New(os.Stdout, "INFO", log.LstdFlags)

但是,logger.go: logger.New undefined (type logger has no method New) New的升级功能。怎么了?

1 个答案:

答案 0 :(得分:3)

没有Logger.New()方法,只有一个返回值log.New()*log.Logger函数:

func New(out io.Writer, prefix string, flag int) *Logger

生成的go doc会在它们返回的类型下故意列出此类“构造函数”,以便您可以轻松找到它们,但是这种分组并未使它们成为方法。 log.New()没有接收者,因此它不能是方法,而只能是函数。

您可以使用log.New()获得类型*log.Logger的值,如果您取消引用,则将获得类型log.Logger的值,即嵌入的值。

但是,如果首先将某些东西作为指针传递给您,则有力地表明您应该将其用作指针(并且不应取消引用)。因此,我将嵌入*log.Logger,方法仍将得到提升(因为它们具有指针接收器)。这是初始化记录器的方法:

type logger struct {
    *log.Logger
}

var logError = logger{
    Logger: log.New(os.Stderr, "ERROR", log.LstdFlags),
}

var logOut = logger{
    Logger: log.New(os.Stdout, "INFO", log.LstdFlags),
}

尽管如果您没有为logger类型添加其他内容,但我认为它的存在不合理,您也可以使用*log.Logger