美文网首页
nil interface 坑

nil interface 坑

作者: anthonydan | 来源:发表于2020-03-17 17:56 被阅读0次

    nil interface 和 nil interface 值
    虽然 interface 看起来像指针类型,但它不是。interface 类型的变量只有在类型和值均为 nil 时才为 nil

    如果你的 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
    

    }
    如果你的函数返回值类型是 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>
    }
    

    }

    相关文章

      网友评论

          本文标题:nil interface 坑

          本文链接:https://www.haomeiwen.com/subject/ygqxyhtx.html