Skip to Content
ブログGolang クイックリファレンス

Golang クイックリファレンス

コレクションの使い方

スライスの使い方

// 特徴: 可変、参照渡し、ヒープ割り当て a := []int{1,2,3,4,5} // 短縮記法と初期化 // プレースホルダとしてインデックスを指定することもできる a := []int{0:1,4:3} // 追加 a = append(a, 6) // 削除 // 削除する要素のインデックス index := 2 // 要素を削除 slice = append(slice[:index], slice[index+1:]...) // これは配列の結合でもある // 変更と読み取りは配列と同じ

スライスの長さと容量について

// Length(長さ)は、スライスが現在含む要素数を指す。 // Capacity(容量)は、基底配列のサイズ、つまりスライスが収容できる要素数の上限を指す。 a := make([]byte, 5, 10) // スライス a は最大 10 個の byte 要素を収容できるが、現在は 5 個だけ。 // 容量は省略できる a := make([]byte, 5) // 構文の説明 a[b:c] => // b は現在のインデックス。空ならインデックスは 0 // c は現在のインデックス。空ならインデックスは len(a) s := x[:] // スライス s は配列 x のメモリ空間を指す。s の値を変えると x の値にも影響する

スライスの反復方法

for k,v := range a {} for _,v := range a {} // インデックスが不要 for k := range a {} // インデックスだけ必要 for range time.Tick(time.Second) {} // どちらも不要

配列の使い方

// 特徴: 固定サイズ、値渡し、スタック割り当て a := [5]int{1,2,3,4,5} // 追加・削除はできない // 変更 a[3] = 6 // 読み取り a[3]

switch の使い方

switch a { case "a": // todo case "b", "c": // b または c に一致 // todo default: // todo } // 先頭に文を置くこともできる switch a:=1; a { ... }

for ループの使い方

for {} // while true 相当 for a < 19 {} // while a < 19 相当 for a := 10; a<99; a++ {} // 通常の使い方 // 外側のラベル付き break / continue もサポート here: for i := 0; i < 2; i++ { for j := i + 1; j < 3; j++ { if i == 0 { continue here } fmt.Println(j) if j == 2 { break } } } there: for i := 0; i < 2; i++ { for j := i + 1; j < 3; j++ { if j == 1 { continue } fmt.Println(j) if j == 2 { break there } } }

if 構造の使い方

if a > 0 {} // 追加の文を置き、セミコロンで終えられる if a := b+c; a > 0 {}

パッケージとデフォルトの制約について

Go の各ソースファイル(コメントを除く)の先頭に package 宣言を置く。実行ファイルは main パッケージ。慣例として package 名 == パッケージ import パスの末尾(import パス math/rand => パッケージ名 rand)。大文字で始まる識別子はエクスポートされ、他パッケージから見える。小文字で始まる識別子は非公開で、他パッケージからは見えない。

関数の宣言方法

func a() {} func a(b int){} func a(b, c int){} // 同じ型が複数 func a() string {} // 戻り値 func a() (int,string){ return 1, "1" } // 戻り値識別子。そのまま return するだけ func a() (b int, c string){ b = 1 c = "1" return }

関数の受け渡しとクロージャ

// 引数として使う add := func(a,b)int{ return a+b } // 戻り値として使う func wrapAdd() (add func() int) { c := 1 add = func() int { return c } return }

可変長引数関数

func a(args ...int) int { return 1 }

変数の宣言方法

var a int = 1 a := 1 const a = "1"

iota のテクニック

  • 列挙値の自動インクリメント

    const ( Red = iota // 0 Green // 1 Blue // 2 )
  • ビット演算でフラグ定数を作る

    const ( FlagNone = 0 // 0 FlagA = 1 << iota // 1 FlagB = 1 << iota // 2 FlagC = 1 << iota // 4 )
  • 不要な値をスキップする

    const ( _ = iota // 最初の列挙値をスキップ January = 1 + iota // 1 February // 2 March // 3 )

他ファイルのインポート方法

  1. 相対パスインポート: 相対パスで他ファイルを取り込みます。同一プロジェクト内の他ファイルを参照するのに適しています。例えば import "./utils" は、現在のプロジェクトの utils ファイルをインポートします。
  2. 絶対パスインポート: 絶対パスで他ファイルを取り込みます。別プロジェクトやライブラリにあるファイルを参照するのに適しています。例えば import "github.com/example/package" は github.com/example/package パッケージのファイルをインポートします。
  3. 標準ライブラリのインポート: Go 言語は追加のインポートなしで直接使える標準ライブラリを多数提供します。例えば import "fmt" は標準ライブラリの fmt パッケージをインポートします。
  4. エイリアスインポート: インポートしたパッケージやファイルにエイリアスを付け、コード内でより短い名前を使えます。例えば import utils "github.com/example/package" は github.com/example/package にエイリアス utils を付け、その後 utils でパッケージ内容にアクセスできます。
  5. ブランク識別子インポート: ファイル内の init 関数だけを実行し、その他の内容は使わない場合があります。そのときはブランク識別子 _ でインポートします。例えば import _ "github.com/example/package" は github.com/example/package パッケージの init 関数を実行しますが、コード内ではそのパッケージの他の内容は使いません。
  6. ドット演算子によるインポートはコードを簡潔にできますが、可読性を下げることもあります。

よく使う CLI コマンド

  • go build: Go コードをコンパイルし、実行ファイルを生成します。例: go build main.go は main.go をコンパイルして実行ファイルを生成します。
  • go run: Go コードをコンパイルして実行します。例: go run main.go は main.go をコンパイルしてそのまま実行します。
  • go test: Go のユニットテストを実行します。go test によりプロジェクト内のテストファイルを自動実行し、結果を出力します。
  • go get: サードパーティの依存パッケージを取得してインストールします。例: go get github.com/example/package は github.com/example/package 依存を取得してインストールします。
  • go mod init: Go プロジェクトのモジュール管理を初期化します。go mod init を実行すると、依存管理用の新しい go.mod が作れます。
  • go mod tidy: プロジェクト内の未使用依存を自動で整理します。go mod tidy は依存を検査し、不要になったものを削除します。
  • go mod vendor: プロジェクトの依存を vendor ディレクトリへコピーします。go mod vendor により、オフラインビルドとデプロイのために全依存をプロジェクトへコピーできます。
  • go doc: Go コードのドキュメントを表示します。例: go doc fmt.Println は fmt パッケージの Println 関数のドキュメントを表示します。
最終更新日