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
谷歌 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, 所以可以输出
golang 中的 reciver,其实只是形式上让我们看起来像是某个类型的方法而已。但实际上,reciver 也是被当做函数参数列表中的第一个参数传递到函数内部的。换句话说,reciver 和其他在形参列表中的参数是没有任何区别的。<br>func (e *errorString) Error() string<br>
上面这个函数可以转换为<br>func Error(e *errorString) string<br>
golang 中的函数签名是和形参列表相关的,这一点在 C++中也是有体现的。比如多个构造函数可以带上不同的参数或者不带参数,虽然函数名都一样,但实际上函数签名还是不同的。
所以,如果想在外面输出 errorString 类型对象的内容进而调用 Error 方法,就必须返回&errorString
更正一下:receiver
4l 正解
3L 正解
看清楚这里的星号!
func (e *errorString) Error() string {
return e.s
}
只有指针能和 nil 比较我是这么理解的
在Go语言中,func New(text string) error
返回的是一个 error
接口类型的值,而不是 errorString
结构体本身。这是因为Go语言的错误处理机制是基于接口实现的,而 error
是一个预定义的接口类型,定义了一个方法 Error() string
。
errorString
是一个实现了 error
接口的简单结构体,通常包含一个字符串字段来表示错误信息。当你调用 New(text string)
函数时,返回的是一个指向 errorString
实例的指针(&errorString
),而不是 errorString
实例本身。这是因为:
-
接口值的动态类型:接口值包含一个指向动态类型值的指针和一个指向该类型信息(类型描述符)的指针。返回指针可以让接口值包含具体的类型信息,这样在调用
Error()
方法时,可以正确地找到并调用errorString
的Error
方法。 -
避免拷贝:如果直接返回
errorString
实例,那么在函数调用结束后,这个实例可能会被垃圾回收(如果没有其他引用)。而返回指针可以避免这种不必要的拷贝,同时确保错误对象在需要时仍然有效。
因此,New(text string)
函数返回 &errorString
而不是 errorString
,是为了符合Go语言的接口机制和内存管理策略,确保错误对象能够正确地被使用和处理。