first commit

This commit is contained in:
ry.yamafuji 2025-03-08 22:02:04 +09:00
commit a0a98c9c9f
6 changed files with 311 additions and 0 deletions

15
Dockerfile Normal file
View File

@ -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

73
README.md Normal file
View File

@ -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/)

10
docker-compose.yaml Normal file
View File

@ -0,0 +1,10 @@
services:
go-app:
build:
context: .
dockerfile: Dockerfile
container_name: go_app
tty: true
volumes:
- ./src:/app

206
docs/go言語.md Normal file
View File

@ -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 <モジュール名>
```

0
go.mod Normal file
View File

7
src/main.go Normal file
View File

@ -0,0 +1,7 @@
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}