【Go】基本文法メモ①

# 概要

[A Tour of Go](https://tour.golang.org/)の順番に沿ってGoの基本で個人的に学習したことをまとめています。

| No | 記事 |
|------|---------|
|    1  |   __〜〜【Go】基本文法①(基礎)「今ココ」〜〜__|
|    2  |   [【Go】基本文法②(フロー制御文)](https://qiita.com/k-penguin-sato/items/31b45fd3914797b654f0)|
|    3  |  [【Go】基本文法③(ポインタ・構造体)](https://qiita.com/k-penguin-sato/items/62dfe0f93f56e4bf9157)|
|    4  |  [【Go】基本文法④(配列・スライス)](https://qiita.com/k-penguin-sato/items/daad9986d6c42bdcde90)|
|    5  |   [【Go】基本文法⑤(Maps・ Range)](https://qiita.com/k-penguin-sato/items/a320072fa09502bde3e9)|
|    6  |    [【Go】基本文法⑥(インターフェース)](https://qiita.com/k-penguin-sato/items/885a61d819cc431304f5)     |
|    7  |     [【Go】基本文法⑦(並行処理)](https://qiita.com/k-penguin-sato/items/5b09fa89d8d231bcdac8)    |
|    8  |    [【Go】基本文法総まとめ](https://qiita.com/k-penguin-sato/items/deaeab18aa416496e273)     |



# パッケージ
Goのプログラムは`package`によって成り立っています。
`import`内に必要な`package`を明示します。

```Golang
package main

import (
	"fmt"
	"math/rand"
)

func main() {
  fmt.Println("My favorite number is", rand.Intn(10)) // => My favorite number is 1
}

```
`package`は以下の様に個別にインポートすることもできます。

```Golang
import "fmt"
import "math/rand"
```

# Exported names(エクスポートされた名前)
Goでは最初の文字が大文字で始まるものは、外部パッケージから参照できる`Exported names`です。
例えば以下の`Pi`は`mathパッケージ`からエクスポートされたものです。

```Golang
package main

import (
	"fmt"
	"math"
)

func main() {
   fmt.Println(math.Pi) //=> 3.141592653589793
}
```

# Functions(関数）
関数は `０〜複数` の引数を取ることができます。
関数は以下のように定義されます。

```Golang
func  <関数名>([引数]) [戻り値の型] {
    [関数の本体]
}
```
__引数の後, 戻り値の値に型名を書く必要があります。__

```Golang

package main 

import "fmt"

func greetings(arg string) string{
     return arg
}

func main(){
   fmt.Println(greetings("Hello World")) //=> Hello World
}
```

### 引数の型の省略
関数が２つ以上の同種類の引数を伴う場合、以下の様に型の省略ができます。

```Golang
package main

import "fmt"

func add(x, y int) int {
	return x + y
}

func main() {
	fmt.Println(add(1, 2)) //=> 3
}
```

### 複数の返り値
Goの関数は複数の値を返すことができます。

```Golang

package main

import "fmt"

func multipleArgs(arg1, arg2 string)(string, string){
	return arg2, arg1
}

func main(){
  a, b := multipleArgs("Hello", "World")
  fmt.Println(a, b) // => World Hello
}
```
# Variables(変数)
varによって変数を宣言します。
関数の引数と同様に複数の変数の後に型を書くことで複数の変数を同時に定義できます。

```Golang
package main

import "fmt"

var var1, var2, var3 bool

func main() {
	var num int
	fmt.Println(num, var1, var2, var3) //=> 0 false false false
}
```

### 変数の初期値

変数宣言時に初期値を設定することができます。
初期値が与えられている場合、変数の型宣言は必要はありません。
その変数は初期化子が持つ型になります。

```Golang
package main 

import "fmt"

var str = "Go Programming Language"
var num = 2

func main(){
   fmt.Println(str, num) // => Go Programming Language 2
}
```

以下の様に複数の変数を同時に定義することも可能です。

```Golang
package main 

import "fmt"

var str, num, bool = "Go language", 23, true

func main(){
  fmt.Println(str, num, bool) //=> Go language 23 true
}
```
変数に初期値を与えないとゼロ値（Zero values)が設定されます。
(数値型には`0`、bool型には`false`、string型には`""(空の文字列)`が与えられます。

```Golang
package main

import "fmt"

func main() {
	var i int
	var f float64
	var b bool
	var s string
	fmt.Printf("%v %v %v %q\n", i, f, b, s) //=> 0 0 false ""
}
```
### 関数内での短い変数の宣言

__関数内__では`:=`を利用することでより短いコードで変数の宣言を行うことが可能です。
__※関数の外では`:=`を利用した変数宣言はできません。__

```Golang

package main 

import "fmt"

func main(){
   str := "Hello World"
   fmt.Println(str) //=> Hello World
}
```
### 基本型
Goの基本型（組み込み型）は以下の通りです。

```Golang
bool

string

int  int8  int16  int32  int64
uint uint8 uint16 uint32 uint64 uintptr

byte // uint8 の別名
rune // int32 の別名
     // Unicode のコードポイントを表す

float32 float64

complex64 complex128
```
`int`, `uint`, `uintptr` 型は、32-bitのシステムでは32 bitで、64-bitのシステムでは64 bitです。 特別な理由がない限り、整数の変数が必要な場合は`int`を使うようにしましょう。

### Type conversions(型の変換)
Goでは暗黙的な型変換は許されていないため、下記のような異なる型の変数への代入はエラーになります。

```Golang
var i int = 100
var f float64 = i  // cannot use i (type int) as type float64
```
型変換を行うには変数を丸括弧で囲み、手前に型名を書きます。

```Golang
var a uint32 = 1234567890
var b uint8 = uint8(a)
fmt.Println(b)  // 210（情報が欠落する）
```
# Constants(定数)
定数は、`const`キーワードを使用して宣言します。
定数は、`文字(character)`、`文字列(string)`、`boolean`、`数値(numeric)`のみで使えます。
__定数は`:=`を使用して宣言することはできません。__

```Golang
package main 
import "fmt"

const Num = 2

func main(){
	const Greetings = "Hello World"
	fmt.Println(Greetings) // => Hello World
	fmt.Println(Num) // => 2
}
```

# 参考
[My Journey of Go①](https://k-blog0130.herokuapp.com/posts/13)
[A Tour of Go](https://tour.golang.org/)
[型のキャストと、型アサーションによる型変換](https://maku77.github.io/hugo/go/cast.html)