【Golang】 開発環境設定〜HelloWorldまで

来年転職する会社でgolangを使うとのコトで、少しでも慣れておこうと勉強はじめました。

なお、私のgolangの勉強は、基本的に「[スターティングGo言語(松尾愛賀 著)](https://www.amazon.co.jp/%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0Go%E8%A8%80%E8%AA%9E-CodeZine-BOOKS-%E6%9D%BE%E5%B0%BE-%E6%84%9B%E8%B3%80/dp/4798142417/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2A1R4MA4F6Q67&keywords=%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0go%E8%A8%80%E8%AA%9E&qid=1573571940&sprefix=%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0Go%2Caps%2C262&sr=8-1)」に書かれているコトに基づいて進めていきます。

##0.Golang is 何？

>Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.

(golang公式(golang.org))

###(1)開発者
Google社によって開発され、2009年に発表された

###(2)特徴
####①ネイティブコードへのコンパイル
Javaなどのように、各実行環境の差異を吸収するVMを利用せず、ネイティブコードで実行ファイルを出力。
　→実行速度の面で有利
####②マルチプラットフォームで動作
標準の開発環境で、OSやCPUの違いをほぼ意識せず、いずれにも対応したプログラム開発が可能。
　→開発コストや、保守性の面で有利
####③OSへの非依存
各OSが持つ標準的なライブラリにすら依存せず、そのライブラリが持つ機能をGo言語自体の中に持っている。結果、OSやライブラリの種類や変化に依存しない開発が可能。
####④ガベージコレクター
ガベージコレクターをサポートすることで、メモリ操作で発生しうる問題を予防。

(すこし調べてみて、ガベージコレクターにも深い世界があるらしいことが分かった。Go言語のガベージコレクターはシンプルかつ有用らしいので、機会があればこの点についても掘り下げたい)
####⑤並行処理
「channel」と「goroutine」による、シンプル、安全かつ効率的な並行処理のプログラミングが可能。
※この点は現時点ではまったくピンとこないので、この先学習を進めていくなかで掘り下げる

#####(ちなみに)並行処理と並列処理について
[並列計算(Wikipedia)](https://ja.wikipedia.org/wiki/%E4%B8%A6%E5%88%97%E8%A8%88%E7%AE%97)


##1.開発端末
macOS mojave(ver.10.14.6)のMacbookPro

##2.環境構築
Homebrewを設定済なので、homebrewコマンドでgolangのパッケージをインストールします。
なお、上記の書籍に従うと公式からパッケージファイルをダウンロードして実行するやり方が載っていたんですが、`go`コマンドをnot foundではじかれて、「動くようにいろいろ設定いじるのめんどくさい・・・」となってしまったので、Homebrewでの再インストールにしました。

```terminal

$ brew install go

```

IDEについては、ここでは一旦使用しないまま進めます。
転職先に問い合わせれば、何を使っているかは教えて貰えるでしょうが、
今は普段使ってるエディタ(cotEditor)でソース編集を行うコトにします。

###utf-8エンコーディングできるエディタを使用すること！！
パッケージのインストールと、テキストエディタがあればgolangの開発は可能なようですが、golangはテキストエンコーディングをutf-8のみに限定しているため、使用するエディタはその点は最低限備えている必要があるようです。

##3.HelloWorld
###(1)ミニマルなソース

```go:helloworld.go

package main;

import (
	"fmt"
);

func main() {

	fmt.Println("Hello World!");

};

```

###(2)実行

```terminal

$ go run helloworld.go

```

###(3)実行結果

```terminal

Hello World!

```

##4.Golangのお約束事
###(1)エントリーポイント
Golangでは、エントリーポイント(プログラム実行の始点)は、`main`パッケージ内の`main`関数と定められている。

###(2)package
Golangでは、packageで記載できるのは、ソース１ファイルにつき、パッケージ１つのみ。
別のパッケージとしたい場合は、ソースファイルを分ける。
逆に、同じパッケージであれば、１ファイルにまとめられる。
（同じパッケージでも、別ファイルとすることはできる）

###(3)import
Golangでは、参照されないパッケージのimportがある場合、コンパイルエラーとなる。

※ただし、パッケージの参照チェックを行わない書き方(`_(アンダーバー) パッケージ名`)をすることで、このエラーを回避することもできる

```go:sample.go

package main;

import (
    /* 参照チェックなしのimport */
    _ "fmt"
);

func main() {
    /* 何もしない */

    /* でもコンパイルエラーにならない */
};

```

###(4)コメント
Golangでは、`/* コメント */`や`// コメント`のようにして、コメントを記述することができる。
ただし、以下のようにコメント内にコメントを記述することはできない(コンパイルエラーになる)。コメント内に行コメント、はOK。

```go:sample2.go

package main;

import (
    "fmt"
);

func main() {

    print("sample");

    /* コメント

     /* コメント内のコメント <- エラーになる */

     */


    /* コメント

     // 行コメント行ならOK

     */

};

```

ハイライトが付くと、外側のコメントの終点が、始点と紐付かずに浮いてしまっているのがよく分かります。

###(5)セミコロン
Golangでは、行末にセミコロンを記述しますが、「すべて省略可能」であるため、2.(1)で記述したソースを、以下のように記述しても同様に動作します。

```go:helloworld.go

package main

import (
	"fmt"
)

func main() {

	fmt.Println("Hello World!")

}

```

Swiftでセミコロンを記述しない記法になれている私としては、この言語仕様はありがたいです。

###いったんここまで。

また勉強が進んだ分、追記＆別エントリの投稿していきます。