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構造体内の各フィールドの値を使用することができる。




