我一起去遊樂場玩,找到這個代碼:的Structs不能是零,但是這是編譯
package main
import (
"fmt"
"time"
)
type MyError struct {
When time.Time
What string
}
func (e *MyError) Error() string {
return fmt.Sprintf("at %v, %s",
e.When, e.What)
}
func run() error {
return &MyError{
time.Now(),
"it didn't work",
}
}
func main() {
if err := run(); err != nil {
fmt.Println(err)
}
}
所以我在這裏可以看到,*MyError
實現error
接口。但是,如果我在error
FUNC刪除&
並返回MyError
相反,我收到編譯時錯誤: prog.go:19: cannot use MyError literal (type MyError) as type error in return argument: MyError does not implement error (Error method has pointer receiver)
。好吧,我能理解,所以我可以做的函數Error
這樣,這將編譯並運行成功:
func (e MyError) Error() string {
return fmt.Sprintf("at %v, %s",
e.When, e.What)
}
func run() error {
return MyError{
time.Now(),
"it didn't work",
}
}
然後我main
FUNC看到,有檢查,如果err
是nil
所以如果我正確它理解完全有可能在某些情況下返回nil
。所以MyError
結構可能取nil
值。不過,如果我嘗試編譯如下:
import (
"fmt"
"time"
)
type MyError struct {
When time.Time
What string
}
func (e MyError) Error() string {
return fmt.Sprintf("at %v, %s",
e.When, e.What)
}
func run() error {
return nil
return MyError{
time.Now(),
"it didn't work",
}
}
func main() {
var err2 MyError = nil
fmt.Println(err2)
if err := run(); err != nil {
fmt.Println(err)
}
}
去編譯器說:prog.go:27: cannot use nil as type MyError in assignment [process exited with non-zero status]
爲什麼在大寫編譯成功,在這種情況下,編譯失敗? 是否有可能爲結構是nil
(我想不會,但爲什麼run
FUNC編譯?)
我明白這一點,但看看'run' func。它返回MyError,但也可以返回零。 – Marii
我會盡力在我的下一個編輯中更好地解釋;) – julienc
啊哈,現在有道理。謝謝。 :) – Marii