commit a0a98c9c9f544308f2a2bc83ede2936e8f751afc Author: ry.yamafuji Date: Sat Mar 8 22:02:04 2025 +0900 first commit diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..93ec5f2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,15 @@ +# Start with a lightweight Alpine Linux base image +FROM golang:alpine + +# Install bash +RUN apk add --no-cache bash + +# Set the Current Working Directory inside the container +WORKDIR /app + +# Copy go mod and sum files +# COPY go.mod go.sum ./ + +# Download all dependencies. Dependencies will be cached if the go.mod and go.sum files are not changed +# RUN go mod download + diff --git a/README.md b/README.md new file mode 100644 index 0000000..bdcf13d --- /dev/null +++ b/README.md @@ -0,0 +1,73 @@ +## 開発環境 + +```sh +docker exec -it go_app /bin/bash +``` + +### goを実行する + +**一時的に実行する(go run)** + +* コンパイルせずに即実行 +* 一時的なテストや開発中に便利 +* go run は毎回コンパイルするので、本番運用には向かない + + +```sh +go run main.go +``` + +* `go run .` + * カレントディレクトリ内の main パッケージを実行 + +```sh +go run . +``` + + +**コンパイルして実行 (go build)** + +```sh +go build -o dist/app +``` + +* go build でバイナリを作成 +* エントリーポイントとしてmain.go(または package mainのあるファイル)が実行される +* ./dist/app で実行できる +* 本番環境ではこちらを使う + +## GO言語の概要 + +Go(またはGolang)は、Googleによって開発されたオープンソースのプログラミング言語です。 +シンプルで効率的なコードを書くことを目的としており、特に並行処理やネットワークプログラミングに強みを持っています。 + +### 特徴 + +- **シンプルな構文**: 学習曲線が緩やかで、読みやすく書きやすいコードが書けます。 +- **高いパフォーマンス**: コンパイルされたバイナリは高速で、メモリ管理も効率的です。 +- **並行処理**: Goroutineとチャネルを使用して、簡単に並行処理を実装できます。 +- **標準ライブラリ**: 豊富な標準ライブラリが提供されており、多くの機能を追加の依存関係なしに利用できます。 + +### インストール + +Goのインストール方法については、公式サイトの[インストールガイド](https://golang.org/doc/install)を参照してください。 + +### 簡単な例 + +以下は、Goで書かれた簡単な「Hello, World!」プログラムです。 + +```go +package main + +import "fmt" + +func main() { + fmt.Println("Hello, World!") +} +``` + +## 参考リンク + +- [公式サイト](https://golang.org/) +- [Goのドキュメント](https://golang.org/doc/) +- [Goのパッケージリポジトリ](https://pkg.go.dev/) diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..131f97d --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,10 @@ +services: + go-app: + build: + context: . + dockerfile: Dockerfile + container_name: go_app + tty: true + volumes: + - ./src:/app + diff --git a/docs/go言語.md b/docs/go言語.md new file mode 100644 index 0000000..753c96b --- /dev/null +++ b/docs/go言語.md @@ -0,0 +1,206 @@ + + +## 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 <モジュール名> +``` \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..e69de29 diff --git a/src/main.go b/src/main.go new file mode 100644 index 0000000..58760c8 --- /dev/null +++ b/src/main.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("Hello, World!") +}