目录

go 的 struct 能不能比较以及能否作为 map 的 key

go struct 能不能比较

  • 值类型 - 结构体

      1. 相同类型
      1. 所有成员都可以比较,并且所有成员都相等才相等
      1. 只能比较是否相等,不能比较大小
    type User struct {
        Name string
        Age  int
    }
    
    func main() {
        var u1 = User{
            Name: "test",
            Age:  1,
        }
        var u2 = User{
            Name: "test",
            Age:  1,
        }
        var u3 = User{
            Name: "test",
            Age:  2,
        }
        fmt.Println("u1=u2", u1 == u2) // true
        fmt.Println("u1=u3", u1 == u3) // false
    }
  • 指针类型 - 结构体

    • 相同类型

    • 两个结构体指针指向同一个内存地址,则相等,否则不可比较

    type User struct {
        Name string
        Age  int
    }
    
    func main() {
        var u1 = &User{
            Name: "test",
            Age:  1,
        }
        var u2 = &User{
            Name: "test",
            Age:  1,
        }
        var u3 = u2
        fmt.Println("u1=u2", u1 == u2) // false, 虽然值相同,但是指针地址不同
        fmt.Println("u1=u3", u2 == u3) // true,指针地址相同
    }

go struct 能否作为 map 的key

不管是指针类型还是值类型,都可以作为 map 的 key,

type User struct {
    Name string
    Age  int
}

func main() {
    var u = User{
        Name: "test",
        Age:  1,
    }
    var m = map[User]int{
        u: 1,
    }
    fmt.Println("m:", m)
}

只要是可比较的类型都可以作为 map 的 key

slice 就不可以,因为 slice 是动态的,不可比较,但是数组 Array 是可以的