Go言語を学習してみよう（２）：HelloWorldを見ていく

#はじめに
　[前回](https://qiita.com/manabu-watanabe/items/b25c4e2fe9b027b72da9)は、Go言語のインストールと、LiteIDEのインストールを行い環境を整えました。
　今回は、LiteIDEの使用の簡単な使い方を兼ねて、伝統のHelloWorldを標準出力に出力し、そこからわかる事を学習したいと思います。

#プロジェクトの作成
「ファイル」メニューから「新規」を選択します。
![LiteIDE_new_Project_01.png](https://qiita-image-store.s3.amazonaws.com/0/259433/49987a8f-8d97-f091-79f1-8474d538160a.png)


「新規プロジェクト/ファイル」ダイアログが表示されます。
デフォルトのソースファイルパス「GOPATH」（「C:\Users\[ユーザ名]\go\src」）、テンプレートは「Go1 Command Project」を選択します。名前は「HelloWorld」とし、「OK」ボタンを押下します。
![LiteIDE_new_Project_02.png](https://qiita-image-store.s3.amazonaws.com/0/259433/a826b10a-621d-7ac5-b612-bf9003516495.png)

このプロジェクトが作成される場所は、`[GOPATH]\src\[プロジェクト名前]`になります。
プロジェクトが作成された事と、読み込むかの確認メッセージが表示されますので、「はい」ボタンを押下します。
![LiteIDE_new_Project_03.png](https://qiita-image-store.s3.amazonaws.com/0/259433/48a92db2-04f2-9ea1-a06f-0f0e2c038dd9.png)

プロジェクトが生成されて、最初の雛形として今回の目的であるHelloWorldを出力するプログラムが作成されます。
![LiteIDE_new_Project_04.png](https://qiita-image-store.s3.amazonaws.com/0/259433/10eab943-7d7c-d1d8-4b6f-4e56262011c0.png)

LiteIDEの左枠にある。「1:フォルダ」をクリックします。「HelloWorld」フォルダが表示されますので、矢印（「＞」）をクリックして入ってるファイルが表示します。２つのファイルが存在しています。詳細は、それぞれのファイルは後ほど確認していきます。
- main.go ソースファイル
- doc.go ドキュメントソースファイル
![LiteIDE_new_Project_05.png](https://qiita-image-store.s3.amazonaws.com/0/259433/67946b5b-6b67-56cc-c294-ccdb5be26eb6.png)

#ビルド
プロジェクトを作成した時点で、「HelloWorld」が出力できる状態になっているので、これを使ってLiteIDEの動かし方を学習します。
最初に行うのはビルドです。

「ビルド」メニューから「build」を選択します。
![LiteIDE_build_01.png](https://qiita-image-store.s3.amazonaws.com/0/259433/7dca75cf-7346-8219-0f77-80e2a4e95d11.png)

ビルドが完了すると画面下部にビルドの状態が表示されます。今回のビルドは「成功」と表示されています。
また、先程表示したフォルダ内に「HelloWorld.exe」が作成されます。
![LiteIDE_build_02.png](https://qiita-image-store.s3.amazonaws.com/0/259433/c19fac6c-9fb3-9df5-dd1e-58a67ba59015.png)

#実行
「ビルド」メニューから「Run」を選択します。
![LiteIDE_build_03.png](https://qiita-image-store.s3.amazonaws.com/0/259433/7d6d64b8-10d3-2131-2ef9-fc1724090a67.png)

実行結果が画面下部に表示されます。
今回は「**Hello World!**」が表示されています、成功です。
![LiteIDE_build_04.png](https://qiita-image-store.s3.amazonaws.com/0/259433/c0994fa1-b5e2-6549-27cd-57af30186e9f.png)

#デバッグ
　LiteIDEのデバックモードを試したいと思います。

## 準備
　デバッカーを変更します。「デバッグ」メニューから「debugger/delve」を選択します。（初期の状態は「debugger/gdb」が選択されています。「gdb」が既に入ってる環境であれば「debugger/gdb」でも良さそうです。）
![LiteIDE_debug_01.png](https://qiita-image-store.s3.amazonaws.com/0/259433/ed81b685-bd9f-2fa5-6fc2-955773a37b69.png)

「debugger/delve」を選択後に、再度「デバッグ」メニューを表示すると選択状態が「debugger/gdb」から「debugger/delve」に変わっています。
![LiteIDE_debug_02.png](https://qiita-image-store.s3.amazonaws.com/0/259433/5873d5f5-b499-fa32-7626-d4cc72bc3abe.png)

##デバッグモード
　「デバッグ」メニューから「デバック開始」を選択します。
![LiteIDE_debug_03.png](https://qiita-image-store.s3.amazonaws.com/0/259433/f63284df-5bda-3996-5476-ad72af10b6c9.png)

「デバック開始」選択すると、8行目の「func main() {」の左側に緑矢印が表示されます。これが現在の実行行になります。また、フォルダ内に「HelloWorld.debug.exe」というファイルが作成されます。
![LiteIDE_debug_04.png](https://qiita-image-store.s3.amazonaws.com/0/259433/4a0b051f-0431-505d-e8f3-eb4cf46445f3.png)

##ステップ実行
　実行を１行単位で進めていきます。ステップ実行は「ステップ実行（入る）」と「ステップ実行（通過）」の２種類があります。それぞれの動きを9行目の「fmt.Println("Hello World!")」で確認します。

　実行行を8行目から9行目に移動させるには「デバッグ」メニューから「ステップ実行（入る）」、または「ステップ実行（通過）」のいずれかを選択します。この状態ではどちらを選択しても変わりはありません。
![LiteIDE_debug_05.png](https://qiita-image-store.s3.amazonaws.com/0/259433/e73ff003-e2de-f3ce-01d7-b0b488d8b342.png)

　実行行が9行目に緑の矢印が移動します。
![LiteIDE_debug_06.png](https://qiita-image-store.s3.amazonaws.com/0/259433/322cbf37-c200-25a7-f65a-e52300e8ddd6.png)

###「ステップ実行（入る）」
　実行行が9行目にある状態で、「デバッグ」メニューから「ステップ実行（入る）」を選択します。
![LiteIDE_debug_07.png](https://qiita-image-store.s3.amazonaws.com/0/259433/9487c518-068c-56c4-d15a-bd016323dbd9.png)

　新規に「Print.go」タブが追加され、263行目の「func Println(a ...interface{}) (n int, err error) {」に緑の矢印が移動しました。これはmain.goの9行目に記述されている「fmt.Println」関数のソースコードになります。この様に「ステップ実行（入る）」を選択した場合は、呼び出す関数のソースコードに実行行が移動します。（「Print.go」ファイルは、このプロジェクト内には存在しませんが、デフォルトでは「C:\Go\src\fmt\print.go」に存在しています。）
![LiteIDE_debug_08.png](https://qiita-image-store.s3.amazonaws.com/0/259433/864673fd-f94b-e20b-88fe-f23a2e8f41b8.png)

　「デバッグ」メニューから「続行」を選択し、デバッグモードを終わらせます。
![LiteIDE_debug_09.png](https://qiita-image-store.s3.amazonaws.com/0/259433/b55a1f82-5abe-54ea-92fe-051ac6560381.png)

　表示が再び「main.go」に戻り、実行行を表す緑の矢印もありません。
![LiteIDE_debug_10.png](https://qiita-image-store.s3.amazonaws.com/0/259433/7145013e-6309-000e-4b92-5ef4efee405f.png)

###「ステップ実行（通過）」
　先程と同じ様にデバッグ開始を実行しステップ実行を選択し、9行目まで進めます。

　実行行が9行目にある状態で、「デバッグ」メニューから「ステップ実行（通過）」を選択します。
![LiteIDE_debug_11.png](https://qiita-image-store.s3.amazonaws.com/0/259433/d5befd6e-b372-4103-b9c2-7da2a1f2b111.png)

選択すると先程の様にタブが開くこともなく、実行行が10行目に進みます。
![LiteIDE_debug_12.png](https://qiita-image-store.s3.amazonaws.com/0/259433/fbb0f2bd-c08b-2a21-cc17-2e18a604027e.png)


　この２つの使い分けとしては、関数の内部に入って確認する必要がある場合はステップ実行（入る）」を、必要がなく変数の値確認だけで良い場合などは、「ステップ実行（通過）」を使用します。

##ブレイクポイント
　デバッグする際に１行づつ進めるやり方で、対象行まで進めても良いですが、行数が多い場合など毎回１行づつ進めて行くのは手間がかかります。そこまで特定の行にブレイクポイントを設定し、そこまで実行行を進めるやり方を取ります。

　やり方は、確認したい行にカーソルを移動させ、オレンジの丸を押下します。（確認したい行、例えば変数代入を行っている箇所や、制御文の少し前にブレイクポイントを設定し、そこからステップ実行しながら確認すると効率よくデバック出来ます。）
![LiteIDE_debug_13.png](https://qiita-image-store.s3.amazonaws.com/0/259433/e5dcecf4-9fa5-bd3b-f891-0763fbfc7b4c.png)

オレンジの丸を押下するとブレイクポイントにとなりに、オレンジの丸が設定されます。
![LiteIDE_debug_14.png](https://qiita-image-store.s3.amazonaws.com/0/259433/9a22beac-7a4d-f910-afd9-274202828ae7.png)

「デバッグ」メニューから「デバックを開始」し、「デバッグ」メニューから「続行」を選択します。
![LiteIDE_debug_15.png](https://qiita-image-store.s3.amazonaws.com/0/259433/a523032f-fb94-52a4-1db1-cc429f55252c.png)

　実行行を表す緑の矢印がブレイクポイントを設定した行に移動し、実行行が移動した事を確認出来ます。
![LiteIDE_debug_16.png](https://qiita-image-store.s3.amazonaws.com/0/259433/ffaf0681-7257-1b4e-8755-b043210dc116.png)

　ブレイクポイントはいくつも設定できます。またブレイクポイントが不要になった場合は、不要になった対象の行にカーソルを移動させ、オレンジの丸を押下します。

## 変数の値の確認
　デバッグモード中は、変数の値を確認する事ができます。ソースの下にある「レコード同期」タブの隣に「変数」タブがあり、そこに必要に応じて変数と値が表示されます。（今回の例だとわかりにくいです。）
![LiteIDE_debug_17.png](https://qiita-image-store.s3.amazonaws.com/0/259433/28a0dde6-85d0-34c5-30cb-1b2ade035135.png)

　変数名や型、値も表示されます。
![LiteIDE_debug_18.png](https://qiita-image-store.s3.amazonaws.com/0/259433/e38ab9bb-88e3-ad91-b8a5-38892622331b.png)
　
#main.go ソースファイル
　自動生成されたソースを見ていきたいと思います。今回自動生成されたのは下記のコードです。

```go:main.go
// HelloWorld project main.go
package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hello World!")
}
```
　なお、Go言語のソースファイルの、文字コードは「UTF-8」で記述する必要があります。
　詳細に関しては下記を参考にして下さい。
　「[The Go Programming Language Specification:Source code representation](https://golang.org/ref/spec#Source_code_representation)」

##1行目:// HelloWorld project main.go
 コメント行です。Go言語ではコメントは、「//」以降がコメントになる行コメントと、「/\*」と「\*/」で囲まれたは範囲がコメントになるブロックコメントの２つが使用出来ます。

```go:main.go
// HelloWorld project main.go
```
 通常は１行で終わるコメントは「//」、複数行に渡ってコメントを記載する場合は「/\*」と「\*/」を使用します。1行目を「/\*」と「\*/」で書き換えた場合は以下のようになります。

```
/* HelloWorld project main.go */
```

##2行目:package main"
　対象のソースが属するパッケージを指定します。このソースでは「main関数」（エントリーポイント）が入ってるので「mainパッケージ」になります。「main」パッケージ以外ではmain関数を定義しても、実行形式のファイルは作成されません。また、「mainパッケージ」を指定して「main」関数がない場合はエラーになります。

```go:main.go
package main
```

##4行目～6行目:import ～
 「fmtパッケージ」をインポートしています。他のパッケージに属する関数を使用したい場合に使用します。今回は後ほどHelloWorldを標準出力に出力するため「fmtパケージ」を呼び出しています。その他の標準パッケージは[The Go Programming LanguageのPackages](https://golang.org/pkg/)を参照して下さい。

```go:main.go
import (
	"fmt"
)
```

　復数のパッケージをインポートする場合は、下記の様に記述します。

```
import (
	"fmt"
	"strings"
)
```

1行で記述することも可能です。

```
import "fmt"
```

##８行目、10行目:func main() ～
　このプログラムのエントリーポイントになります。プログラムが呼び出された場合、最初に呼ばれる関数になります。記述は必ず「func main()」になります。
「func」は関数で有ることを宣言し、「main」は関数名になります。続く「()」は、関数の引数を表します。この場合は引数無しです。また、関数は波括弧({})でくくられた範囲が関数本体を表します。

```go:main.go
func main() {
    :
    :
    :
}
```

##9行目:fmt.Println ～
　パッケージ「fmt」の「Println」関数を、引数に文字列の「Hello World!」で呼び出す宣言になります。ダブルクォート「"」で囲まれた値は文字列であることを表すので、出力にダブルクォートは出力されません。
　呼び出すと標準出力に「Hello World!」を出力することになります。

```go:main.go
	fmt.Println("Hello World!")
```

#doc.go ドキュメントソースファイル
　ソースファイルと同じ様に自動生成されたdoc.goファイルです。

```go:doc.go
// HelloWorld project doc.go

/*
HelloWorld document
*/
package main

```

　ドキュメントは以下の方法で確認出来ます。
　コマンドプロンプトから次のコマンドを実行します。（コマンドプロンプトは閉じないで下さい。）

```dos
>godoc -http=:6060
```
　ブラウザから「[http://localhost:6060/pkg/](http://localhost:6060/pkg/)」を開くと、パッケージ一覧に作成したパッケージが表示され、該当のドキュメントのファイルの内容が表示されます。
![LiteIDE_doc_02.png](https://qiita-image-store.s3.amazonaws.com/0/259433/bdd69ab5-225a-6c12-4e27-45a80bf2b9a3.png)

　詳細ページでは「main.go」のコメントも合わせて表示されます。
![LiteIDE_doc_03.png](https://qiita-image-store.s3.amazonaws.com/0/259433/93295db9-a495-e7c8-b497-0d0b0a2020d4.png)

#終わりに
　自動生成されたソースを動かして、これから学習して行く下地が出来たかなと思います。
　今後は関数や変数、制御文について学習していきたいと思います。パッケージに関するドキュメントは[The Go Programming LanguageのPackages](https://golang.org/pkg/)を見て、どういう事ができるかある程度知っておく必要がありそうです。また、プログラミングする際に変数名や関数名などの参考にしたいと思います。
　最後まで読んで頂きありがとうございました。勘違いなどあればご指摘、ご意見頂けると助かります。

#Go言語を学習してみよう
[Go言語を学習してみよう（１）：インストール](https://qiita.com/manabu-watanabe/items/b25c4e2fe9b027b72da9)