
1 majinjing3 2018 年 2 月 21 日 via Android 谷歌 golang receiver |
2 rrfeng 2018 年 2 月 21 日 via Android 指针效率更高 |
3 tonic 2018 年 2 月 21 日 因为只有 `*errorString` 才有 `Error` 方法啊... |
4 inkedawn 2018 年 2 月 21 日 可以通过比较指针,来比较 error 是否相等(只要控制相同错误只创建一个 error 对象) 否则的话,对象一复制,再比较就 false 了 |
5 mengzhuo 2018 年 2 月 21 日 via iPhone 4 楼正解 一个是指针比较,只需要 4 个指令集,编译器可以直接 inline 到函数体中。 而字符串比较,根据平台不同,大小和速度都不等。 |
6 admirez OP @tonic 可是把 func (e *errorString) Error() string 改成 func (e errorString) Error() string 一样可以输出 error 啊 |
7 douglarek 2018 年 2 月 21 日 @admirez 不是这样说的;你改成 func (e errorString) Error() string 一样输出不能说明说明,因为 非指针 receiver 可以转化默认转化成 receiver, 所以可以输出 |
8 douglarek 2018 年 2 月 21 日 @admirez 不是这样说的;你改成 func (e errorString) Error() string 一样输出不能说明什么,因为 非指针 receiver 可以默认转化成 receiver, 所以可以输出 |
9 douglarek 2018 年 2 月 21 日 |
10 fengzixu 2018 年 2 月 22 日 golang 中的 reciver,其实只是形式上让我们看起来像是某个类型的方法而已。但实际上,reciver 也是被当做函数参数列表中的第一个参数传递到函数内部的。换句话说,reciver 和其他在形参列表中的参数是没有任何区别的。 ``` func (e *errorString) Error() string ``` 上面这个函数可以转换为 ``` func Error(e *errorString) string ``` golang 中的函数签名是和形参列表相关的,这一点在 C++中也是有体现的。比如多个构造函数可以带上不同的参数或者不带参数,虽然函数名都一样,但实际上函数签名还是不同的。 所以,如果想在外面输出 errorString 类型对象的内容进而调用 Error 方法,就必须返回&errorString |
11 fengzixu 2018 年 2 月 22 日 更正一下:receiver |
12 BBCCBB 2018 年 2 月 22 日 4l 正解 |
13 picasso250 2018 年 2 月 22 日 3L 正解 看清楚这里的星号! func (e *errorString) Error() string { return e.s } |
15 iRiven 2018 年 2 月 23 日 via Android 只有指针能和 nil 比较我是这么理解的 |