1.7.5 接口使用注意事项
一、可变参数是空接口类型
在Go语言中,当可变参数是空接口类型时,传入空接口的切片时需要注意参数展开的问题
不管是否展开,编译器都无法发现错误,但是输出是不同的
func main() { var arr = []interface(){1, 6, 8} fmt.Println(arr) fmt.Println(arr...) }结果:
[1 6 8] 1 6 8
二、空指针和空接口不等价
接口类型默认是一个指针(引用类型),如果没有对接口进行初始化就使用,则会输出nil
空接口interface{}没有任何方法,所有所有类型都实现了空接口,即可以把任何一个变量赋值给空接口,如返回了一个错误指针,但并不是空的error接口
func returnsError() error { var err *os.PathError = nil // ... return err } func main() { err := returnsError() if err != nil { fmt.Printf("操作失败: %v", err) } }结果
操作失败:
因为error为指针类型,而
var err *os.PathError = nil为nil类型,他们是不相等的func returnsError1() error { var err *os.PathError = nil // ... return err } func returnError2() (err error) { return err // err未赋值且为零值[nil, nil] } func main() { err1 := returnsError1() fmt.Println(err1) fmt.Println(err1 == nil) err2 := returnError2() fmt.Println(err2) fmt.Println(err2 == nil) }结果
<nil> false <nil> true
Last updated