Tagbangers Blog

Golangってそういうこと!?

どうも、ポケモンGoで検索してたどり着かれたみなさんもこんにちは!

 

あまりに虫歯が痛すぎて会社を休もうとして上司の山﨑を困らせる部下の山﨑です。

歯磨きはちゃんと毎日しているのですが、複雑な奥歯環境で育った事によりこんな事に。

歯医者で見たこと無い太さの注射を挿されて【お話できません】な事をされてしまいました。

もうお嫁にいけません。

皆さんもカレーの飲み過ぎにはお気をつけくださいm(_ _)m


さて、今回はGoogleが開発しているGoを少しだけ触ってみたので、それについて書いてみようと思います。


①環境構築

まずはここからですよ。

環境はMacとHomebrew前提で書いていきます。


Goをインストール

brew install go

本格的に開発する場合はgoenvをインストールすると、Goのバージョンを複数持てるようになるようですが、とりあえず遊ぶ分にはよいかなと思います。 


PATHを設定

echo export GOPATH=【ソースを管理したいディレクトリ】 >> ~/.bash_profile
echo export PATH=$PATH:$GOPATH/bin >> ~/.bash_profile
source ~/.bash_profile

調べると、GOROOTというのも.bash_profileで上書設定している人もいるようですが、brew install goの時点でデフォルトは設定されているらしく、特に理由が無い限り変更する必要はないようなので敢えて設定しません。


IntelliJ IDEAでさわれるようにプラグインをインストール

IntelliJを開き「Configure」→ 「Plugins」→ 「Go」で検索 → 「install」をクリック

後は「Create New Project」から「Go」を選択すればプロジェクトの作成完了です。

簡単でした。IntelliJつよい。

これで環境の構築は全て終わりました。

次回は、桃太郎の元ネタになった説話と、桃太郎には実は姉が存在していた点について書いてみようと思います。

寒くなってきましたね。皆さん暖かくしてお過ごしください!

 

良いお年を!

 

②いやちょっとくらいコード書きなさいよ な方のために

package main

import (
   "fmt"
   "math/rand"
   "strconv"
   "time"
)

func main() {
   var greetingPettern1 string = "こんにちわ世界ですよ"
   // greetingPettern2 := "型宣言はしなくても型推論してくれますよ"
   // でも静的型付き言語なのでJSみたいに一度決めた型と違う型の値は代入できませんよ.
   // greetingPettern2 = 123 // NG
   println(greetingPettern1)
   println("")

   // 変数と見分けつかないので苦し紛れにスネークケースにしようとすると
   // [Use camelcase instead of snake case] てな感じに怒られますよ.
   const randomIntLen = 5

   // 配列じゃないよsliceだよ.[]の中に[3]とか要素数入れると配列になりますよ.
   // sliceおじさんは配列っぽいけど内部的に作られた配列のポインタを保持してるだけなので気をつけて扱いますよ.
   var randomIntArr []int

   // ループはforのみですよ.でもforだけでwhile的な事もできるので特に問題なさそうですよ.
   for loopI := 0; loopI < randomIntLen; loopI++ {
      randomIntArr = append(randomIntArr, createRandomIntNum())
   }

   loopJ := 0
   // なんで1回sliceとforはさんだのってツッコミに返す言葉がありませんよ.
   // そんでwhile的な事してみますよ.
   for loopJ < len(randomIntArr) {
      randomIntVal := randomIntArr[loopJ]

      if randomIntVal%3 == 0 {
         fmt.Println(strconv.Itoa(randomIntVal) + " が3の倍数だからもう帰るんだ.")
         // 正体不明の古代兵器 GOTO によってループの外へ飛ばされる
         goto outputted
      }

      if randomIntVal%2 == 0 {
         fmt.Println(strconv.Itoa(randomIntVal) + " は 偶数なんだ")
      } else if randomIntVal%2 == 1 {
         fmt.Println(strconv.Itoa(randomIntVal) + " は 奇数なんだ")
      }
      loopJ++
   }

outputted:
   fmt.Println("")
   fmt.Println("以上なんだ.")
}

