Goの基本構文一覧

## 1. HelloWorld
Goのプログラムの開始地点は`main`パッケージの`main`関数です。
```go
package main

import "fmt"

func main() {
	fmt.Println("Hello World!")
}
```
## 2. 変数宣言
```go
// 変数
var num int = 10
// 定数
const constNum int = 20
```
Goの基本のデータ型は以下の通りです。
| データ型 | 値 |
|:--|:--|
| int8<br>int16<br>int32<br>int64  | 8～64ビット整数  |
| uint8<br>uint16<br>uint32<br>uint64  | 8～64ビット符号なし整数|
| float32<br>float64 | [単精度浮動小数点](https://ja.wikipedia.org/wiki/%E5%8D%98%E7%B2%BE%E5%BA%A6%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0)<br>[倍精度浮動小数点](https://ja.wikipedia.org/wiki/%E5%80%8D%E7%B2%BE%E5%BA%A6%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0) |
| int | CPUによって32ビットまたは64ビット<br>（int32またはint64） |
| uint | CPUによって32ビットまたは64ビット<br>（uint32またはuint64） |
| byte | int8の別名 |
| bool | trueまたはfalse |
| string | 文字列 |
### 型推論
データ型の指定を省略することができます。
```go
var typeInferenceBool = true  // bool型
var typeInferenceNum = 10     // int型
var typeInferenceStr = "abc"  // string型
var typeInferenceFloat = 10.5 // float型
```
### 複数の変数を同時に宣言
下記のように書けます。
```go
var x, y = 10, "Hello" // xにはint、yにはstringを代入
```
### 短い変数宣言
下記のように書くと`var`も省略できます。
```go
shortNum := 20                // int型
shortX, shortY := 30, "Hello" // int型とstring型
```
## 3. 分岐
### if文
```go
x := 10
if x > 5 {
	fmt.Println("x is greater than 5")
} else {
	fmt.Println("x is not greater than 5")
}
```
### switch文
`break`は必要ありません。
```go
y := 2
switch y {
case 1:
	fmt.Println("one")
case 2:
	fmt.Println("two")
case 3:
	fmt.Println("three")
default:
	fmt.Println("Unknown number")
}
```
## 4. 繰り返し
```go
// 基本的なfor文
for i := 0; i < 10; i++ {
	fmt.Println(i)
}

// rangeを使ったfor文
numbers := []int{2, 3, 5, 7, 11}
for i, num := range numbers {
	fmt.Printf("Index %d: %d\n", i, num)
}
```
## 5. 関数
関数は下記のように定義できます。
```
func [関数名]([引数]) [戻り値の型]
```
```go
package main

import "fmt"

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

func main() {
	result := add(5, 3)
	fmt.Println(result)
}
```
## 6. 構造体とメソッド
Goにはクラスの概念がないため、構造体とメソッドを使用します。
```go
package main

import "fmt"

// 構造体
type Person struct {
	Name string
	Age  int
}

// Personのメソッド
func (p Person) SayHello() {
	fmt.Printf("Hello, my name is %s\n", p.Name)
}

func main() {
	person := Person{Name: "John", Age: 30}
	person.SayHello()
}
```
## 7. エラー処理
Goには`try-catch`構文がありません。
Goは複数の戻り値を取れるので、エラーが発生した場合は戻り値として返します。
```go
package main

import (
	"errors"
	"fmt"
)

// 戻り値として error 型を返す。
func divide(x, y float64) (float64, error) {
	if y == 0.0 {
		// エラー型を生成して返す
		return 0.0, errors.New("cannot divide by zero")
	}
	return x / y, nil
}

func main() {
	result, err := divide(10.0, 0.0)
	if err != nil {
		// エラーがある場合
		fmt.Println("Error:", err)
	} else {
		fmt.Println("Result:", result)
	}
}
```
## 8. リスト（配列）
配列は固定長、スライスは可変長となります。
```go
// 配列
var numbers [5]int = [5]int{1, 2, 3, 4, 5}
fmt.Println(numbers[1]) // 2

// スライス
var slice []int = []int{1, 2, 3, 4, 5}
slice = append(slice, 6)
fmt.Println(slice[len(slice)-1]) // 6
```
## 9. 辞書（連想配列）
```go
// キーがstring、値がstringのmapを生成
var colors = map[string]string{"red": "#ff0000", "green": "#00ff00"}

// mapに値を追加
colors["blue"] = "#0000ff"

// mapから値を取得
fmt.Println(colors["blue"]) // #0000ff
```
## 10. ファイル入出力
### ファイル書き込み
```go
package main

import (
	"fmt"
	"os"
)

func main() {
	// ファイルの作成
	file, err := os.Create("example.txt")
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	// 関数終了時にリソースを閉じる
	defer file.Close()

	// ファイルへの書き込み
	_, err = file.WriteString("Hello, file world!\n")
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
}

```
### ファイル読み込み
```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	// ファイルの読み込み
	file, err := os.Open("example.txt")
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		fmt.Println(scanner.Text())
	}

	if err := scanner.Err(); err != nil {
		fmt.Println("Error:", err)
	}
}
```
以上です。