🍣

golang基本

2025/02/24に公開

以下に、Golang(Go言語)の基本を網羅的に解説します。以下の内容は、Goの概要から主要な文法、並行処理、エラーハンドリング、開発ツールや学習リソースまでカバーしています。


1. Golangとは?

  • 概要と背景
    GoはGoogleによって開発されたオープンソースのプログラミング言語です。2007年ごろに設計が始まり、2009年に正式リリースされました。開発者は、シンプルさと効率性、そして大規模なソフトウェアシステムでの並行処理の扱いやすさを重視しています。

  • 主な用途

    • サーバーサイドの開発
    • ネットワークプログラミング
    • システムプログラミング
    • クラウドサービスやマイクロサービスの実装

2. Golangの特徴

  • 高速なコンパイル
    ソースコードを迅速にコンパイルでき、開発サイクルが短縮されます。

  • 静的型付けとシンプルな文法
    型安全性が高く、コードの可読性も良いため、大規模なプロジェクトでもバグが見つけやすい設計となっています。

  • ガーベジコレクション
    自動メモリ管理により、手動でのメモリ解放が不要です。

  • 優れた並行処理機能
    軽量なスレッド「goroutine」と、goroutine間の通信を行う「channel」により、並行処理がシンプルかつ強力に実装できます。

  • クロスプラットフォーム対応
    Linux、macOS、Windowsなど様々なプラットフォームで動作します。


3. Golangの基本文法

3.1. 変数と定数

  • 変数宣言

    var x int = 10
    // 型推論を利用する場合
    y := 20
    

    := を使うことで、初期化と同時に型推論が行われます。

  • 定数宣言

    const Pi = 3.1415
    

3.2. データ型

  • 基本型

    • 整数型(int, int32, int64など)
    • 浮動小数点型(float32, float64
    • 文字列型(string
    • 真偽値(bool
  • 複合型

    • 配列: 固定長の同一型データの集まり
      var arr [3]int = [3]int{1, 2, 3}
      
    • スライス: 可変長の配列のようなもの
      slice := []int{1, 2, 3, 4}
      
    • マップ: キーと値のペアの集合
      m := map[string]int{"apple": 100, "banana": 200}
      
    • 構造体: 異なる型を持つフィールドの集合
      type Person struct {
          Name string
          Age  int
      }
      p := Person{Name: "Taro", Age: 30}
      
  • ポインタ
    C言語に似たポインタの概念があり、変数のメモリアドレスを扱えます。

    var a int = 10
    var p *int = &a
    

3.3. 制御構文

  • if文

    if x > 10 {
        fmt.Println("xは10より大きい")
    } else {
        fmt.Println("xは10以下")
    }
    
  • for文
    Goではループ構文として「for」が唯一用意されています。

    // 従来のforループ
    for i := 0; i < 5; i++ {
        fmt.Println(i)
    }
    
    // while文のように使う例
    i := 0
    for i < 5 {
        fmt.Println(i)
        i++
    }
    
  • switch文
    複数の条件分岐をシンプルに記述できます。

    switch day := "月"; day {
    case "月", "火", "水", "木", "金":
        fmt.Println("平日")
    default:
        fmt.Println("週末")
    }
    

3.4. 関数

  • 基本的な関数の定義

    func add(a int, b int) int {
        return a + b
    }
    
  • 複数の戻り値
    Goでは関数が複数の値を返すことができます。

    func divMod(a, b int) (int, int) {
        return a / b, a % b
    }
    
  • 無名関数とクロージャ
    関数を変数に代入したり、関数内で定義することができます。

    func main() {
        f := func(x int) int {
            return x * x
        }
        fmt.Println(f(5))
    }
    

3.5. パッケージとモジュール

  • パッケージの概念
    Goではコードは必ずパッケージに属し、再利用性や名前空間の管理を助けます。

    • プログラムのエントリーポイントは通常 main パッケージに置かれます。
  • インポート
    他のパッケージを利用する際は、import 文を使用します。

    import "fmt"
    
  • モジュール管理
    Go 1.11以降は go mod コマンドで依存関係を管理する仕組みが導入されています。

    go mod init example.com/myproject
    

4. 並行処理の基本

Goの大きな特徴のひとつが、並行処理をシンプルに扱える点です。

4.1. goroutine

  • 概念
    goroutineは軽量なスレッドです。関数の呼び出しの前に go キーワードを付けるだけで、新しいgoroutineとして実行されます。
    go func() {
        fmt.Println("並行処理で実行")
    }()
    

4.2. channel

  • 通信のためのチャネル
    goroutine間で安全にデータをやり取りするためにchannelを使います。
    ch := make(chan int)
    go func() {
        ch <- 42  // channelにデータを送信
    }()
    num := <-ch  // channelからデータを受信
    fmt.Println(num)
    

4.3. select文

  • 複数のチャネル操作を待機
    複数のチャネルからのデータ受信や送信を待つ場合に使います。
    select {
    case msg1 := <-ch1:
        fmt.Println("ch1から受信:", msg1)
    case msg2 := <-ch2:
        fmt.Println("ch2から受信:", msg2)
    default:
        fmt.Println("どのチャネルからも受信できなかった")
    }
    

5. エラーハンドリング

  • error型の利用
    Goではエラーハンドリングは値(error)として返され、明示的に処理する必要があります。
    func readFile(name string) ([]byte, error) {
        data, err := os.ReadFile(name)
        if err != nil {
            return nil, err
        }
        return data, nil
    }
    
    これにより、エラー発生時のハンドリングが明瞭になります。

6. 開発ツールとコミュニティ

  • コードフォーマッタ (gofmt)
    Goは gofmt ツールで自動的にコードを整形でき、統一されたスタイルを保てます。

  • テストフレームワーク (go test)
    標準ライブラリに組み込まれており、単体テストやベンチマークテストが容易です。

  • ドキュメント生成 (godoc)
    ソースコードのコメントからドキュメントを自動生成できるため、ライブラリの利用方法を簡単に把握できます。

  • コミュニティと学習リソース

    • 公式サイト:go.dev
    • 公式ツアー:A Tour of Go
    • オープンソースプロジェクトや多数の書籍、オンラインフォーラムが存在し、学習環境が充実しています。

7. まとめと学習リソース

Go言語は、そのシンプルで効率的な設計、そして優れた並行処理機能により、多くのシステムやサービスで採用されています。
基本を学んだら、以下のリソースで実際にコードを書いてみると理解が深まります。

  • 公式ツアー:インタラクティブに基本文法を学ぶのに最適です。
  • ドキュメント:公式のパッケージリファレンスを参照し、標準ライブラリの機能を理解しましょう。
  • コミュニティ:GitHubや各種フォーラムで他の開発者と交流し、ベストプラクティスや実践例を学びましょう。

また、実際に「Hello, World!」プログラムを作成してみるのもおすすめです。

package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

このように、Goはシンプルながら強力な言語設計を持ち、初心者から上級者まで幅広い開発者に支持されています。これを機に、ぜひコードを書いて実践してみてください。

Discussion