Go言語のパッケージについてもう一度みていく。
dir ├── main.go └── pac └── pac.go
上記のようにpacパッケージを作成し、nameとreadingフィールドを持ったPerson構造体を作成する。
この構造体に関連した関数を作成してみる。
pac/pac.go
package pac
//Person構造体を定義する type Person struct { name string reading string } func GetName() string { //usakoを返す関数を作成する return "usako" } func NewPerson() *Person { return new(Person) //構造体を取得するときはnewを使う。構造体を取得する関数を作成する } func (p *Person) GetName() string { //pacパッケージ内のperson構造体に紐づいた関数 //pはPerson構造体の入った変数。Person構造体のnameフィールドを取得する関数を作成する return p.name } func (p *Person) SetName(v string) { //pacパッケージ内のperson構造体に紐づいた関数 p.name = v //vをPerson構造体のnameフィールドに代入する関数を作成する }
次にpacディレクトリと同階層にmain.goファイルを作成し、下記のコードを実行する。
package main import ( "fmt" "./pac" ) func main() { name := pac.GetName() //pacパッケージの関数を呼び出す fmt.Println(name) }
上記を実行すると、usakoが返ってくる。パッケージ内の関数を呼び出すときは、関数名の前にパッケージのファイル名をつけることを忘れないようにする。
次に、構造体に紐付いた関数(メソッド)を呼び出してみる。
構造体のフィールドを使って、呼び出したい時は、下記のようにコードをmain.goに入力する。
package main import ( "fmt" "./pac" ) func main() { //Person構造体を持った空の変数personを取得する person := pac.NewPerson() //上のコードはperson := new(pac.Person)と同じ意味になる //取得したPersonのnameフィールドにkumataを代入する person.SetName("kumata") //変数personに.をつけた後GetNameをつけるとPerson構造体に紐付けた方の関数を実行する name = person.GetName() fmt.Println(name) }
これを実行すると、kumataが表示される。
前者のpac.GetName()では、当然ながらpac.Person構造体とは無関係なのでPerson構造体内の各フィールドを使用することが出来ないが、
person.GetName()の場合はpac.Person構造体に紐付いているため、関数内でPerson構造体内の各フィールドの値を使用することができる。