14言語・590の書き方
CODE ATLAS / 文法辞典

Goの書き方

よく使う文法・タグ・操作を、短い例で。42項目から探せます。

42 / 42項目

基本の形や関数内の抜粋を掲載しています。そのまま実行する例と準備方法は、各言語の「学ぶ」ページで確認できます。

変数と表示

短い宣言で値を覚えます。

main.go
name := "海"
fmt.Println(name)
説明と練習この項目

条件分岐

条件に応じて処理を分けます。

main.go
age := 20
if age >= 18 {
  fmt.Println("成人")
} else {
  fmt.Println("未成年")
}
説明と練習この項目

繰り返し

forで1から3まで表示します。

main.go
for i := 1; i <= 3; i++ {
  fmt.Println(i)
}
説明と練習この項目

関数

引数と返り値に型を付けます。

main.go
func add(a int, b int) int { return a + b }
説明と練習この項目

スライス

複数の値をまとめます。

main.go
names := []string{"海", "空"}
fmt.Println(names[0])
説明と練習この項目

構造体

関連する値に項目名を付けます。

main.go
package main

import "fmt"

type User struct { Name string }

func main() {
  user := User{Name: "海"}
  fmt.Println(user.Name)
}
説明と練習この項目

エラーの確認

結果とエラーを受け取り、先に確認します。

main.go
number, err := strconv.Atoi("海")
if err != nil {
  fmt.Println("数字ではありません")
  return
}
fmt.Println(number)
説明と練習この項目

var・const

型付き変数と定数。

main.go
var age int = 20
const limit = 10
この項目

型の変換

整数を小数へ変換する。

main.go
count := 3
average := float64(10) / float64(count)
この項目

文字列の操作

分割や部分一致を使う。

main.go
words := strings.Split("海,空", ",")
found := strings.Contains("hello", "he")

stringsのimportが必要です。

この項目

append・len

スライスに追加し、件数を調べる。

main.go
nums := []int{1, 2}
nums = append(nums, 3)
fmt.Println(len(nums))
この項目

map

キーと値の組を作る。

main.go
ages := map[string]int{"海": 20}
fmt.Println(ages["海"])
この項目

range

一覧を番号付きで処理する。

main.go
names := []string{"海", "空"}
for i, name := range names {
  fmt.Println(i, name)
}
この項目

条件だけのfor

条件が成立する間、繰り返す。

main.go
i := 0
for i < 3 { i++ }
この項目

switch

値に応じて処理を分ける。

main.go
day := 1
switch day {
case 1: fmt.Println("月曜")
default: fmt.Println("その他")
}
この項目

複数の返り値

関数から複数の値を返す。

main.go
func pair() (string, int) {
  return "海", 20
}
この項目

defer

関数の終了時に処理する。

main.go
defer fmt.Println("終了")
fmt.Println("開始")
この項目

ポインター

値のアドレスを渡す。

main.go
age := 20
p := &age
*p = 21
この項目

メソッド

型に処理を結び付ける。

main.go
type User struct { Name string }
func (u User) Greet() string { return u.Name }
この項目

interface

必要なメソッドを示す。

main.go
type Greeter interface {
  Greet() string
}
この項目

goroutine・channel

処理を並行に動かし、結果を受け取る。

main.go
ch := make(chan string)
go func() { ch <- "完了" }()
fmt.Println(<-ch)
この項目

JSON

構造体をJSONへ変換する。

main.go
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行を読みます。

main.go
scanner := bufio.NewScanner(os.Stdin)
if scanner.Scan() {
  fmt.Println(scanner.Text())
}

importにbufio、os、fmtが必要です。入力エラーはscanner.Err()で調べます。

この項目

文字を数値にする

Atoiの結果とエラーを一緒に受け取ります。

main.go
count, err := strconv.Atoi("12")
if err == nil {
  fmt.Println(count)
}

importにstrconvとfmtが必要です。

この項目

文字列に値を埋め込む

Sprintfで数値などを文字列に組み込みます。

main.go
age := 20
text := fmt.Sprintf("年齢: %d", age)

import "fmt"が必要です。

この項目

区切って分ける

Splitで文字列をスライスに分けます。

main.go
colors := strings.Split("赤,青,白", ",")
fmt.Println(colors[0])

importにstringsとfmtが必要です。

この項目

空白除去と置き換え

TrimSpaceで空白を除き、ReplaceAllで置き換えます。

main.go
text := strings.TrimSpace(" hello ")
message := strings.ReplaceAll(text, "hello", "こんにちは")

import "strings"が必要です。

この項目

含まれる文字を調べる

Containsで指定した文字列を探します。

main.go
found := strings.Contains("hello world", "world")

import "strings"が必要です。

この項目

文字ごとに読む

rangeはUTF-8の文字列をrune単位で読みます。

main.go
for _, letter := range "こんにちは" {
  fmt.Printf("%c\n", letter)
}

import "fmt"が必要です。runeはUnicodeのコードポイントです。

この項目

一部を取り出す

開始位置を含み、終了位置を含まない範囲を取ります。

main.go
values := []int{10, 20, 30, 40}
part := values[1:3]

元のスライスと同じ配列を共有します。

この項目

長さを決めて作る

makeで指定した長さのスライスを作ります。

main.go
scores := make([]int, 3)
scores[0] = 80
この項目

別のスライスにコピー

copyで要素を別の領域に写します。

main.go
original := []int{1, 2, 3}
saved := make([]int, len(original))
copy(saved, original)
この項目

キーの有無を確認

2つ目の戻り値でキーがあるか分かります。

main.go
scores := map[string]int{"海": 80}
score, ok := scores["海"]
if ok { fmt.Println(score) }

import "fmt"が必要です。

この項目

辞書から削除する

deleteで指定したキーを削除します。

main.go
scores := map[string]int{"海": 80}
delete(scores, "海")
この項目

数値を並べ替える

sort.Intsで小さい順に並べます。

main.go
scores := []int{90, 70, 80}
sort.Ints(scores)

import "sort"が必要です。元のスライスが変わります。

この項目

引数を何個でも受け取る

...で同じ型の引数をまとめて受け取れます。

main.go
func total(values ...int) int {
  sum := 0
  for _, value := range values { sum += value }
  return sum
}
この項目

関数を変数に入れる

名前のない関数を値として使います。

main.go
twice := func(value int) int { return value * 2 }
result := twice(3)
この項目

JSONの項目名を指定

タグでJSONに出すフィールド名を決めます。

main.go
type User struct {
  Name string `json:"name"`
  Age int `json:"age"`
}

JSONで扱うフィールド名は大文字で始めます。

この項目

エラーに説明を付ける

%wで元のエラーを保ったまま説明を付けます。

main.go
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の関数は処理結果とエラーを返します。

main.go
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で準備ができた通信の処理を選びます。

main.go
messages := make(chan string, 1)
messages <- "完了"
select {
case text := <-messages: fmt.Println(text)
default: fmt.Println("待機中")
}

import "fmt"が必要です。defaultがあると待たずに進みます。

この項目

インターフェースの型を確認

2つ目の値で型が合っているか確認できます。

main.go
var value interface{} = "海"
text, ok := value.(string)
if ok { fmt.Println(text) }

import "fmt"が必要です。

この項目