初めてアクセスされる場合、フォントのダウンロードを行いますのでページのロードが極端に遅い場合がございます。ご了承ください。

de-liKeR Logo

About Medium Contact

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事態に問題があると。

でもこっちのコードはうまく動くんですよね…。

The Go Playground

またこれも。

The Go Playground

なるほど、どうも、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をやっている方はオススメです!!

おわり