先日、Go言語のインターンに参加する機会がありました。そのため、その復習も兼ねて、Go公式チュートリアルの「A Tour of Go」に取り組んでいます。
今回はその中でも「Basics:variables, and functions」の章を進める中で、特にエクスポートのルールやパッケージの仕組みについて、分かりにくいと感じた部分を中心にまとめました。
間違いや勘違いがあればぜひコメントで教えていただけると嬉しいです🙇
Go初学者の方の参考になれば幸いです!
Export names (3/17ページ)
Goでは、大文字で始まる名前(関数・変数・構造体など)は「エクスポート」され、他のパッケージから参照できます。
逆に、小文字で始まる名前はパッケージ内でしか使えません。
パッケージとは?
パッケージとは、関連する機能をまとめたGoの「ファイルの集まり」のことです。
例えば以下のような構成の時は
application/
├── main.go ← package main に含まれるファイル
├── model/
│ └── user.go ← package model に含まれるファイル
└── handler/
└── user.go ← package handler に含まれるファイル
model/user.go
から handler/user.go
内に含まれる関数/変数を使いたいときは、 model/user.go
内に以下のように import
文を書きます。
import "application/handler"
「エクスポートされた名前」は別のパッケージから使える
Goでは、次のようなルールがあります:
-
Hoge
のように 大文字で始まる名前 → 外部パッケージからアクセス可能
これをPublic
と言います。 -
huga
のように 小文字で始まる名前 → 外部パッケージからアクセス不可
これをPrivate
と言います。
つまり、handler
パッケージ内に以下のような関数があった場合:
// エクスポートされる = Public
func Hoge() {
...
}
// エクスポートされない = Private
func huga() {
...
}
model/user.go
からは Hoge()
は呼び出せますが、huga()
は呼び出せません。
つまり、handler パッケージ内で定義された関数のうち、大文字で始まる Hoge は外部から見える(使える)のに対し、小文字で始まる huga は見えない(使えない)という違いがあります。
変数、構造体、構造体のフィールド、定数にも同じルールが適用されています。
標準パッケージのmathを使う例
package main
import (
"fmt"
"math"
)
func main() {
fmt.Println(math.Pi)
}
標準パッケージの math
をインポートすると、そこに含まれる Public変数のPi(円周率)を自分のファイル内でも使うことができます。
📦 パッケージをまたぐときは、大文字で始まる「エクスポート名」だけが使えます
📂 同じパッケージ内のファイル同士では、大文字・小文字に関係なくアクセスできます
🚫 他パッケージの小文字始まりの名前にはアクセスできません