もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

Go言語の勉強でありがたい指摘を頂いた

はじめに

前回のGo言語の勉強記事を書いた時、通知で例のブログSlackに流れるようになってるのですが、その場で、いろいろと指摘いただいたので、忘れないために、それをブログにまとめようと思いました。

消して記事数を稼ごうとしているわけではありません。

指摘事項

1. ローカル変数に関しては、型を指定できず、宣言も := で行う

どのスコープの話しているのかわかりませんが、ローカル変数でも型指定できますよ。

参考

他言語プログラマがgolangの基本を押さえる為のまとめ

これは、自分が勘違いしていたのですが、 := で指定するものが、ローカルの変数で、varを指定したものがグローバルな変数だと勘違いしていただけでした。

実際は、そうではなく、参考で記載されているとおり省略して書ける書き方として := があるみたいです。

fun main() {
    var data01 string = "ぼくはローカル変数だよ "

    data02 := "ぼくもローカル変数だよ varとか型宣言を省略できるよ"
}

2. package package_test というパッケージ名

`XXX_test`っていうパッケージ名は通常ビルドに含まれない特殊なパッケージ名なのでやめましょう。

参考

https://swet.dena.com/entry/2018/01/16/211035

パッケージ名_test をテストコードを記述するパッケージ名として利用することもできます。 パッケージ外に公開したAPIを通してのみテストしたい場合は、こちらを利用するとよさそうです。

まだ触ってなかったのですけど、Go言語でtestコードを書くためのtestingパッケージというのがあるらしいのですが、本来はそちらで使用されるべきパッケージ名で(XXX_test)というパッケージ名をつけるようです。

なるほどでした!

3. var data_array

Goでスネークケース書くのはやめましょう。フォーマッタでも怒られます。

参考

これからGolang開発を行うRubyistたちへ

Goでは、変数と関数は最初が大文字で始まるキャメルケースが使われています。

つまりUpperCamelCaseでかく必要があるってことのようです。

golintというのを入れて、実際にsnake_caseで書かれている変数を使用しているgoファイルをチェックしてみるとたしかにエラーが出ました!

$ golint struct.go 
struct.go:34:6: don't use underscores in Go names; var data_array should be dataArray

4. if player.is_die() == true {

bool関数の戻り値を比較するのはやめましょう。 `if player.is_die() {`でいいです(これはあまりGo関係ない

これが一番なるほどと思いましたw

これは自分の今お仕事している案件が、phpかつ、5.6系のプロジェクトであることに起因しているかもしれないなと思いました。

そもそもスカラ型の型指定がないphp5系のプロジェクトだと、自分は明示的に今回のように == true (phpの場合は === true)とつけて、確実にbooleanが返ってきてるよっていうのをコード上で示してあげる癖がついてました。

冗長だから必要ないという話もありますが、それよりも可読性のほうが重要かなと思ってそうしていました。

ただ、Go言語(phpも7系から)はそもそも戻り値の型の指定ができるのだから、booleanであることは明白なので、そもそも必要ないですよねということでした。

5. そこまで大規模に使うものでもないのかもしれません。

一応Goは大規模開発用(多人数開発用)に作られました(だから型があって予約語が少ない。formatterとかもろもろ標準装備されている) GAEとかLinuxじゃなくてGo製の疑似OS(gVisor)のコンテナーで動いてます。あとメルカリなどはPHP全部Goに置き換えてますね。

完全に僕の知識不足でしたw

終わりに

いろいろと指摘していただいて、とてもありがたかったです!

また、おすすめの本まで紹介してもらいました!

基本的なところを勉強した後、早速1冊購入してみようと思います!

また、このslackチームもいい循環ができていて、作ったかいがありました。

f:id:kojirooooocks:20181003145314p:plain

これからも頑張ろう。