看下error接口
// error接口
type error interface {
Error() string
}
實現error接口
package main
import "fmt"
type fileError struct {
}
//https://blog.csdn.net/Maggie_up有問題歡迎指正!
func (fe *fileError) Error() string {
return "文件錯誤"
}
func main() {
fmt.Println(&fileError{})
}
// 最后打印結果:文件錯誤
- 實現了接口,并沒有調用Error()方法為什么會調用呢?尼瑪不是要初始化結構體,再調用方法?這里一看代碼木有調用啊,只初始化了下而已。怎么自動調用了?
1.這是fmt.println函數在內部調用Error()方法
2.在源碼fmt--->print.go這個文件中
//print.go 部分代碼:
//Stringer接口
type Stringer interface {
String() string
}
......
switch v := p.arg.(type) { //類型斷言:error接口會調用Error()方法,Stringer接口會調用String()方法
case error:
handled = true
defer p.catchPanic(p.arg, verb)
p.fmtString(v.Error(), verb)
return
case Stringer:
handled = true
defer p.catchPanic(p.arg, verb)
p.fmtString(v.String(), verb)
return
}
修改代碼實現Stringer接口測試,看會不會調用String()方法:
package main
import "fmt"
type fileError struct {
}
//https://blog.csdn.net/Maggie_up有問題歡迎指正!
func (fe *fileError) String() string {
return "字符串"
}
func main() {
fmt.Println(&fileError{})
}
//打印:字符串 調用了String()方法
簡單理解:fmt.Println會在內部調用Error()和String()方法,而且Error()方法有優先權。
-
可以debug模式調試下,不想看詳細的按F8(詳細按F7)跑
在這里插入圖片描述