返回&obj是什么意思?它对平等检查有什么影响

时间:2019-09-10 22:21:53

标签: go

返回

有什么区别
func New(text string) error { return &errorString{text} }

或返回

func New(text string) error { return errorString{text} }

errorString的定义如下

type errorString struct { text string }

错误定义如下

type error interface {
  Error() string
}

我特别想知道返回值的区别是什么

return &errorString{text}
      vs.
return errorString{text}

我已经阅读了指南,但是没有提到区别。它只提到,对于一个错误对象,您将无法使用您不想要的东西。

1 个答案:

答案 0 :(得分:1)

errorString{text}是一个结构,&errorString{text}是一个指向该结构的指针。有关这意味着什么的详细说明,请参见https://tour.golang.org/moretypes/1

还有一个问题,其中详细说明了何时返回:Pointers vs. values in parameters and return values。返回errorText{text}返回整个结构的副本,而&errorText{text}返回指向结构的指针。

结构S和指向类型S的结构的指针是Go中的两个独立类型。为了使errorText实现error接口,errorText必须实现Error() string方法,但还需要具有正确的接收器类型。

例如,这可以:

type errorText struct {
    text string
}

func (e errorText) Error() string { return e.text }

func SomethingThatReturnsYourError() error {
    return errorText{"an error"}
}

这也可以:

type errorText struct {
    text string
}

func (e errorText) Error() string { return e.text }

func SomethingThatReturnsYourError() error {
    return &errorText{"an error"} // Notice the &
}

但这不行,编译器会打一个错误:

type errorText struct {
    text string
}

// notice the pointer receiver type
func (e *errorText) Error() string { return e.text }

func SomethingThatReturnsYourError() error {
    return errorText{"an error"}
}

错误消息:cannot use errorString literal (type errorString) as type error in return argument: errorString does not implement error (Error method has pointer receiver)

要使用指针接收器,您必须返回一个指针:

type errorText struct {
    text string
}

func (e *errorText) Error() string { return e.text }

func SomethingThatReturnsYourError() error {
    return &errorText{"an error"}
}