Goのポインタを使ったinitializeで詰まった話(結果:ドキュメント読もう)
2015·12·26
珍しいちょっとしたtips
今宵の月はどうでしょう。こんばんは、@CreatorQsFです。
最近Goは来てますね。vimも来てるんですが、どういうわけかなんだかその現状を批判するのが流行りそうな雰囲気。僕はこの先馬鹿にされてもvimを使い続けます。
今日は、あほらしい、一年間ぐらいGoをやってきたとは思えないところでつまづいたので、それを自分への戒めとして、また誰かのために、ここに書きたいと思います。
事の発端はこんな感じのコード
で、実はこれ動かしてもらえばわかるんですが、panicエラーになるんです。The Go Playground
このpanicエラーは配列の未定義の部分にアクセスしようとしたりすると起きるのですが、僕はforとrangeで回しているので、大丈夫と思っていました。要するに配列はこの場合0 indexは存在するはずなんです。で、最初、プログラム内でやっている時はappendしている時に何かあるな、と思っていました。
ちなみに今はこれただの変数ですが、私がやっていたのは構造体側だったので、varを使ったわけなんです。
ですが、どうやってもpanicエラーが起きるので、仕方なくこのようにコードを変えてみました。
動かすとこんな感じです。http://play.golang.org/p/F3iaFhbMgG
これでお分かりいただけるでしょう。appendなどには何の問題もなくて、var initalize事態に問題があると。
でもこっちのコードはうまく動くんですよね…。
またこれも。
なるほど、どうも、pointerの配列の定義は何かあるらしい。とやっとここで気づいて、というか教えてもらって([SOLVED] Would Anyone explain why is this be error? http://play.golang.org/…)
var s *[]int is a pointer to an array while var s []int is the array itself. Golang initializes variables to the 0 value. For the pointer that’s nil the concrete array is an empty array.
とあるように、そうなんです。Goのpointerでのinitalizeした後の要素は常にnilに成るらしいのです。
これを知らないって、一体お前はGoで何をしてきたんだよ…って言われそうですが、ここで初めて、前に誰かが書いてたGoらしい書き方を思い出しました。というかいつもは基本それでしか書いてなかったので、気がつかなかったんです…。
http://play.golang.org/p/JrJpG3HGWu
結論:ドキュメント読もう
以上、Go初心者の詰まったところ、でした。G+のGo+コミュニティは以前もお世話になっていて、すごいありがたいです。Goをやっている方はオススメです!!
おわり