ぷらこのきろく

メモとかテストとか備忘録とか

構造体とポインタの話

まあ、あたりまえっちゃあたりまえなんだろうけど、一応確かめておこうと思ったこと。

package main

import "fmt"

type hoge struct {
	a int
	b float64
	s string
}

構造体を適当に宣言しておく。

func main() {
	var h *hoge
	h = new(hoge)

	h.a = 5
	h.b = 3.14
	h.s = "hogehoge"

	fmt.Println(h.a,",",h.b,",",h.s)
}

このコードは、ちゃんと動く。
でも、

	h = new(hoge)

この一行を書かないと、コンパイルは通るけど実行時エラーが出て動かない。
ポインタ型を宣言してるけど、構造体の中身を確保していないから当然だろう。

で、main()関数の最初の二行を

	h: = &hoge{}

とすると、動く。当然だといわれればそうなんだけど、構造体の確保って、Cでいう静的とか動的とか意識したら、どっちがいいんだろうと思ったりしたりするのかなぁ。と。

まあ、あんまり深く考えなくていいのかもしれないけど。。


ちょっとコードを書き足して、

func (h *hoge)print() {
	fmt.Println(h.a,",",h.b,",",h.s)
}

こんなのを書いてみて、main()関数の終わりの方で

	h.print()

って呼び出してみた。
やっぱり、var h *hogeだけでは動かないみたいでh=new(hoge)がいるようだし、
h:=&hoge{}
だったらちゃんと動いた。

よく考えたら当然なんだけど、実際手で納得してみたので日記行き。