Golang 入門 #1

## <font color="#7fd5ea">Golangとは</font>

[公式ドキュメント](https://golang.org/doc/) に書いてあることをまとめると、Golangとは...

* オープンソース
* シンプルな言語仕様
* 並行プログラミングに強い
* コンパイル型言語
* コンパイルや実行が速い

2021年3月の時点でGolangの最新バージョンは [1.16](https://golang.org/doc/go1.16)
Go1.16 は、macOS 10.12 Sierraで実行される最後のリリースになっており、Go1.17 ではmacOS 10.13 HighSierra以降が必要になる。

## <font color="#7fd5ea">Goの需要</font>

まず国内におけるGoの需要はどうだろうか
TECH Street（テックストリート）によるアンケートの調査結果は次の通り
Goは国内における需要は増えているという話は聞きますが、Perlと同じ15位にランクイン
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33505/a5e36ab8-5a43-f675-0515-dc54311cc8d4.png" width=50%>
引用元） [ITエンジニアが 2021年に学びたい（強化したい）プログラミング言語ランキング](https://www.tech-street.jp/entry/research-2021programminglang)

では国外、ワールドワイドでのGoの需要はどうだろうか
PYPLの2021年3月時点での去年と比較したランキングは次の通り
去年から伸びてなくね？
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33505/9457deef-128c-2499-957e-a9d6a4a533da.png" width=50%>
引用元） [PYPL PopularitY of Programming Language](https://pypl.github.io/PYPL.html)

Go大丈夫なのか
　：
　：
安心してください
同じくPYPLが公表している人気言語ランキングでは、ついにRubyとも逆転し、他の言語が下がる中Goは確実に伸びていることがわかります。
![chart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33505/da71f463-cad5-2336-da83-6f8f776349a1.png)

これで安心して、Goを勉強できますね！

## <font color="#7fd5ea">最初に手をつけたところ</font>

どの言語にも言えますが、まずは言語の特徴を知るところから始めます。

### <font color="#008cff">はじめてのGo</font>
https://gihyo.jp/dev/feature/01/go_4beginners

技術評論社の開発者向けGo特集の記事、Go1.3にフォーカスしているので少し古いですが基本となる学習に関しては問題ありません。
各章では次の内容がソースコード付きでわかりやすく説明されています。

* 第１章では「Go言語の特徴と環境構築」について
* 第２章では、Goの特徴である「シンプルな言語仕様や型システム」について
* 第３章では「構造体やインターフェース」について
* 第４章では、標準パッケージで「JSON、ファイル、HTTP、HTML」を扱う
* 第５章では、スレッド「ゴルーチン（Goroutine）」、並行実行されるごルーチン間でデータのやり取りをおこなう「チャネル（channel）」について

### <font color="#008cff">A Tour of Go</font>
https://go-tour-jp.appspot.com/list

[A Tour of Go](https://tour.golang.org/list)を日本語訳したものです。変数の宣言方法や関数の呼び出し方、基本となる言語構造から、メソッドやインターフェース、Goの特徴である「ゴルーチン（Goroutine）」と「チャネル（channel）」について学ぶことができます。
ただし、丁寧に書かれているわけではないので、初学者向けではなかったのかもしれません。

### <font color="#008cff">Go Web プログラミング</font>
https://astaxie.gitbooks.io/build-web-application-with-golang/content/ja/

Go言語の基礎 〜 Webアプリケーションに対する実装例をコードを添えて解説してくれています。またセキュリティから暗号化など幅広く、もしGoでWebアプリケーションを開発することを考えているなら、このサイトは見ておくべきです。

## <font color="#7fd5ea">シンプルな言語仕様や型システム</font>

Goは次が基本となっています

* セミコロンなし
* try-catchがサポートされていない

### <font color="#008cff">変数</font>

Goは変数を `var` で定義します

```go
// Goでは型を変数の後に置きます。ここでは string型の text という変数を宣言しています。
var text string

// 複数の変数も定義できます。
var text1, text2 string
```

変数の初期化は次の通りです

```go
// 宣言した型の後に初期化します
var text string = "message"

// 複数の変数を同時に初期化できます
var text1, text2 string = "message1", "message2"
```

Goでは短縮宣言 `:=` も用意されています

```go
// := の記号は var と 型 に変わるものです。
text1, text2 := "message1", "message2"
```

ただし短縮宣言は関数の内部でしか使用できません。関数の外から使おうとするとコンパイルが通らなくなります。そのため、一般的には `var` をグローバル変数として定義します。

### <font color="#008cff">定数</font>

いわゆる定数、オワリ

```go
// 他の言語と似たような宣言方法
const name = "keyword"

// 型を明示できます
const name string = "keyword"
```

### <font color="#008cff">型</font>

#### Boolean型

```go
// デフォルトは false
var isBool = true
```

#### 整数型と小数型

```go
// 整数、Goは int 以外にも uint もサポートしています。
var x int = 1

// 小数、float型はないです、float32とfloat64の二種類で、デフォルトはfloat64
var y float64 = 1.234
```

#### 文字列型

```go
// Goの文字列はすべてUTF-8
var text = "message"

// バッククォートを使うと\rや\nなど、改行コードを含めることが出来ます
var text = `message`
```

#### エラー型

```go
// 他の言語でいうと Exception に近いですかね
err := errors.New("エラー")
```

#### グループ化

```go
// 複数の型違いの変数を同時に定義
var (
  c int
  d string
)

// 定数も同じくグループ化できます
const(
    i  := 100
    pi := 3.1415
)
```

#### 配列型

```go
// int型の配列
var arr [10]int

// 要素は 0 からスタート
arr[0] = 1
arr[1] = 2

// 初期化も宣言できます
a := [3]int{1, 2, 3}
```

#### スライス型

`slice`はいわゆる「動的な配列」で、参照型のデータになります。

```go
// arrayの宣言と同じだが、長さの宣言は不要
var slice []int

// 初期化
slice := []int {1, 2, 3}
```

#### マップ型

```go
// keyは文字列(string)、valueは整数(int)
var numbers map[string]int
numbers["one"] = 1
numbers["two"] = 2

// 初期化することもできます
numbers := map[string]int{"one":1, "two":2}
```

#### ポインタ型

```go
a := 5

// int型を格納する領域を準備
var pa *int
// ポインタの割り当て
pa = &a
```