Golang基礎 + MacにGoをインストール

#はじめに
####Golang又はGo言語　とは
・コンパイル言語の中でも特に処理が高速
・2009年にGoogle開発された
・シンプルな構文
・コードの可読性が高い
・初心者はpythonやphpやRubyからのが良い

勉強中なので間違っていたら教えてください。

##開発環境
Visual Studio Code
Mac

##Goのインストール
***ターミナルで実行してください***
1.　homebrewを最新にします

```
＄ brew update
```

2.　Goのインストール

```
＄ brew install go
```

3.　Goがインストールされたか確認バージョンが返ってくればOK

```
＄ go version
```

###プログラムの基本構造

###順次進行
上から順に処理していく
###条件分岐
特定の条件の時にAかBなどに分岐する
###繰り返し
決まった回数や条件に当てはまる間は繰り返す


###Goの記述方法

```例)test.go
package main ←Goのプログラムは1つはmainに属している必要がある
import ("fmt")　←fmtパッケージをインストールしてる

func main(){ 　←関数を記述　mainからスタートする
   fmt.Println("hello") ←これはfmtパッケージを用いてhelloを表示する
}　波かっこ内はブロックという
```

Goのプログラムはなんらかのパッケージに属している必要があります

実行するにはターミナルに


```
＄ go run ファイル名.go
上記の例だと
$ go run test.go と記述
```
これでhelloが表示されます。

###変数の宣言仕方


```例)test.go
package main 

func main(){ 　
　　var num int ←(var 変数名 型）
   num = 1　←1を代入
   fmt.Println(num) 
}
```

実行すると1が表示される

宣言の省略すると

```例)test.go
package main 

func main(){ 　
　　num := 1　←宣言の省略書き方
   ↑は　var num int ←(var 変数名 型）
   　　 num = 1 この2行と一緒　
   fmt.Println(num) 
}
```
実行すると1が表示される

###Goのデータ型
int　整数
float64 小数
string 文字列
bool turnかfalseが入る

###配列の宣言
変数 := [要素数]データ型{データ1、データ2、...}

```例)test.go
package main 

func main(){ 　
　　a := [3]string{"sasa","sumika","takako"}　←配列の宣言
   fmt.Println(a[0])
   fmt.Println(a[1]) 
   fmt.Println(a[2])
}
```

実行すると
こうなります

```
sasa
sumika
takako

```
配列の要素数の省略、変更

```例)test.go
package main 

func main(){ 　
　　a := [...]string{"sasa","sumika","takako"}　←配列の宣言[...]で要素数を省略できる
　　a[0] = "aki"
   fmt.Println(a[0])
   fmt.Println(a[1]) 
   fmt.Println(a[2])
}
```
実行するとsasaがakiに変更されています

```
aki
sumika
takako

```

###条件分岐

```例)test.go
package main 

func main(){ 　

 if a := 0 ; a >= 20{
     fmt.Println("20以上")
 } else if a == 0{
     fmt.Println("0です") 
 } else {
     fmt.Println("条件以外")
}

```

実行すると以下が表示されます。

```
0です
```

###繰り返しfor

for 変数 := 初期値; 条件; 増減式{}

```例)test.go
package main 

func main(){ 　

for i := 0; i<=4; i++ {
   fmt.Println(i)
}

```

実行すると以下が表示されます。

```
0
1
2
3
4
```

###関数定義

func 関数名(引数の定義なくても良い){
retuen ←戻り値がいるなら
}

```例)test.go
package main 

func say(){ ←引数なし
  fmt.Println("hello")
}

func say1(say string){　←引数あり (変数　データ型)
 fmt.Println(say)
}

func say2(x,y int) int {　←引数戻り値1つあり (変数　データ型)　戻り値のデータ型{
 return (x+y)
}

func say3(x,y int) (int, int) {　←引数戻り値2つあり (変数　データ型)　戻り値のデータ型{
 return (x+y), (x-y)
}

func main(){
 say() ←引数なし
 say1("hi") ←引数あり
 result := say2(5,3) ←引数戻り値1つあり
 fmt.Println(result)
 result2, result3 := say3(5,2) ←引数戻り値2つあり
 fmt.Println(result2, result3)
}
```

実行すると以下が表示されます。

```
hello
hi
8
7 3
```

###構造体を定義
type 構造体名　struct {
フィールド
}

```例)test.go
package main 

type Dog struct { ←構造体
 name string
 age int
}

func main(){ 
 var s Dog ←構造体の初期化　（var 変数名　構造体名） 
　s.name = "poko"
  s.age = 5

省略バージョン上記と同じ意味
s := Dog{"poko",5}

一部部分に代入
s := Dog{name: "poko}
又は
s := Dog{age: 5}
  
 fmt.Println(s)
}
```

実行すると以下が表示されます。

```
{ poko 5 }
```

###メソッド

```例)test.go
package main 

type Dog struct { ←構造体
 name string
 age int
}

func (s Dog) aa() { ←メソッドと構造体を関連付け　（変数　構造体名) 変数() {
   fmt.Println(s.name,s.age)
} こうする事で、構造体にアクセスできるようになる。
s.nameは構造体Dogのnameにアクセスして情報を取得できる

func (s Dog) aa2(name string, age int) { ←引数あり
   fmt.Println(name,age)
}

func (s Dog) aa3(age int)  int { ←引数あり戻り値あり
   return age*2

func main(){ 
 a1 := Dog{"poko",5}
 a1.aa() ←引数なし
 a1.aa2("domu",6) ←引数あり
 result := a1.aa3(2) ←引数あり戻り値あり
 fmt.Println(result)
}
```

実行すると以下が表示されます。

```
poko 5
domu 6
4
```