プログラミング/Go
< プログラミング
Goの誕生と設計思想
編集Goは、Googleの技術者であるRobert Griesemer、Rob Pike、Ken Thompsonによって2007年に開発が開始された、シンプルで効率的なプログラミング言語です。複雑さを排除し、読みやすさと生産性を重視する言語設計が特徴です。
基本的な文法と構造
編集パッケージとインポート
編集Goのプログラムは常にパッケージで構成され、実行可能なプログラムは必ずmain
パッケージから始まります。
package main import "fmt" func main() { fmt.Println("Goの世界へようこそ!") }
変数と型
編集func variableExamples() { // 明示的な型宣言 var name string = "田中" var age int = 30 // 型推論 city := "東京" // 複数の変数の宣言 var x, y int = 10, 20 // 構造体 type Person struct { Name string Age int City string } person := Person{ Name: "山田", Age: 25, City: "大阪", } // マップ(辞書) scores := map[string]int{ "数学": 90, "国語": 85, "英語": 88, } // スライス numbers := []int{1, 2, 3, 4, 5} filteredNumbers := numbers[1:4] // インデックス1から3までを抽出 }
関数と制御構造
編集// 複数の戻り値を持つ関数 func calculateStats(numbers []int) (int, int, float64) { if len(numbers) == 0 { return 0, 0, 0.0 } sum := 0 for _, num := range numbers { sum += num } average := float64(sum) / float64(len(numbers)) max := numbers[0] for _, num := range numbers[1:] { if num > max { max = num } } return sum, max, average } func main() { numbers := []int{10, 20, 30, 40, 50} total, maxValue, avg := calculateStats(numbers) // 条件分岐 switch { case avg < 20: fmt.Println("平均値が低いです") case avg >= 20 && avg < 40: fmt.Println("平均値は標準的です") default: fmt.Println("平均値が高いです") } }
並行処理とチャネル
編集Goの並行処理は、goroutineとチャネルによって実現されます。
func worker(id int, jobs <-chan int, results chan<- int) { for job := range jobs { fmt.Printf("Worker %d processing job %d\n", id, job) time.Sleep(time.Second) results <- job * 2 } } func main() { jobs := make(chan int, 100) results := make(chan int, 100) // ワーカーの起動 for w := 1; w <= 3; w++ { go worker(w, jobs, results) } // ジョブの送信 for j := 1; j <= 5; j++ { jobs <- j } close(jobs) // 結果の収集 for a := 1; a <= 5; a++ { fmt.Println(<-results) } // タイムアウト付きのチャネル操作 select { case result := <-results: fmt.Println("結果:", result) case <-time.After(3 * time.Second): fmt.Println("タイムアウト") } }
エラーハンドリング
編集type CustomError struct { Message string Code int } func (e *CustomError) Error() string { return fmt.Sprintf("エラー %d: %s", e.Code, e.Message) } func riskyOperation(value int) error { if value < 0 { return &CustomError{ Message: "無効な値です", Code: 400, } } return nil } func main() { err := riskyOperation(-10) if err != nil { switch e := err.(type) { case *CustomError: fmt.Printf("カスタムエラー: %v\n", e) default: fmt.Println("不明なエラー") } } }
インターフェースと構造的型付け
編集type Shape interface { Area() float64 Perimeter() float64 } type Rectangle struct { Width float64 Height float64 } func (r Rectangle) Area() float64 { return r.Width * r.Height } func (r Rectangle) Perimeter() float64 { return 2 * (r.Width + r.Height) } func printShapeDetails(s Shape) { fmt.Printf("面積: %.2f\n周囲長: %.2f\n", s.Area(), s.Perimeter()) } func main() { rect := Rectangle{Width: 5, Height: 3} printShapeDetails(rect) }
Goの特徴と適用領域
編集Goは以下のような分野で特に強みを発揮します:
- クラウドインフラストラクチャ
- マイクロサービス
- ネットワークプログラミング
- システムプログラミング
- CLI(コマンドラインインターフェース)ツール
まとめ
編集Goは、シンプルさ、高性能、並行処理のサポートを兼ね備えたプログラミング言語です。Google発のこの言語は、複雑さを排除し、開発者の生産性を最大化することを目指しています。初学者にも経験豊富な開発者にも、魅力的な選択肢となるでしょう。