1
majinjing3 2018-02-21 01:27:13 +08:00 via Android
谷歌 golang receiver
|
2
rrfeng 2018-02-21 08:32:51 +08:00 via Android
指针效率更高
|
3
tonic 2018-02-21 09:53:33 +08:00
因为只有 `*errorString` 才有 `Error` 方法啊...
|
4
inkedawn 2018-02-21 10:40:28 +08:00
可以通过比较指针,来比较 error 是否相等(只要控制相同错误只创建一个 error 对象)
否则的话,对象一复制,再比较就 false 了 |
5
mengzhuo 2018-02-21 11:26:22 +08:00 via iPhone
4 楼正解
一个是指针比较,只需要 4 个指令集,编译器可以直接 inline 到函数体中。 而字符串比较,根据平台不同,大小和速度都不等。 |
6
admirez OP @tonic 可是把 func (e *errorString) Error() string 改成 func (e errorString) Error() string 一样可以输出 error 啊
|
7
douglarek 2018-02-21 19:09:32 +08:00
@admirez 不是这样说的;你改成 func (e errorString) Error() string 一样输出不能说明说明,因为 非指针 receiver 可以转化默认转化成 receiver, 所以可以输出
|
8
douglarek 2018-02-21 19:10:11 +08:00
@admirez 不是这样说的;你改成 func (e errorString) Error() string 一样输出不能说明什么,因为 非指针 receiver 可以默认转化成 receiver, 所以可以输出
|
9
douglarek 2018-02-21 19:11:42 +08:00
|
10
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 |
11
fengzixu 2018-02-22 08:12:55 +08:00
更正一下:receiver
|
12
BBCCBB 2018-02-22 08:49:28 +08:00
4l 正解
|
13
picasso250 2018-02-22 15:30:02 +08:00
3L 正解
看清楚这里的星号! func (e *errorString) Error() string { return e.s } |
15
iRiven 2018-02-23 21:35:32 +08:00 via Android
只有指针能和 nil 比较我是这么理解的
|