1.7.5 接口使用注意事项

一、可变参数是空接口类型

  1. 在Go语言中,当可变参数是空接口类型时,传入空接口的切片时需要注意参数展开的问题

  2. 不管是否展开,编译器都无法发现错误,但是输出是不同的

    func main() {
        var arr = []interface(){1, 6, 8}
        
        fmt.Println(arr)
        fmt.Println(arr...)
    }

    结果:

    [1 6 8]
    1 6 8

二、空指针和空接口不等价

  1. 接口类型默认是一个指针(引用类型),如果没有对接口进行初始化就使用,则会输出nil

  2. 空接口interface{}没有任何方法,所有所有类型都实现了空接口,即可以把任何一个变量赋值给空接口,如返回了一个错误指针,但并不是空的error接口

    func returnsError() error {
    	var err *os.PathError = nil
    	// ...
    	return err
    }
    
    func main() {
    
    	err := returnsError()
    	if err != nil {
    		fmt.Printf("操作失败: %v", err)
    	}
    
    }

    结果

    操作失败:

  3. 因为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