production.log

ピクスタ株式会社で開発部の部長をやっている星直史のブログです。

Go言語でパッケージを作る方法

概要

Goでスクリプトを書いていると、巨大なmain関数ができてしまったり、1つのファイルに色々な関数がごちゃまぜになることはよくあります。 そこで、今回はGo言語のパッケージを作る方法について紹介します。

元々のスクリプト

下記のスクリプトをパッケージ化していくことを想定して説明します。

package main

import "fmt"

func foo(num int) int{
  return num * num
}

func main(){
  fmt.Println(foo(5))
}

main関数からfoo関数を呼んでいます。
foo関数は引数でint型を受け取り、引数を引数で除算した値を戻り値とします。

foo関数のパッケージ化

フォルダ構成の変更

まず、パッケージ化するために新たにフォルダを作成します。

mkdir sample

作成したフォルダにfoo.goを配置します。
この時点でのフォルダ構成は下記の通りです。

.
├── main.go
└── sample
    └── foo.go

foo.goの修正

配置したfoo.goの内容は下記の通りです。

package sample // 1

func Foo(num int) int{ // 2
  return num * num
}

パッケージ化するには、パッケージ化対象のファイルの先頭にpackage {パッケージ名}とします。
今回は、sampleフォルダを作っているので、パッケージ名をsampleにします。

また、関数名は大文字から始めます。
これはGo言語の仕様で、名前の先頭一文字が大文字になっていれば、パッケージの利用者側から参照可能となるためです。

main関数の修正

main関数は下記の通りに修正します。

package main

import (
  "fmt"
  "./sample" // 1
)

func main(){
  fmt.Println(sample.Foo(5)) // 2
}

sampleパッケージを作成したので、それを参照しなければなりません。
パッケージの参照はimport文の中で指定します。参照先は相対パスになります。

最後に、foo.goで定義した関数を呼び出します。
呼び出し方はパッケージ名.関数名となります。今回だとsample.Foo(5)です。

まとめ

今回はGo言語のパッケージについて紹介しました。

Go言語のパッケージ化は下記を行うだけです。

  • パッケージ化したい関数などを別フォルダの別ファイルとして定義し、関数名を大文字にする
  • パッケージ化したものをimportし、package名.関数名で呼び出す

パッケージ化することにより、あるまとまった機能単位に分割ができます。
何も考えずに書いてしまうと、ついmain関数が肥大化してしまうので注意が必要です。