教科書などにあるポインタ
package main
import "fmt"
func main() {
var n int = 100
var p *int = &n
fmt.Println(n) // 100
fmt.Println(&n) // 0xc000014078
// fmt.Println(*n) // ポイント型ではないのでエラーになる
fmt.Println(p) // 0xc000014078
fmt.Println(*p) // 100
fmt.Println(&p) // 0xc00000c028
}
構造体のポインタ
そして、分からないのが構造体のポインタ
package main
import "fmt"
type Vertex struct {
X int
Y int
}
func main() {
v := Vertex{1, 2}
p := &v
fmt.Println(v) // {1 2}
fmt.Println(&v) // &{1 2}
fmt.Println(p) // &{1 2}
fmt.Println(*p) // {1 2}
fmt.Println(&p) // 0xc00000c028
}
アドレスが、&{1 2}
という形式になっている???
わかる方教えてください。
直接アドレスと指定した場合は以下の通り
package main
import "fmt"
type Vertex struct {
X int
Y int
}
func main() {
v := &Vertex{1, 2}
fmt.Println(v) // &{1 2}
fmt.Println(*v) // {1 2}
fmt.Println(&v) // 0xc00000c028
}
関数経由で、構造体を宣言する場合(カプセル化に利用できる?)
イメージは上と同じ
package main
import "fmt"
type Vertex struct {
x, y int
}
func New(x, y int) *Vertex {
return &Vertex{x, y}
}
func main() {
v := New(1, 2) // v := &Vertex{1, 2} と同じ
fmt.Println(v) // &{1 2}
fmt.Println(*v) // {1 2}
fmt.Println(&v) // 0xc00000c028
}