1. HelloWorld
Goのプログラムの開始地点はmain
パッケージのmain
関数です。
package main
import "fmt"
func main() {
fmt.Println("Hello World!")
}
2. 変数宣言
// 変数
var num int = 10
// 定数
const constNum int = 20
Goの基本のデータ型は以下の通りです。
データ型 | 値 |
---|---|
int8 int16 int32 int64 |
8~64ビット整数 |
uint8 uint16 uint32 uint64 |
8~64ビット符号なし整数 |
float32 float64 |
単精度浮動小数点 倍精度浮動小数点 |
int | CPUによって32ビットまたは64ビット (int32またはint64) |
uint | CPUによって32ビットまたは64ビット (uint32またはuint64) |
byte | int8の別名 |
bool | trueまたはfalse |
string | 文字列 |
型推論
データ型の指定を省略することができます。
var typeInferenceBool = true // bool型
var typeInferenceNum = 10 // int型
var typeInferenceStr = "abc" // string型
var typeInferenceFloat = 10.5 // float型
複数の変数を同時に宣言
下記のように書けます。
var x, y = 10, "Hello" // xにはint、yにはstringを代入
短い変数宣言
下記のように書くとvar
も省略できます。
shortNum := 20 // int型
shortX, shortY := 30, "Hello" // int型とstring型
3. 分岐
if文
x := 10
if x > 5 {
fmt.Println("x is greater than 5")
} else {
fmt.Println("x is not greater than 5")
}
switch文
break
は必要ありません。
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. 繰り返し
// 基本的な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 [関数名]([引数]) [戻り値の型]
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にはクラスの概念がないため、構造体とメソッドを使用します。
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は複数の戻り値を取れるので、エラーが発生した場合は戻り値として返します。
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. リスト(配列)
配列は固定長、スライスは可変長となります。
// 配列
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. 辞書(連想配列)
// キーがstring、値がstringのmapを生成
var colors = map[string]string{"red": "#ff0000", "green": "#00ff00"}
// mapに値を追加
colors["blue"] = "#0000ff"
// mapから値を取得
fmt.Println(colors["blue"]) // #0000ff
10. ファイル入出力
ファイル書き込み
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
}
}
ファイル読み込み
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)
}
}
以上です。