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

2018-02-20 22:40:36 +08:00
 admirez
// 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
}
1414 次点击
所在节点    Go 编程语言
15 条回复
majinjing3
2018-02-21 01:27:13 +08:00
谷歌 golang receiver
rrfeng
2018-02-21 08:32:51 +08:00
指针效率更高
tonic
2018-02-21 09:53:33 +08:00
因为只有 `*errorString` 才有 `Error` 方法啊...
inkedawn
2018-02-21 10:40:28 +08:00
可以通过比较指针,来比较 error 是否相等(只要控制相同错误只创建一个 error 对象)
否则的话,对象一复制,再比较就 false 了
mengzhuo
2018-02-21 11:26:22 +08:00
4 楼正解
一个是指针比较,只需要 4 个指令集,编译器可以直接 inline 到函数体中。
而字符串比较,根据平台不同,大小和速度都不等。
admirez
2018-02-21 18:19:27 +08:00
@tonic 可是把 func (e *errorString) Error() string 改成 func (e errorString) Error() string 一样可以输出 error 啊
douglarek
2018-02-21 19:09:32 +08:00
@admirez 不是这样说的;你改成 func (e errorString) Error() string 一样输出不能说明说明,因为 非指针 receiver 可以转化默认转化成 receiver, 所以可以输出
douglarek
2018-02-21 19:10:11 +08:00
@admirez 不是这样说的;你改成 func (e errorString) Error() string 一样输出不能说明什么,因为 非指针 receiver 可以默认转化成 receiver, 所以可以输出
douglarek
2018-02-21 19:11:42 +08:00
fengzixu
2018-02-22 08:11:41 +08:00
golang 中的 reciver,其实只是形式上让我们看起来像是某个类型的方法而已。但实际上,reciver 也是被当做函数参数列表中的第一个参数传递到函数内部的。换句话说,reciver 和其他在形参列表中的参数是没有任何区别的。

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

```
func Error(e *errorString) string
```
golang 中的函数签名是和形参列表相关的,这一点在 C++中也是有体现的。比如多个构造函数可以带上不同的参数或者不带参数,虽然函数名都一样,但实际上函数签名还是不同的。
所以,如果想在外面输出 errorString 类型对象的内容进而调用 Error 方法,就必须返回&errorString
fengzixu
2018-02-22 08:12:55 +08:00
更正一下:receiver
BBCCBB
2018-02-22 08:49:28 +08:00
4l 正解
picasso250
2018-02-22 15:30:02 +08:00
3L 正解

看清楚这里的星号!
func (e *errorString) Error() string {
return e.s
}
tonic
2018-02-22 20:30:14 +08:00
@admirez 尴尬了, 跟 interface 那个 pointer receiver 搞混了嘻嘻嘻
iRiven
2018-02-23 21:35:32 +08:00
只有指针能和 nil 比较我是这么理解的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/431387

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX