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