パッケージ:Goコードの整理
パッケージ宣言、インポート、エクスポートされた名前
「パッケージ:Goコードの整理」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
パッケージとは
Goのすべてのソースファイルはパッケージに属します。パッケージ名はすべてのファイルの先頭に記述します。パッケージは関連するコードをまとめ、可視性を制御します:
// file: math/calc.go
package math
// Exported — accessible from other packages (capital letter)
func Add(a, b int) int { return a + b }
// Unexported — package-private (lowercase)
func helper() int { return 42 }パッケージ宣言とインポートパス
パッケージ名(短い名前)とインポートパス(完全なモジュールパス/ディレクトリ)は異なります:
// Import path: github.com/myapp/util/stringutil
// Package name: stringutil (last segment by convention)
package stringutil
func Reverse(s string) string {
r := []rune(s)
for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
r[i], r[j] = r[j], r[i]
}
return string(r)
}パッケージのインポート
他のパッケージを取り込むにはimportを使用します。Goでは、すべてのインポートを使用する必要があります:
package main
import (
"fmt" // standard library
"strings" // standard library
"github.com/myapp/util/math" // third-party or local
)
func main() {
fmt.Println(strings.ToUpper("hello"))
fmt.Println(math.Add(1, 2))
}エクスポートされた識別子とエクスポートされていない識別子
大文字で始まる識別子はエクスポートされた識別子(public)です。小文字で始まる識別子はエクスポートされていない識別子(package-private)です:
package server
// Exported: accessible from other packages
type Server struct {
Addr string // exported field
timeout int // unexported field
}
// Exported method
func (s *Server) Start() error { return nil }
// Unexported helper
func (s *Server) listen() {}package main と func main
mainパッケージは特別で、実行可能ファイルを定義します。main関数がエントリーポイントです:
package main
import "fmt"
func main() {
fmt.Println("Hello, Go!")
// Program starts here and ends here
}
// All other packages are libraries — no main() neededinit() 関数
各パッケージには1つ以上のinit()関数を定義できます。これらは自動的に、宣言された順序でmain()より前に実行されます:
package config
import "fmt"
var DB string
func init() {
DB = "localhost:5432/mydb"
fmt.Println("config package initialized")
}
// init runs once when the package is first imported
// Multiple init() functions per file/package are allowed副作用のためのブランクインポート
ブランク識別子を使用すると、init()の副作用だけを目的にパッケージをインポートできます:
package main
import (
"database/sql"
_ "github.com/lib/pq" // registers PostgreSQL driver via init()
)
func main() {
db, err := sql.Open("postgres", "host=localhost dbname=test")
_ = db
_ = err
}エイリアス付きインポート
名前の衝突を避けたり、名前を短くしたりするために、インポート時にパッケージ名を変更できます:
package main
import (
"fmt"
gomath "math" // alias to avoid collision
mymath "github.com/me/math"
)
func main() {
fmt.Println(gomath.Sqrt(16)) // 4
fmt.Println(mymath.Add(1, 2)) // 3
}パッケージの命名規則
Goのパッケージには、次の命名規則があります:
- 短く、小文字のみの1語にします:
http、json、fmt - ディレクトリ名と一致させます:
util/stringutil/→ パッケージstringutil - パッケージ名にアンダースコアやcamelCaseは使用しません
util、common、helperのような一般的すぎる名前は避けます- パッケージ名は識別子の一部です。
httplib.HTTPClientよりhttp.Clientを優先します
循環インポート
Goでは循環インポートは許可されていません。BがAをインポートしている場合、パッケージAはBをインポートできません。共有コードを3つ目のパッケージに切り出して解決します:
// WRONG: A imports B, B imports A — compile error
// package a imports "myapp/b"
// package b imports "myapp/a"
// SOLUTION: extract shared types to package c
// package a imports "myapp/c"
// package b imports "myapp/c"
// No circular dependencyクイックチェック
Goで識別子がエクスポートされる条件は何ですか?
まとめ:パッケージ
パッケージの主な概念:
- すべてのファイルは
package nameで始まります - 大文字はエクスポート済み(public)、小文字はエクスポートされていない(package-private)ことを表します
- 完全なパスでインポートし、短いパッケージ名で使用します
init()はmain()より前に自動的に実行されます- 副作用だけを目的とする場合はブランクインポート
_ "pkg"を使用します - 循環インポートは許可されていません
よくある質問
「パッケージ:Goコードの整理」レッスンは無料ですか?
はい。「パッケージ:Goコードの整理」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「パッケージ:Goコードの整理」で何を学びますか?
パッケージ宣言、インポート、エクスポートされた名前 ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「パッケージ:Goコードの整理」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- パッケージ:Goコードの整理
- go modによるGo Modules
- 外部依存関係の追加
- 内部パッケージとワークスペース