2013年1月19日土曜日

Go言語で独自パッケージを作成する


こんにちは。scarvizです。

今回は独自パッケージの作り方を紹介します。
環境はUbuntu12.04(x86)です。

今回参考にしたのは以下になります。
http://blog.daisukeyamashita.com/post/1209.html
http://www.youtube.com/watch?v=XCsL89YtqCs

また、今回用意したコードはやしさんのAndrogを参考にしました。
http://androg.seesaa.net/article/309399599.html




■エクスポートする
まずはパッケージ対象となるファイルを作ります。
例えば以下のようなコードを書いたとします。

package main

import "fmt"

func main() {
 fmt.Println("Hello, 世界")
 myPrint("Hello, 世界")
}

func myPrint(str string) {
 var reverse string
 for _, s := range str {
  reverse = string(s) + reverse
 }
 fmt.Println(reverse)
}

結果:
Hello, 世界
界世 ,olleH

myPrint関数を独自パッケージで定義したいとします。
インポートされるパッケージの関数を呼び出すには、その関数がエクスポートされている必要があります。
エクスポートの仕方は、その関数の名前の先頭文字を大文字にするだけです。
myPrint関数のエクスポートは以下のように先頭大文字にしてあげます。

func MyPrint(str string) {
 var reverse string
 for _, s := range str {
  reverse = string(s) + reverse
 }
 fmt.Println(reverse)
}


■パッケージ分けする
次にパッケージ分けをします。独自パッケージ名を「mypackage」としようと思います。
mypackageディレクトリを作成し、その中に新たにファイルを用意して、そのファイルにMyPrint関数を定義します。

package mypackage

import "fmt"

func myPrint(str string) {
 var reverse string
 for _, s := range str {
  reverse = string(s) + reverse
 }
 fmt.Println(reverse)
}

main関数のあるファイルを以下のように編集します。

package main

import (
 "fmt"
 mypac "mypackage"
)

func main() {
 fmt.Println("Hello, 世界")
 mypac.MyPrint("Hello, 世界")
}

おまけですが、ここでは独自パッケージのmypackageインポートする時に、mypacという別名を付けてみました。
ちょっと長いなと思ったりしたときは、こんな感じにするとすっきりすると思います。


■パスを通す
現在、階層は以下になっているものとします。
・main関数を定義したファイルがあるのは
$HOME/gosample/src

・独自パッケージのファイルがあるのは
$HOME/gosample/src/mypackage

GOPATHに$HOME/gosampleのパスを通します。
パスを通すには、profileを編集します。
下記コマンドを実行してください。

gedit ~/.profile

※余談ですが、最近gedit使ってます。

下部に次の一行を追加してください。もしGOPATHに何かパスを設定している場合は、その後に「:」をつけて、パスを追記してください。

export GOPATH=$HOME/gosample

保存した後、パスを有効にするには下記コマンドを実行してください。

source ~/.profile


もし、一時的にパスを通すだけなら、下記コマンドを実行するのでもOKです。

export GOPATH=$HOME/gosample


■パッケージを作る
カレントディレクトリが、「$HOME/gosample/src」とします。
以下コマンドを実行してください。

go build mypackage
go install mypackage

すると、「$HOME/gosample」以下に「pkg」ディレクトリが出来ていると思います。
その下には「mypackage.a」が出来ていると思います。
「*.a」はライブラリファイルになります。
パッケージ化はこれで出来たことになります。

main関数のあるファイルを「go run」で実行してみてください。
最初の結果と同じ結果が出力されていると思います。


これを応用すれば、以前に紹介したgo-uiのようにgitを利用して、独自パッケージを世界に展開ってのも出来るようになりますね。

0 件のコメント:

コメントを投稿