Golangを唐突に始めたい衝動に駆られた話

# 金曜日の深夜に急にGoを始めたい衝動に駆られた
## 思い立った経緯
金曜日の夜にふと人気プログラミング言語について閲覧していた。そこでPythonやJavascript不動の人気に、「はい、そうですか。」気分でみていた。そこでみたGoLangをみて、「あ、せっかくだし触りだけでも今日やろうかな」と思ったので、自分への議事録のため記事を投稿。

# やったこと
自分のPCでの動作環境構築と公式ドキュメントの「Packages, variables, and functions.
Learn the basic components of any Go progr」をやってみた

## 動作環境
OS:macOS Catalina 10.15.6
Editor:Visual Studio Code 1.47.3
pkg管理:Homebrew 2.4.9


## 環境構築
まずはGoLangのインストールから

```terminal
hoge@hoge-MacBook-Air ~ % brew install go
...省略...
hoge@hoge-MacBook-Air ~ % go version
go version go1.14.5 darwin/amd64
```

インストール完了だね。

## 動作確認
Visual Studio Code(以下VSCode)を起動して、必要な拡張機能をインストールする。
<img width="1351" alt="スクリーンショット 2020-08-01 3.21.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573960/2ea25c8d-ab38-0f3c-b6b3-0931d11f050c.png">

- Go
   - https://github.com/golang/vscode-go

だけをインストールしました。
そして、(Cmd+Shift+P)で全てのコマンドを表示し、以下を選択する。
<img width="698" alt="スクリーンショット 2020-08-01 3.26.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573960/7de7effe-ba34-6ba8-162b-141834a3482c.png">

- Go:Install/Update Tools

<img width="698" alt="スクリーンショット 2020-08-01 3.28.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573960/6286bf10-a664-0055-1405-0f14bd896bb7.png">

項目を全て選択し、インストールする。
インストール完了したら環境構築は完了となるので、実際にコードを試しに書いていく。

## サンプルコード実装と内容の理解
公式のページ(https://golang.org/ )にならって、以下のファイルを任意のフォルダで作成。

```hello.go
// You can edit this code!
// Click here and start typing.
package main

import "fmt"

func main() {
	fmt.Println("Hello, 世界")
}
```

そしてコンパイル実行を行う。

```terminal
hoge@hoge-MacBook-Air sampleGo % go run hello.go
Hello, 世界
```

問題なく実行確認が完了しました。
これでとりあえずの環境構築が完了としています。

## 公式ドキュメントを読んでいく
A Tour of Go(https://golang.org/doc/ )でドキュメントを読んでいく。
　
### Package & import
Goのプログラムはパッケージで構成されています。
Packageはmainから開始される。
下記のプログラムでは、"fmt"と"math/rand"をインポートしている。

```
package main

import (
	"fmt"
	"math/rand"
)
```

### Exported names
最初の文字が大文字で始まる名前は、外部パッケージから参照できるエクポートされた名前となっている。
パッケージをインポートしているとエクスポートしている名前は参照することができる。

```exported-names.go
// Piはmathパッケージでエクスポートされている
package main
import (
	"fmt"
	"math"
)
func main() {
	fmt.Println(math.Pi)
}
```

### function
関数は０個以上の引数を受け取れる。

### Named return values
Goでの戻り値となる変数に名前をつけることができ、ただし、名前をつけた戻り値の変数（以下のxとy）についてはreturn ステートメントに何も書かずに戻すことができ、このことをnaked returnという。推奨は使わない。

```named-results.go
package main

import "fmt"

func split(sum int) (x, y int) {
	x = sum * 4 / 9
	y = sum - x
	return
}

func main() {
	fmt.Println(split(17))
}

```

### variables
基本的には「var XXX = X」の形で宣言を行うが、関数ないだけ「XXX := X」と暗黙的な型宣言ができるが、関数の外ではエラーとなる。
基本型と初期値については以下の通り。

```
bool
    デフォルト初期値:false
string
    デフォルト初期値:""
int  int8  int16  int32  int64
uint uint8 uint16 uint32 uint64 uintptr
byte // uint8 の別名
rune // int32 の別名
     // Unicode のコードポイントを表す
float32 float64
complex64 complex128
    デフォルト初期値:0
```

### Type conversions
Go言語では明示的な変換が必要で、以下のような形でおこなう。
もし、明示的な型を指定せずに変数を宣言する場合は、変数の右側から型推論がされる。

```
// 通常
var i int = 42
var f float64 = float64(i)
var u uint = uint(f)

// シンプルに
i := 42
f := float64(i)
u := uint(f)
```

### Constants
定数はconstキーワードを使って変数と同じように宣言を行う。
定数は、文字(character)、文字列(string)、boolean、数値(numeric)のみで使えます。
なお、定数は := を使って宣言できません。

## 最後に
今日はここまでやったので、また衝動に駆られた際に続きをやっていこうかと。
よい気晴らしになりました。新しい言語を学び始めるとどっぷりハマってしまうので、
また忘れた頃に続きを別記事で更新します。