Go言語のパッケージについてもう一度みていく。

Go言語でpackage

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