golang學習筆記之-fmt.Println原始碼print.go簡單探索
來看一段程式碼,實現了error介面
package main import "fmt" type fileError struct { } func (fe *fileError) Error() string { return "檔案錯誤" } func main() { fmt.Println(&fileError{}) } // 最後列印結果:檔案錯誤
- 實現了介面,並沒有呼叫Error()方法為什麼會呼叫呢?尼瑪不是要初始化結構體,再呼叫方法?這裡一看程式碼木有呼叫啊,只初始化了下而已。怎麼自動呼叫了?
1.這是fmt.println函式在內部呼叫Error()方法
2.在原始碼fmt--->print.go這個檔案中
//print.go 部分程式碼: 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 }
修改程式碼測試,看會不會呼叫String()方法:
package main import "fmt" type fileError struct { } func (fe *fileError) String() string { return "字串" } func main() { fmt.Println(&fileError{}) } //列印:字串
簡單理解:fmt.Println會在內部呼叫Error()和String()方法,而且Error()方法有優先權。
-
可以debug模式除錯下,不想看詳細的按F8(詳細按F7)跑
image.png