go语言 nil

空指针和空接口不等价
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的,但是mapmake之前是不可以赋值的

https://programming.guide/go/nil-slice-vs-empty-slice.html