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が格納されているため)
まとめ
実体とポインターの初期化の違いを把握した上で、どちらを使用した場合に、どのような挙動となるのか理解しコードを書いていきたい。