三蔵開発メモ

Web開発やインフラ関連のメモを共有します

Goにおけるフォルダ(パッケージ)分け

Go言語の勉強を始めたので、基本のメモ。

環境

Go 1.12

フォルダ分け

Goはmain関数があるmainパッケージが処理の拠点として存在するが、 処理を切り分けたい場合はパッケージを作る。 以下の内容が書かれた、「main.go」というファイルがあるとする

package main

import (
    "fmt"
)

func main() {
    fmt.Println("hello world")
}

これをあえて以下のように切り分けたい場合

/prj
┣ main.go
┗ /print/print.go

print.goは以下のようにする

package print

import (
   "fmt"
)

func PrintHello(){
     fmt.Println("hello world")
}

main.goは以下のように書き換える

package main

import (
    "print"
)

func main() {
    print.PrintHello()
}

こちらのmain.goを実行すると最初に書いたmain.goと同じ動きをする。
fmtはprint側で呼び出して使っているため、importの必要がなくなる。
また、printとpackageに指定したprint.goを呼び出すときは、
importを使って呼び出す。
そうすると、「PrintHello」のように最初が大文字で設定してある関数はパブリックなため、
「パッケージ名.関数名」で呼び出すことができる。

その他

import(
   . "print"
)

上記のように「.」をimportするパッケージ前につけると、print.PrintHello()みたいにパッケージ名を前につけないで呼び出すこともできる。 「.」の代わりに「pri」とかつけてパッケージ名を指定のものに変えることもできる。

ネストしてるパッケージ

/prj
┣ main.go
┗ /print/printutil/print.go

上記のような階層にした場合は、

import (
"print/printutil"
)
main(){
  printutil.PrintHello()
}

上記のように呼び出す、print.goのパッケージ名はこの場合は「printutil」とする。