はじめに
GoはGoogleが開発したシンプルで高速な言語です。並行処理が得意で、Webサーバーやツール開発に適しています。
Hello World
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
# 実行
go run main.go
# ビルド
go build main.go
./main
変数
変数の宣言
// var で宣言
var name string = "太郎"
var age int = 25
// 型推論
var city = "東京"
// 短縮形(関数内のみ)
country := "日本"
// 複数変数
var x, y, z int = 1, 2, 3
a, b := "hello", 42
// ゼロ値(初期化しない場合のデフォルト)
var i int // 0
var s string // ""
var b bool // false
var p *int // nil
定数
const Pi = 3.14159
const AppName = "MyApp"
// 複数の定数
const (
StatusOK = 200
StatusError = 500
)
// iota(連番)
const (
Sunday = iota // 0
Monday // 1
Tuesday // 2
)
データ型
基本型
// 整数
var i int = 42
var i8 int8 = 127
var i16 int16 = 32767
var i32 int32 = 2147483647
var i64 int64 = 9223372036854775807
// 符号なし整数
var ui uint = 42
var ui8 uint8 = 255
// 浮動小数点
var f32 float32 = 3.14
var f64 float64 = 3.14159265359
// 文字列
var s string = "Hello, 世界"
// 真偽値
var b bool = true
// バイト(uint8のエイリアス)
var by byte = 'A'
// ルーン(int32のエイリアス、Unicode文字)
var r rune = 'あ'
型変換
var i int = 42
var f float64 = float64(i)
var u uint = uint(i)
// 文字列変換
import "strconv"
s := strconv.Itoa(42) // "42"
i, _ := strconv.Atoi("42") // 42
f, _ := strconv.ParseFloat("3.14", 64)
演算子
// 算術演算子
a := 10 + 3 // 13
b := 10 - 3 // 7
c := 10 * 3 // 30
d := 10 / 3 // 3
e := 10 % 3 // 1
// 比較演算子
fmt.Println(5 == 5) // true
fmt.Println(5 != 3) // true
fmt.Println(5 > 3) // true
// 論理演算子
fmt.Println(true && false) // false
fmt.Println(true || false) // true
fmt.Println(!true) // false
条件分岐
if文
age := 20
if age >= 20 {
fmt.Println("成人です")
} else if age >= 13 {
fmt.Println("ティーンエイジャーです")
} else {
fmt.Println("子供です")
}
// 初期化文付きif
if err := doSomething(); err != nil {
fmt.Println("エラー:", err)
}
switch文
day := 3
switch day {
case 1:
fmt.Println("月曜日")
case 2:
fmt.Println("火曜日")
case 3:
fmt.Println("水曜日")
default:
fmt.Println("その他")
}
// 複数の値
switch day {
case 1, 2, 3, 4, 5:
fmt.Println("平日")
case 6, 7:
fmt.Println("週末")
}
// 条件式なし(if-elseの代替)
score := 85
switch {
case score >= 90:
fmt.Println("A")
case score >= 80:
fmt.Println("B")
default:
fmt.Println("C")
}
ループ
// 基本的なfor
for i := 0; i < 5; i++ {
fmt.Println(i)
}
// while的なfor
count := 0
for count < 5 {
fmt.Println(count)
count++
}
// 無限ループ
for {
// break で抜ける
break
}
// range(配列、スライス、マップの反復)
numbers := []int{1, 2, 3, 4, 5}
for index, value := range numbers {
fmt.Printf("%d: %d\n", index, value)
}
// インデックスだけ
for i := range numbers {
fmt.Println(i)
}
// 値だけ(インデックス不要)
for _, value := range numbers {
fmt.Println(value)
}
配列とスライス
配列(固定長)
// 配列の宣言
var arr [5]int
arr[0] = 1
// 初期化
numbers := [5]int{1, 2, 3, 4, 5}
numbers2 := [...]int{1, 2, 3} // 長さを自動計算
// 長さ
fmt.Println(len(numbers)) // 5
スライス(可変長)
// スライスの作成
slice := []int{1, 2, 3, 4, 5}
// makeで作成
slice2 := make([]int, 5) // 長さ5、容量5
slice3 := make([]int, 5, 10) // 長さ5、容量10
// 要素の追加
slice = append(slice, 6, 7)
// スライス操作
sub := slice[1:3] // [2, 3]
sub2 := slice[:3] // [1, 2, 3]
sub3 := slice[2:] // [3, 4, 5]
// 長さと容量
fmt.Println(len(slice)) // 長さ
fmt.Println(cap(slice)) // 容量
// コピー
dest := make([]int, len(slice))
copy(dest, slice)
マップ
// マップの作成
m := map[string]int{
"apple": 100,
"banana": 200,
}
// makeで作成
m2 := make(map[string]int)
// 要素の追加・更新
m["orange"] = 150
// 要素の取得
price := m["apple"]
// 存在確認
value, exists := m["grape"]
if exists {
fmt.Println(value)
}
// 削除
delete(m, "apple")
// 反復
for key, value := range m {
fmt.Printf("%s: %d\n", key, value)
}
まとめ
- Goはシンプルで高速な静的型付け言語
:=で型推論付きの変数宣言forが唯一のループ構文- 配列は固定長、スライスは可変長
- マップはキーと値のペア
次回は関数と構造体について学びます。