## Go言語の特徴 * シンプル & 高速 * 文法がシンプルで読みやすい * コンパイルが速く、実行時も高速 * 静的型付け * int, string, bool などの型を明示(または推論) * 並行処理が得意(goroutine & channel) * 軽量スレッド(goroutine)を使って並行処理が簡単 * 単一バイナリでデプロイ * 依存関係を含む1つのバイナリで配布可能 * ガベージコレクション(GC)あり * 手動でメモリ管理しなくてもOK * クロスコンパイルが簡単 * Windows, Linux, macOS用のバイナリを簡単に作れる * Go言語にclassはない * 構造体(struct)+メソッド+インターフェースでオブジェクト指向のような設計は可能 ## 構文例 ```go package main import "fmt" func main() { fmt.Println("Hello, World!") } ``` * package * 名前空間(Namespace)のようなものです。 * `package main` は、Goプログラムのエントリーポイント(実行可能なプログラム) を示します。 * `import "fmt"` * 標準ライブラリのfmtパッケージ(文字列出力などの機能を持つ)です。 ## 書き方 ### 変数について ```go func main() { var message string = "Hello, Go!" fmt.Println(message) // 型推論 num := 42 fmt.Println(num) } ``` * `var`を使って明示的に型を指定できる * `:=`を使うと、型推論で自動的に型が決まる(関数内のみ) ### 配列・MAP(連想配列/辞書) #### 配列の扱い方 配列(固定長) ```go // 配列(固定長) var arr [3]int = [3]int{1, 2, 3} fmt.Println(arr) ``` 配列(可変長) ```go // 配列(固定長) 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(連想配列/辞書)の扱い方 ```go // マップの作成 user := map[string]int{ "Alice": 25, "Bob": 30, } fmt.Println(user) // 値の取得 age := user["Alice"] fmt.Println("Alice's age:", age) ``` キーの存在チェック ```sh 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と似ています * `.` を使ってフィールドにアクセス ```go // 構造体の定義 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にメソッドを定義する ```go // メソッドの定義(クラスのメソッドに相当) func (u User) Greet() { fmt.Println("Hello, my name is", u.Name) } ``` ### 関数について funcで関数を定義 ```go func greet(name string) string { return "Hello, " + name } ``` ### 条件分岐 **if文** * ifは( )が不要 ```go if x > 5 { fmt.Println("x is greater than 5") } else { fmt.Println("x is 5 or less") } ``` ### Goroutine(並行処理) * goをつけると新しいGoroutine(軽量スレッド)として並行実行される ```go 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言語のプロジェクトを実行する ```sh go mod init <モジュール名> ```