Goの書き方
よく使う文法・タグ・操作を、短い例で。42項目から探せます。
42 / 42項目
基本の形や関数内の抜粋を掲載しています。そのまま実行する例と準備方法は、各言語の「学ぶ」ページで確認できます。
変数と表示
短い宣言で値を覚えます。
name := "海"
fmt.Println(name)条件分岐
条件に応じて処理を分けます。
age := 20
if age >= 18 {
fmt.Println("成人")
} else {
fmt.Println("未成年")
}繰り返し
forで1から3まで表示します。
for i := 1; i <= 3; i++ {
fmt.Println(i)
}関数
引数と返り値に型を付けます。
func add(a int, b int) int { return a + b }スライス
複数の値をまとめます。
names := []string{"海", "空"}
fmt.Println(names[0])構造体
関連する値に項目名を付けます。
package main
import "fmt"
type User struct { Name string }
func main() {
user := User{Name: "海"}
fmt.Println(user.Name)
}エラーの確認
結果とエラーを受け取り、先に確認します。
number, err := strconv.Atoi("海")
if err != nil {
fmt.Println("数字ではありません")
return
}
fmt.Println(number)var・const
型付き変数と定数。
var age int = 20
const limit = 10型の変換
整数を小数へ変換する。
count := 3
average := float64(10) / float64(count)文字列の操作
分割や部分一致を使う。
words := strings.Split("海,空", ",")
found := strings.Contains("hello", "he")stringsのimportが必要です。
append・len
スライスに追加し、件数を調べる。
nums := []int{1, 2}
nums = append(nums, 3)
fmt.Println(len(nums))map
キーと値の組を作る。
ages := map[string]int{"海": 20}
fmt.Println(ages["海"])range
一覧を番号付きで処理する。
names := []string{"海", "空"}
for i, name := range names {
fmt.Println(i, name)
}条件だけのfor
条件が成立する間、繰り返す。
i := 0
for i < 3 { i++ }switch
値に応じて処理を分ける。
day := 1
switch day {
case 1: fmt.Println("月曜")
default: fmt.Println("その他")
}複数の返り値
関数から複数の値を返す。
func pair() (string, int) {
return "海", 20
}defer
関数の終了時に処理する。
defer fmt.Println("終了")
fmt.Println("開始")ポインター
値のアドレスを渡す。
age := 20
p := &age
*p = 21メソッド
型に処理を結び付ける。
type User struct { Name string }
func (u User) Greet() string { return u.Name }interface
必要なメソッドを示す。
type Greeter interface {
Greet() string
}goroutine・channel
処理を並行に動かし、結果を受け取る。
ch := make(chan string)
go func() { ch <- "完了" }()
fmt.Println(<-ch)JSON
構造体をJSONへ変換する。
type User struct { Name string `json:"name"` }
text, err := json.Marshal(User{Name: "海"})
if err == nil { fmt.Println(string(text)) }encoding/jsonのimportが必要です。
1行を入力する
Scannerで空白を含む1行を読みます。
scanner := bufio.NewScanner(os.Stdin)
if scanner.Scan() {
fmt.Println(scanner.Text())
}importにbufio、os、fmtが必要です。入力エラーはscanner.Err()で調べます。
文字を数値にする
Atoiの結果とエラーを一緒に受け取ります。
count, err := strconv.Atoi("12")
if err == nil {
fmt.Println(count)
}importにstrconvとfmtが必要です。
文字列に値を埋め込む
Sprintfで数値などを文字列に組み込みます。
age := 20
text := fmt.Sprintf("年齢: %d", age)import "fmt"が必要です。
区切って分ける
Splitで文字列をスライスに分けます。
colors := strings.Split("赤,青,白", ",")
fmt.Println(colors[0])importにstringsとfmtが必要です。
空白除去と置き換え
TrimSpaceで空白を除き、ReplaceAllで置き換えます。
text := strings.TrimSpace(" hello ")
message := strings.ReplaceAll(text, "hello", "こんにちは")import "strings"が必要です。
含まれる文字を調べる
Containsで指定した文字列を探します。
found := strings.Contains("hello world", "world")import "strings"が必要です。
文字ごとに読む
rangeはUTF-8の文字列をrune単位で読みます。
for _, letter := range "こんにちは" {
fmt.Printf("%c\n", letter)
}import "fmt"が必要です。runeはUnicodeのコードポイントです。
一部を取り出す
開始位置を含み、終了位置を含まない範囲を取ります。
values := []int{10, 20, 30, 40}
part := values[1:3]元のスライスと同じ配列を共有します。
長さを決めて作る
makeで指定した長さのスライスを作ります。
scores := make([]int, 3)
scores[0] = 80別のスライスにコピー
copyで要素を別の領域に写します。
original := []int{1, 2, 3}
saved := make([]int, len(original))
copy(saved, original)キーの有無を確認
2つ目の戻り値でキーがあるか分かります。
scores := map[string]int{"海": 80}
score, ok := scores["海"]
if ok { fmt.Println(score) }import "fmt"が必要です。
辞書から削除する
deleteで指定したキーを削除します。
scores := map[string]int{"海": 80}
delete(scores, "海")数値を並べ替える
sort.Intsで小さい順に並べます。
scores := []int{90, 70, 80}
sort.Ints(scores)import "sort"が必要です。元のスライスが変わります。
引数を何個でも受け取る
...で同じ型の引数をまとめて受け取れます。
func total(values ...int) int {
sum := 0
for _, value := range values { sum += value }
return sum
}関数を変数に入れる
名前のない関数を値として使います。
twice := func(value int) int { return value * 2 }
result := twice(3)JSONの項目名を指定
タグでJSONに出すフィールド名を決めます。
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}JSONで扱うフィールド名は大文字で始めます。
エラーに説明を付ける
%wで元のエラーを保ったまま説明を付けます。
func load() ([]byte, error) {
data, err := os.ReadFile("memo.txt")
if err != nil { return nil, fmt.Errorf("読込失敗: %w", err) }
return data, nil
}importにosとfmtが必要です。
ファイルを読む・書く
osの関数は処理結果とエラーを返します。
err := os.WriteFile("memo.txt", []byte("こんにちは"), 0644)
if err != nil { return }
data, err := os.ReadFile("memo.txt")
if err == nil { fmt.Println(string(data)) }importにosとfmtが必要です。戻り値のない関数内の例です。既存の内容を上書きします。
複数の受信を待つ
selectで準備ができた通信の処理を選びます。
messages := make(chan string, 1)
messages <- "完了"
select {
case text := <-messages: fmt.Println(text)
default: fmt.Println("待機中")
}import "fmt"が必要です。defaultがあると待たずに進みます。
インターフェースの型を確認
2つ目の値で型が合っているか確認できます。
var value interface{} = "海"
text, ok := value.(string)
if ok { fmt.Println(text) }import "fmt"が必要です。