func createRandomIntNum() (randomInt int) {
   // 乱数作りますよ. Seed設定しときましょうね
   rand.Seed(time.Now().UnixNano())
   randomInt = rand.Int()

   // return すると戻り値に設定した変数が返されますよ.
   // ちなみに戻り値はなんと複数可ですよ.
   return
}

コメントが多すぎてコードが見にくい、という声が画面の向こうから聞こえてきます。コメント残さないと死んでしまう病気なのです。ごめんなさい。

あ、変数類の命名もダメですかすみません今勉強中です。


実行方法はこんな感じです。普通ですね。

環境設定の項目で書いた$GOPATHを利用します。

go run $GOPATH/【ソース名】.go

 

以下、書き方はコード中にコメントしてあるので、コメントと被る所もありますが少し書いてみた感想です。

  • 変数はvarで宣言できます。
  • varで宣言していてもなんか型の宣言もできます。なんかできます。しなくてもいいです。
  • 変数の型は宣言せずに直接値を初期化した場合、型推論されます。
  • 型推論されますが、JavaScriptのように動的に型を変更する事はできません。一度思い込んだら考えを曲げない頑固オヤジです。
  • それじゃ定数と変数の区別がつかないじゃないの、という方。苦し紛れにスネークケースにするとキャメルケース使ってねと怒られます。
    実際に開発を行う場合は何かの規約を作って運用するしかなさそうです。
    IntelliJなら色分けして表示してくれるんですけどね。
  • 配列を扱うArrayとは別にsliceという概念があります。配列を継ぎ接ぎして配列っぽく見せるもののようです。
    実際には内部的にArrayを生成したり、別のArrayを参照していたりと、ちょっと厄介そうな奴です。
  • ループはfor文があります。while?until?そんなのなうでやんぐなGoには必要ありません。for文でそれっぽい事ができます。
    じゃあwhile書けても別にいいじゃん!!と思わなくはないです。
  • 関数は、「func 【関数名】(【仮引数】【型】) (【戻り値の変数名】【戻り値の型】) { 【処理】 }」てな風に書きます。
    箇条書きだとわかりにくいのでコードを見ていただきたいです。あっ、コードも(以下略
  • なんと関数は複数の戻り値が設定できます。こいつぁすげえや。
  • gotoに対応するラベルが設定できますよ。コード中の「outputted:」がそれです。
    whileやuntilはないのに、でもgotoはあるんですよねえ。Goってそういうこと!?
  • 全体的に調べものをする時は「Go 始め方」なんて調べるとポケモンGoが出てくるので、検索時は「golang」で調べると吉です。

③ビルドしてみる

ここで思い出したように唐突にビルドしてみます。思い出したんです。そういえば書いてなかったなって。

こんな感じです。runがbuildになっただけですね。

go build $GOPATH/main.go


実行方法はこのように。

$GOPATH/main


実行結果:

********:src shigekazu$ $GOPATH/main
こんにちわ世界ですよ

8390800790196666670 は 偶数でしたよ
1969014525006297947 は 奇数でしたよ
8656324258250576519 は 奇数でしたよ
8297054190925739946 が3の倍数なので帰ります.


以上でした.


こんな感じでした。乱数が偶数か奇数か教えてくれて3の倍数の時は途中で処理やめちゃう超画期的かつセンセーショナルなプログラムを作りました。もうちょっと何かなかったものかと少し反省しています。

 

という具合で、今回は少しGoを触ってみたので調子に乗って記事を書いてみました。

 

最近社内ではすっかり暖房をつける事が多くなりましたが、

皆さんのご自宅でもそろそろ暖房やヒーターを使いだした頃ではないでしょうか。

なので私は今月も毎日半袖です。冬ってなんだかんだと言いながらも電車やオフィスの中は凄まじい暑さだったりしますもんね。

しかし冬も半袖でいようの精神は社内では少数派らしく、不審者のような扱いを受ける毎日です。

 

それでは、皆さんも乾燥や寒暖差にお気をつけてお過ごしください!