🐙

[Go] 構造体

2022/09/24に公開

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