Golang Go语言中为什么 func New(text string) error 内部是 return 一个 &errorString 而不是 errorString

// New returns an error that formats as the given text.
func New(text string) error {
return &errorString{text}
}

// errorString is a trivial implementation of error.
type errorString struct {
s string
}

func (e *errorString) Error() string {
return e.s
}
Golang Go语言中为什么 func New(text string) error 内部是 return 一个 &errorString 而不是 errorString


更多关于Golang Go语言中为什么 func New(text string) error 内部是 return 一个 &errorString 而不是 errorString的实战教程也可以访问 https://www.itying.com/category-94-b0.html

16 回复

谷歌 golang receiver

更多关于Golang Go语言中为什么 func New(text string) error 内部是 return 一个 &errorString 而不是 errorString的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


指针效率更高

因为只有 *errorString 才有 Error 方法啊…

可以通过比较指针,来比较 error 是否相等(只要控制相同错误只创建一个 error 对象)
否则的话,对象一复制,再比较就 false 了

4 楼正解
一个是指针比较,只需要 4 个指令集,编译器可以直接 inline 到函数体中。
而字符串比较,根据平台不同,大小和速度都不等。

可是把 func (e *errorString) Error() string 改成 func (e errorString) Error() string 一样可以输出 error 啊

不是这样说的;你改成 func (e errorString) Error() string 一样输出不能说明说明,因为 非指针 receiver 可以转化默认转化成 receiver, 所以可以输出

不是这样说的;你改成 func (e errorString) Error() string 一样输出不能说明什么,因为 非指针 receiver 可以默认转化成 receiver, 所以可以输出

golang 中的 reciver,其实只是形式上让我们看起来像是某个类型的方法而已。但实际上,reciver 也是被当做函数参数列表中的第一个参数传递到函数内部的。换句话说,reciver 和其他在形参列表中的参数是没有任何区别的。

<br>func (e *errorString) Error() string<br>
上面这个函数可以转换为

<br>func Error(e *errorString) string<br>
golang 中的函数签名是和形参列表相关的,这一点在 C++中也是有体现的。比如多个构造函数可以带上不同的参数或者不带参数,虽然函数名都一样,但实际上函数签名还是不同的。
所以,如果想在外面输出 errorString 类型对象的内容进而调用 Error 方法,就必须返回&errorString

更正一下:receiver

3L 正解

看清楚这里的星号!
func (e *errorString) Error() string {
return e.s
}

尴尬了, 跟 interface 那个 pointer receiver 搞混了嘻嘻嘻

只有指针能和 nil 比较我是这么理解的

在Go语言中,func New(text string) error 返回的是一个 error 接口类型的值,而不是 errorString 结构体本身。这是因为Go语言的错误处理机制是基于接口实现的,而 error 是一个预定义的接口类型,定义了一个方法 Error() string

errorString 是一个实现了 error 接口的简单结构体,通常包含一个字符串字段来表示错误信息。当你调用 New(text string) 函数时,返回的是一个指向 errorString 实例的指针(&errorString),而不是 errorString 实例本身。这是因为:

  1. 接口值的动态类型:接口值包含一个指向动态类型值的指针和一个指向该类型信息(类型描述符)的指针。返回指针可以让接口值包含具体的类型信息,这样在调用 Error() 方法时,可以正确地找到并调用 errorStringError 方法。

  2. 避免拷贝:如果直接返回 errorString 实例,那么在函数调用结束后,这个实例可能会被垃圾回收(如果没有其他引用)。而返回指针可以避免这种不必要的拷贝,同时确保错误对象在需要时仍然有效。

因此,New(text string) 函数返回 &errorString 而不是 errorString,是为了符合Go语言的接口机制和内存管理策略,确保错误对象能够正确地被使用和处理。

回到顶部