0
0

【Golang】実体とポインターで見る構造体の初期化の違い

Posted at

Golangにおいて、実体かポインターとして構造体を初期化する際の挙動の違いを把握したため、備忘録として残すもの。

実体で構造体を初期化する場合

package main

import "fmt"

type User struct {
	name string
	sex  int
}

func main() {
	var instanceUser User // User構造体を実体として定義

	fmt.Println(instanceUser)      // 結果:{ 0}
	fmt.Println(instanceUser.name) // 結果:
	fmt.Println(instanceUser.sex)  // 結果: 0
}

実体で構造体を初期化すると、 初期値 が格納される

ポインターで構造体を初期化する場合

package main

import "fmt"

type User struct {
	name string
	sex  int
}

func main() {
	var pointerUser *User // User構造体を実体として定義

	fmt.Println(pointerUser)      // 結果:<nil>
	fmt.Println(pointerUser.name) // 結果:panic: runtime error: invalid memory address or nil pointer dereference
	fmt.Println(pointerUser.sex)  // 結果:panic: runtime error: invalid memory address or nil pointer dereference
}

ポインターで構造体を初期化すると 「nil」 が格納される。
そして、 構造体のフィールドにアクセスするとpanic が発生する
(本来ポインターはアドレスを貰うはずだが、nilが格納されているため)

スクリーンショット 2023-10-29 14.24.31.png

まとめ

実体とポインターの初期化の違いを把握した上で、どちらを使用した場合に、どのような挙動となるのか理解しコードを書いていきたい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0