go-lang-dev/docs/go言語.md
2025-03-09 17:29:30 +09:00

4.0 KiB
Raw Permalink Blame History

Go言語の特徴

  • シンプル & 高速

    • 文法がシンプルで読みやすい
    • コンパイルが速く、実行時も高速
  • 静的型付け

    • int, string, bool などの型を明示(または推論)
  • 並行処理が得意goroutine & channel

    • 軽量スレッドgoroutineを使って並行処理が簡単
  • 単一バイナリでデプロイ

    • 依存関係を含む1つのバイナリで配布可能
  • ガベージコレクションGCあり

    • 手動でメモリ管理しなくてもOK
  • クロスコンパイルが簡単

    • Windows, Linux, macOS用のバイナリを簡単に作れる
  • Go言語にclassはない

    • 構造体(struct)+メソッド+インターフェースでオブジェクト指向のような設計は可能

構文例

package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}
  • package
    • 名前空間Namespaceのようなものです。
    • package main は、Goプログラムのエントリーポイント実行可能なプログラム を示します。
  • import "fmt"
    • 標準ライブラリのfmtパッケージ(文字列出力などの機能を持つ)です。

書き方

変数について

func main() {
    var message string = "Hello, Go!"
    fmt.Println(message)

    // 型推論
    num := 42
    fmt.Println(num)
}
  • varを使って明示的に型を指定できる
  • :=を使うと、型推論で自動的に型が決まる(関数内のみ)

配列・MAP(連想配列/辞書)

配列の扱い方

配列(固定長)

// 配列(固定長)
var arr [3]int = [3]int{1, 2, 3}
fmt.Println(arr)

配列(可変長)

// 配列(固定長)
slice := []int{1, 2, 3, 4, 5}
 fmt.Println(slice)

// スライスの追加append
slice = append(slice, 6)
fmt.Println(slice)

 // スライスの部分取り出し
fmt.Println(slice[1:4]) // [2,3,4]

MAP(連想配列/辞書)の扱い方

// マップの作成
user := map[string]int{
    "Alice": 25,
    "Bob":   30,
}
fmt.Println(user)

// 値の取得
age := user["Alice"]
fmt.Println("Alice's age:", age)

キーの存在チェック

if val, exists := user["Charlie"]; exists {
    fmt.Println("Charlie is", val)
} else {
    fmt.Println("Charlie not found")
}

キーの削除

delete(user, "Bob")
fmt.Println(user)

構造体(struct)

  • C言語のstructと似ています
  • . を使ってフィールドにアクセス
// 構造体の定義
type User struct {
    Name string
    Age  int
}

func main() {
    // インスタンス生成
    u := User{Name: "Alice", Age: 25}
    fmt.Println(u)

    // フィールドの変更
    u.Age = 26
    fmt.Println(u)
}

structにメソッドを定義する

// メソッドの定義(クラスのメソッドに相当)
func (u User) Greet() {
    fmt.Println("Hello, my name is", u.Name)
}

関数について

funcで関数を定義

func greet(name string) string {
    return "Hello, " + name
}

条件分岐

if文

  • ifは( )が不要
if x > 5 {
    fmt.Println("x is greater than 5")
} else {
    fmt.Println("x is 5 or less")
}

Goroutine(並行処理)

  • goをつけると新しいGoroutine(軽量スレッド)として並行実行される
package main

import (
    "fmt"
    "time"
)

func printMessage(msg string) {
    for i := 0; i < 5; i++ {
        fmt.Println(msg)
        time.Sleep(time.Millisecond * 500)
    }
}

func main() {
    go printMessage("Hello") // 並行処理で実行
    go printMessage("World") // 並行処理で実行

    time.Sleep(time.Second * 3) // メインスレッドが終了しないように待つ
}

Go言語のプロジェクトを実行する

go mod init <モジュール名>