Go语言中nil interface 和 nil interface 值对比测试及注意事项

 interface 看起来像指针类型,但它不是。

interface 类型的变量只有在类型和值均为 nil 时才为 nil


注意点1:

当 interface 变量的值是跟随其他变量变化的,与 nil 比较相等时

代码示例:

func main() {
    var data *byte
    var in interface{}
    
    fmt.Println(data, data == nil)  // <nil> true
    
    fmt.Println(in, in == nil)     // <nil> true
    
    in = data
    fmt.Println(in, in == nil)     // <nil> false // data 值为 nil,但 in 值不为 nil
}


注意点2:

如果你的函数返回值类型是 interface,更要小心这个坑

代码示例:

// 错误示例
func main() {
    doIt := func(arg int) interface{} {
   
        var result *struct{} = nil
       
        if arg > 0 {
            result = &struct{}{}
        }
       
        return result
    }
   
    if res := doIt(-1); res != nil {
   
        fmt.Println("Good result: ", res)    // Good result:  <nil>
       
        fmt.Printf("%T\n", res)      // *struct {}  // res 不是 nil,它的值为 nil
       
        fmt.Printf("%v\n", res)      // <nil>
    }
}

// 正确示例
func main() {
    doIt := func(arg int) interface{} {
   
        var result *struct{} = nil
       
        if arg > 0 {
       
            result = &struct{}{}
           
        } else {
       
            return nil    // 明确指明返回 nil
           
        }
       
        return result
    }
   
    if res := doIt(-1); res != nil {
   
        fmt.Println("Good result: ", res)
       
    } else {
   
        fmt.Println("Bad result: ", res)    // Bad result:  <nil>
       
    }
}



更多go语言的注意点,请收藏本站网址:https://www.zongscan.com/


相关文章