返回
有什么区别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}
我已经阅读了指南,但是没有提到区别。它只提到,对于一个错误对象,您将无法使用您不想要的东西。
答案 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"}
}