Golang チュートリアル その１

##概要
「処理が速い」「並行処理」が得意ということから、
今後大規模webサービスなどで重宝されると思いましたので、
学習していきたいと思います。

##参考サイト
以下を実施してみました。

[Welcome to a tour of Go](https://go-tour-jp.appspot.com/list)

##環境
GoogleChrome
※ブラウザ操作だけで学習できるため、エディタを用意する必要がありません。
※CentOS8へのGoインストール手順です。よろしければ、ご活用ください。
[CentOS8へのGo言語インストール手順](https://qiita.com/tomotomo3/items/38e7fed248278a3295b9)

##基本操作

[Welcome!](https://go-tour-jp.appspot.com/welcome/1)

Hello Worldの実行手順です。

##基本的な書き方

[Packages, variables, and functions.](https://go-tour-jp.appspot.com/basics/1)

Go プログラムの基本的なコンポーネントを学びます。

 - 「package main」から始まる。
 
すべてはここから始まる

 - 関数について
 
引数に設定する関数には、型名を書く必要がある

```go
//xとyが該当
func add(x int, y int) int {
	return x + y
}
```

ただし、関数の２つ以上の引数が同じ型である場合には、最後の型を残して省略して記述できる。

```go
//xとyが該当
func add(x, y int) int {
	return x + y
}
```

 - 関数は複数の戻り値を返すことができる
 
```go:func.go

package main

import "fmt"

//関数側
func swap(x, y string) (string, string) {
        return y, x
}

//呼び出す側
func main() {
        a, b := swap("hello", "world")
        fmt.Println(a, b)
}

//実行
go run func.go

//実行結果
world hello
```

 - 戻り値となる変数に名前をつける

戻り値となる変数に名前をつけることができる。
戻り値に名前をつけると、関数の最初で定義した変数名として扱われます。

名前をつけた戻り値の変数を使うと、 
return ステートメントに何も書かずに戻すことができる。
※長い関数で使うと読みやすさ( readability )に悪影響があるため、
　注意が必要。

```go:returnValueName.go

package main

import "fmt"

//(x, y int)の部分が名前付き変数
func split(sum int) (x, y int) {
	x = sum * 4 / 9
	y = sum - x
	return
}

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

//実行
go run returnValueName.go

//実行結果
7 10
```

##変数

 - 変数の宣言

「var」ステートメントで変数の宣言を行う。
パッケージ、または、関数で利用できる。

```go:var.go

package main

import "fmt"

//グローバルに宣言 ※boolが型
var c, python, java bool

func main() {
	var i int
	fmt.Println(i, c, python, java)
}

//実行
go run var.go

//実行結果
0 false false false
```

 - 変数に初期値を与える
 
初期値が与えられている場合、型を省略できる。
その変数は初期値が持つ型になります。
※例: 数字->int , 文字列->stringなど

```go:giveVarInitialValue.go

package main

import "fmt"

var i, j int = 1, 2

func main() {
	//c->bool ,python->bool ,java->string
	var c, python, java = true, false, "no!"
	fmt.Println(i, j, c, python, java)
}

//実行
go run giveVarInitialValue.go

//実行結果
1 2 true false no!
```
 - 変数の宣言を省略

関数の中では、 var 宣言の代わりに、短い := の代入文を使い、
暗黙的な型宣言ができる。

###※関数の外では、キーワードではじまる宣言( var, func, など)が必要で、 := での暗黙的な宣言は利用できない。

```go:varDeclarationOmitted.go

package main

import "fmt"

func main() {
	var i, j int = 1, 2
	//暗黙的宣言
	k := 3
	c, python, java := true, false, "no!"

	fmt.Println(i, j, k, c, python, java)
}

//実行
go run varDeclarationOmitted.go

//実行結果
1 2 3 true false no!
```

 - 基本の型

次のとおりです。

```go
//型の紹介のみ

bool

string

int  int8  int16  int32  int64
uint uint8 uint16 uint32 uint64 uintptr

byte // uint8 の別名

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

float32 float64

complex64 complex128
```

 - 変数に初期値を与えずに宣言
 
その場合、ゼロ値が与えられます。

ゼロ値は型によって以下のように与えられる。

数値型(int,floatなど): 0
bool型: false
string型: "" (空文字列( empty string ))

```go:varNoInitialVal.go

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)
}

//実行
go run go:varNoInitialVal.go

//実行結果
0 0 false ""
```

 - 型変換
 
少数点→整数の変換について
※数値から文字列への変換に関しては、また別処理が必要。。
[golang　文字列→数値、数値→文字列変換](https://qiita.com/quicksort/items/c9522793a941edf074fd)

```go:typeConv.go

package main

import (
	"fmt"
	"math"
)

func main() {
	var x, y int = 3, 4
	var f float64 = math.Sqrt(float64(x*x + y*y))
		var z uint = uint(f)
	fmt.Println(x, y, z)
}

//実行
go run typeConv.go

//実行結果
3 4 5
```

 - 型推論
 
明示的な型を指定せずに変数を宣言する場合( := や var = のいずれか)、
変数の型は右側の変数から型推論される。
※右側の変数が型を持っている場合、左側の新しい変数は同じ型になる。

```go:typeInference.go

// i はint型のため、vもint型になる。
package main

import "fmt"

var i int

func main() {
	v := i
	fmt.Printf("v is of type %T\n", v)
}

//実行
go run typeInference.go

//実行結果
v is of type int
```

##定数
定数は、 constを使って変数と同じように宣言する。
定数は、文字(character)、文字列(string)、boolean、数値(numeric)のみで使える。
※定数は := を使って宣言できない。

```go:constant.go

package main

import "fmt"

const Pi = 3.14

func main() {
	const World string = "世界"
	fmt.Println("Hello", World)
	fmt.Println("Happy", Pi, "Day")

	const Truth = true
	fmt.Println("Go rules?", Truth)
}

//実行
go run constant.go

//実行結果
Hello 世界
Happy 3.14 Day
Go rules? true
```

##まとめ
基本的なところをみていきました。
次回は、「For」や「if」といったところをみていきます。