構造体とポインタの話
まあ、あたりまえっちゃあたりまえなんだろうけど、一応確かめておこうと思ったこと。
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{}
だったらちゃんと動いた。
よく考えたら当然なんだけど、実際手で納得してみたので日記行き。