package main
import "fmt"
type Point struct {
row int
col int
}
func main() {
p1 := &Point{1, 2}
p2 := &Point{1, 2}
fmt.Printf("p1: %p %v p2: %p %v\n", p1, *p1, p2, *p2)
s := make(map[*Point]bool)
s[p1] = true
s[p2] = true
fmt.Println("s:", s)
t := make(map[int64]*Point)
t[int64(p1.row)<<32+int64(p1.col)] = p1
t[int64(p2.row)<<32+int64(p2.col)] = p2
fmt.Println("t:", t)
}
Output:
p1: 0x7fc1def5e040 {1 2} p2: 0x7fc1def5e0f8 {1 2}
s: map[0x7fc1def5e0f8:true 0x7fc1def5e040:true]
t: map[4294967298:0x7fc1def5e0f8]
Если мы создаем указатели на два Points
p1
и p2
с одинаковыми координатами, они указывают на разные адреса.
s := make(map[*Point]bool)
создает карту, где ключ является указателемпамяти, выделенной для Point
, и значение является логическим значением.Поэтому, если мы присвоим элементам p1
и p2
карте s
, у нас будет два различных ключа карты и два различных элемента карты с одинаковыми координатами.
t := make(map[int64]*Point)
создает карту, в которойkey является составной частью координат Point
, а значение является указателем на координаты Point
.Следовательно, если мы присвоим элементам p1
и p2
карте t
, то получим два равных ключа карты и один элемент карты с общими координатами.