🐙
[Go] 構造体
What`s This
ポインタ、構造体、new(),make()がわからなすぎるのでまとめた。
type Abc struct {
X, Y int
S string
}
func main() {
a := Abc{}
fmt.Printf("%T %v\n", a, a)
var b Abc
fmt.Printf("%T %v\n", b, b)
c := new(Abc)
fmt.Printf("%T %v\n", c, c)
}
// new()で括ると、ポインタが帰ってくることがわかる。
main.Abc {0 0 }
main.Abc {0 0 }
*main.Abc &{0 0 }
new()の代わりに、&Struct{}でも、同じようにポインタが帰ってくる。
d := &Abc{}
fmt.Printf("%T %v\n", d, d)
*main.Abc &{0 0 }
どちらを使うかだが、&
がついている方が、アドレス書いてあるから、ポインタを返すんだなということが一目でわかるかも。
package main
import (
"fmt"
)
type Abc struct {
X, Y int
S string
}
// vにAbc構造体を代表させる.
// Abc構造体struct型を引数vにとる。
func change(v Abc) {
v.X = 100
}
func change2(v *Abc) {
v.X = 1000
}
func main() {
v := Abc{1, 2, "test"}
change(v)
fmt.Println(v)
v2 := &Abc{1, 2, "test"}
change2(v2)
fmt.Println(*v2)
}
// *v2により、実体を返しているので、&アドレスがつかない。
{1 2 test}
{1000 2 test}
v2 := &Abc{1, 2, "test"}
change2(v2)
fmt.Println(v2)
// *をつけないと、アドレスがついた値が返ってくる。
{1 2 test}
&{1000 2 test}
Discussion