\ Goを学び始めたとき、最初に持った疑問の1つは:
「実際にコードをどのように構造化すればいいのか?」
Cのような言語では、すべてを1つのファイルに入れるか、ヘッダーと実装ファイルを分けるのが一般的です。しかしGoでは、プロジェクト構造が重要です:それはコードのスケーラビリティ、テスト、共有のしやすさに影響します。この記事では、なぜ構造が重要なのか、異なるファイルから関数にアクセスする方法、そして私が前進するにつれて学んでいるベストプラクティスについて説明します。
Goプログラムは完全に1つのファイルに収めることができます:
package main import "fmt" func main() { fmt.Println("2 + 2 =", 2+2) }
これは「hello world」や簡単な実験には適しています。
しかし、より多くの機能(減算、乗算、除算など)を追加するとすぐに、ファイルは乱雑になりスケーラビリティが低下します。
ここでGoのパッケージとフォルダが役立ちます。
Goでは、すべてのファイルがパッケージに属します。
慣例により:
計算機プロジェクトをこのように分割しました:
calculator/ │ ├── main.go └── calculator/ └── operations.go
\
package calculator func Add(a, b int) int { return a + b } func Subtract(a, b int) int { return a - b } func Multiply(a, b int) int { return a * b } func Divide(a, b int) (int, error) { if b == 0 { return 0, fmt.Errorf("cannot divide by zero") } return a / b, nil }
package main import ( "fmt" "GoLang-progress/calculator" ) func main() { fmt.Println("2 + 3 =", calculator.Add(2, 3)) fmt.Println("10 - 4 =", calculator.Subtract(10, 4)) fmt.Println("6 * 7 =", calculator.Multiply(6, 7)) result, err := calculator.Divide(8, 0) if err != nil { fmt.Println("Error:", err) } else { fmt.Println("8 / 0 =", result) } }
main.goがクリーンになったことに注目してください:数学自体を気にする必要はなく、使い方だけを考えればよいのです。
初心者によくある質問:
「別のファイルやフォルダから関数を呼び出すにはどうすればいいですか?」
私のリポジトリでは、このように構造化しました:
calculator/ │ ├── main.go └── internal/ └── calc/ └── operations.go
ここでは、数学関数はinternal/calcの下にあります。
\
package calc import "fmt" func Add(a, b int) int { return a + b } func Divide(a, b int) (int, error) { if b == 0 { return 0, fmt.Errorf("cannot divide by zero") } return a / b, nil }
\
package main import ( "fmt" "github.com/turman17/GoLang-progress/calculator/internal/calc" ) func main() { fmt.Println("2 + 3 =", calc.Add(2, 3)) result, err := calc.Divide(10, 0) if err != nil { fmt.Println("Error:", err) } else { fmt.Println("10 / 2 =", result) } }
インポートはgo.modのモジュールパスとフォルダパスに一致する必要があります。
あなたのリポジトリでは、go.modには次のように記述されています:
module github.com/turman17/GoLang-progress
使用したい計算機コードはこのフォルダにあります:
calculator/internal/calc
したがって、完全なインポートパスは:
github.com/turman17/GoLang-progress/calculator/internal/calc
よくあるエラーと修正方法
❌ import "GoLang-progress/calculator/internal/calc"
→ GitHubの組織/ユーザー名が欠けています。完全なパスを使用する必要があります。
❌ import "github.com/turman17/GoLang-progress/internal/calc"
→ パスにcalculatorディレクトリが欠けています。
❌ go: module not found errors
→ go.modにmodule github.com/turman17/GoLang-progressがあることを確認し、go mod tidyを実行してください。
\
go run ./calculator
または
go build ./calculator
プロジェクトが成長するにつれて、よく見られるパターンは次のとおりです:
project-name/ │ ├── cmd/ → 実行可能ファイル(メインエントリーポイント) ├── internal/ → プライベートコード(外部使用不可) ├── pkg/ → 再利用可能なパッケージ ├── api/ → API定義(gRPC、OpenAPIなど) └── go.mod
初心者にとっては、これは過剰かもしれません。しかし、ウェブアプリ、サービス、またはMLOpsツールに移行するにつれて、このレイアウトは不可欠になります。
MLOpsとバックエンド開発のためにGoを探求する中で、学んだことを引き続き共有していきます。次回は:Goでのエラー処理とテストについてです。
\ 👉 私のリポジトリはこちら:https://github.com/turman17/GoLang-progress
次の記事もお楽しみに!
