Golang チートシート
役に立つ golang コマンドと構文
以下は、基本的なGoプログラム構造、エラーハンドリングのパターン、およびチャネルとゴルーチンの比較です。
Go言語チートシート
基本構文
パッケージ宣言
package main
パッケージのインポート
import "fmt"
import (
"fmt"
"math"
)
main関数
func main() {
// ここにコードを記述
}
変数と型
変数宣言
var name string
var age int = 25
x := 10 // ショート宣言
基本的な型
- bool
- string
- int, int8, int16, int32, int64
- uint, uint8, uint16, uint32, uint64
- float32, float64
- complex64, complex128
制御構造
if文
if x > 0 {
// コード
} else if x < 0 {
// コード
} else {
// コード
}
forループ
for i := 0; i < 10; i++ {
// コード
}
rangeループ
for index, value := range collection {
// コード
}
switch文
switch variable {
case value1:
// コード
case value2:
// コード
default:
// コード
}
関数
関数宣言
func functionName(param1 type1, param2 type2) returnType {
// コード
return value
}
複数の戻り値
func divideAndRemainder(x, y int) (int, int) {
return x / y, x % y
}
データ構造
配列
var numbers int
numbers := int{1, 2, 3, 4, 5}
スライス
slice := []int{1, 2, 3}
slice := make([]int, 3, 5)
マップ
m := make(map[string]int)
m["key"] = value
構造体
type Person struct {
Name string
Age int
}
p := Person{Name: "Alice", Age: 30}
メソッド
メソッド宣言
func (r Rectangle) Area() float64 {
return r.width * r.height
}
インターフェース
インターフェース宣言
type Shape interface {
Area() float64
}
並行処理
ゴルーチン
go functionName()
チャネル
ch := make(chan int)
ch <- value // 送信
value := <-ch // 受信
エラーハンドリング
エラーの確認
if err != nil {
// エラーの処理
}
defer
defer file.Close()
テスト
テスト関数
func TestFunction(t *testing.T) {
// テストコード
}
このチートシートは、Go言語の最も重要な構文とコマンドをカバーしています。基本的な構文、制御構造、関数、データ構造、メソッド、インターフェース、並行処理のプリミティブ、およびエラーハンドリングが含まれています。Goはシンプルさと読みやすさを重視しているため、これらの構文は効率的で明確なGoコードを書くための基礎となります。
Goにおけるエラーハンドリング
Goにおけるエラーハンドリングは、明確さと堅牢性を重視しており、直感的です。Goでエラーハンドリングを行うための主な技術は以下の通りです:
- 関数が失敗する可能性がある場合は、エラーを最後の戻り値として返します。例えば:
func Hello(name string) (string, error) {
if name == "" {
return "", errors.New("empty name")
}
message := fmt.Sprintf("Hi, %v. Welcome!", name)
return message, nil
}
- 関数がエラーを返すたびに、すぐにエラーがnilでないかを確認してください。例えば:
result, err := SomeFunction()
if err != nil {
// エラーの処理
log.Fatal(err)
}
- エラーをラップして伝播する:
fmt.Errorf()
と%w
動詞を使用して、スタック上位にエラーを伝播する際に文脈を追加してください。例えば:
f, err := os.Open(path)
if err != nil {
return nil, fmt.Errorf("open failed: %w", err)
}
-
defer
を使用してクリーンアップ:defer
を使用して、エラーが発生した場合でもリソースが適切に閉じられたり、クリーンアップされたりすることを保証してください。 -
カスタムエラータイプの作成: カスタムエラータイプを実装して、より詳細なエラーアクセス情報を提供してください。
-
errors
パッケージの使用:errors.New()
を使用して単純なエラーメッセージを作成し、errors.Is()
またはerrors.As()
を使用してエラータイプのチェックと変換を行ってください。 -
panic
の使用を避ける:panic
は本当に回復不能な状況にのみ予約してください。通常のエラーハンドリングは戻り値を使用してください。 -
明確なエラーアクセス情報の提供: エラーメッセージを明確かつ情報豊富にすることで、デバッグやトラブルシューティングを容易にします。
これらの実践に従うことで、エラーを効果的に処理し、コードの明確性を維持した堅牢なGoプログラムを作成できます。
Goにおけるゴルーチンとチャネルのベストプラクティス
ゴルーチンの効率的な使用
-
過剰なゴルーチンの作成を避ける: ゴルーチンを生成する際は、タスクの性質や並行実行が本当に利益をもたらすかどうかを慎重に検討してください。
-
適切な同期: ゴルーチンを効果的に管理し、リソースの無駄を防ぐために、同期メカニズム(チャネルやwait groups)を使用してください。
-
タスクの性質を考慮する: ゴルーチンを使用する前に、タスクが本当に並行実行から利益を得るかどうかを評価してください。
チャネルの効果的な使用
-
適切なチャネルタイプの選択: 同期のために非バッファードチャネルを使用し、送信と受信の操作を分離する必要がある場合はバッファードチャネルを使用してください。
-
バッファ容量: バッファードチャネルを使用する場合は、バッファサイズを慎重に選択して、パフォーマンスとリソース使用のバランスを取ってください。
-
チャネルを適切に閉じる: チャネルにデータを送信しなくなる場合、チャネルを閉じて、デッドロックやリソースリークを防いでください。
並行性のパターン
-
ワーカー・プールパターン: ゴルーチンとチャネルを使用して、タスクの配分と結果の収集を効率的に行うワーカー・プールを実装してください。
-
プロダーカー-コンシューマー・パターン: ゴルーチンをプロダーカーとコンシューマーとして使用し、チャネルでデータの流れを介してそれらを接続してください。
エラーハンドリングとリソース管理
-
deferを使用してクリーンアップ: エラーが発生した場合でも、リソースが適切にクリーンアップされるようにdeferステートメントを使用してください。
-
パニックの処理: 長期間実行されるゴルーチンでは、recover()を使用して、1つのゴルーチンのパニックが全体のプログラムをクラッシュさせることを防いでください。
通信と同期
-
共有メモリよりもチャネルを優先: ゴルーチン間の通信にはチャネルを使用して、レースコンディションを回避し、同期を簡素化してください。
-
複数のチャネルの処理にselectを使用: selectステートメントを使用して、複数のチャネル操作を並行して処理してください。
パフォーマンスの考慮
-
並行操作の数を制限: セマフォアやワーカー・プールを使用して、リソース枯渇を防ぐために並行操作の数を制限してください。
-
過早な最適化を避ける: コードのボトルネックを特定するためにプロファイリングを行い、並行性の最適化を適用してください。
テストとデバッグ
-
レース検出器の使用: テストを実行する際、-raceフラグを使用してデータレースを検出してください。
-
並行コードのテストの作成: 並行コードのパスを特にテストして、信頼性を確保してください。
これらのベストプラクティスに従うことで、Goの並行性モデルを効果的に活用し、プログラムをより効率的、保守性が高く、一般的な並行性に関連する問題にかかりにくいものにできます。
他の技術ブログ記事もご覧ください。
Linux上でgolangをアップグレードする
- 新しいバージョンをダウンロード: https://go.dev/doc/install
- 古いバージョンを削除:
sudo rm -rf /usr/local/go
- 新しいバージョンをインストール:
cd Downloads
sudo tar -C /usr/local -xzf go1.24.3.linux-amd64.tar.gz