空指针和空接口不等价
package main
import (
"fmt"
)
type MyError struct{}
func (p *MyError) Error() string {
return "test error"
}
func returnsError() error {
var p *MyError = nil
return p
}
func main() {
e := returnsError()
if e != nil {
fmt.Printf("%s\n", e.Error())
} else {
fmt.Printf("no nil error !!!!!!!!!")
}
}
# root @ iZ2zehbv3lrr68hy0bu46zZ in ~/workspace/go/src [13:04:47]
$ go build -o tmp tmp.go
# root @ iZ2zehbv3lrr68hy0bu46zZ in ~/workspace/go/src [13:04:52]
$ ./tmp
test error
nil slice or empty slice
package main
import (
"fmt"
)
type MyError struct{}
func (p *MyError) Error() string {
return "test error"
}
func returnsError() error {
var p *MyError = nil
return p
}
func main() {
var a []int = nil
var a0 []int = make([]int, 0)
var a1 []int
fmt.Println(a == nil) // true
fmt.Println(a0 == nil) // false
fmt.Println(a1 == nil) // true
fmt.Printf("%#v\n", a) // []int(nil)
fmt.Printf("%#v\n", a0) // []int{}
fmt.Printf("%#v\n", a1) // []int(nil)
a1 = append(a1, 2)
fmt.Printf("%#v\n", a1) // []int{2}
}
nil slice
是可以直接append
的,但是map
在make
之前是不可以赋值的