【发布时间】:2014-08-19 08:53:22
【问题描述】:
我正在玩 Go Playground 并找到以下代码:
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,所以如果我理解正确的话,func error 在某些情况下完全有可能返回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)
}
}
go 编译器说:prog.go:27: cannot use nil as type MyError in assignment
[process exited with non-zero status]
为什么在大写的情况下编译成功而在这种情况下编译失败?
结构是否有可能是nil(我猜不是,但是为什么run func 编译?)
【问题讨论】:
标签: go