見出し画像

[Go言語 入門] ポインタ型の構造体

golangで作ってみたいものがあり、golangを学び始めたので学習したことを書いていくノート。

---------------------------------------------------

サイトマップはこちら

---------------------------------------------------

第14回 ポインタ型の構造体


構造体を値として定義する場合は以下のように宣言する。

// main.go

type Person struct {
	Name string
	Age  int
}

func main() {
	taro := Person{}
	var jiro Person

	fmt.Printf("%T %v\n", taro, taro)
	fmt.Printf("%T %v\n", jiro, jiro)
}

// 実行結果
// main.Person { 0}
// main.Person { 0}

では、ポインタ型として定義する場合はどのように宣言するか。

ポインタ型の構造体は以下のよう宣言する。

「 変数名 := new( 構造体名 ) 」

「 変数名 := &構造体名{ } 」

func main() {
	hana := new(Person)
	hina := &Person{}

	fmt.Printf("%T %v\n", hana, hana)
	fmt.Printf("%T %v\n", hina, hina)
}

// 実行結果
// *main.Person { 0}
// *main.Person { 0}

実行結果より、ポインタが返ってきていることが確認できる。


~ 渡す値による影響の違い ~

他の関数に、値を渡す場合とアドレスを渡す場合による違いは以下

type Person struct {
	Name string
	Age  int
}

func addAge(p Person) {
	p.Age += 10
}

func addAge_pointer(p *Person) {
	p.Age += 10
}

func main() {
	taro := Person{}
	hana := new(Person)

	addAge(taro)
	addAge_pointer(hana)
	fmt.Println(taro)
	fmt.Println(hana)
}

// 実行結果
// { 0}
// &{ 10}

別の関数に値を渡す場合は、値のみを渡しているため、addAge関数を実行しても taro の年齢自体には影響がない。

アドレスを渡した場合は、アドレスの中身を書き換えるため、上記の場合はhana の年齢「0」を +10 する addAge_pointer 関数により、hana の年齢は「10」となる。

【重要】アドレスを渡した場合、宣言した変数の値に影響がある!

以上


この記事が気に入ったらサポートをしてみませんか?