eddycjy / blog

煎鱼的博客,有点忙,传送门:https://eddycjy.com
3.05k stars 431 forks source link

posts/go/go-empty-struct/ #145

Open utterances-bot opened 3 years ago

utterances-bot commented 3 years ago

用 Go struct 不能犯的一个低级错误!

https://eddycjy.com/posts/go/go-empty-struct/

rockli0724 commented 3 years ago

w570955342 commented 3 years ago

严格来讲这个比较的应该算是空结构体指针吧。俩空结构体的话,肯定是相等的,比如println(struct{}{} == struct{}{})。

tuber commented 2 years ago

各位客观,再看看这个interface的nil 判等问题

package main

import "fmt"

type TestStruct struct{}

type temp interface {
    foo()
}
func NilOrNot(v interface{}) bool {
    return v == nil
}

func main() {
    var s1 *TestStruct
    fmt.Println(s1 == nil)      // #=> true
    fmt.Println(NilOrNot(s1))   // #=> false
    fmt.Println()
    var t1 temp
    var t2 *temp

    var s2 TestStruct
    fmt.Printf("t1 (empty interface var) is nil %v\n,t2 (empty pointer interface var)  is nil %v\n",t1==nil,t2==nil)

    fmt.Println("t1 after nilOrNot:",NilOrNot(t1)) // #=> true
    fmt.Println("t2 after nilOrNot:",NilOrNot(t2)) // #=> false
    fmt.Println()
    fmt.Println(NilOrNot(&s2)) // #=> false
    fmt.Println(NilOrNot(s2)) // #=> false
}