Go言語学習(ポインタ、構造体、メソッド)

Go におけるポインタとポインタ型

// var 変数名 *型名
var foo *string

変数宣言時、型名の先頭に * をつけるとポインタ型になる。

ポインタ型はメモリアドレスなので、どの型でもサイズが同じ。 ポインタ変数に型を指定する理由は、間接参照したときに本来の値が持つ型を意識する必要があるため。

構造体

JS でいう協議のオブジェクトに近いという理解をした。 宣言は struct でおこなう。

struct {
	fieldName fieldType
}

構造体は宣言しただけでは使えない。実際に値を入れるには、構造体変数を宣言する。

var hoge struct {
	foo string
	bar int
}
hoge.foo = "Hi"
hoge.bar = "10

上記を簡略化するとこんな感じ。 各フィールドの後には , をつける。最後のフィールドにたいしてもつける。

var hoge:= struct {
	foo string
	bar int
} {
	foo: "Hi",
	bar: 10,
}

type

type 修飾子を使うと、構造体に名前をつけることできる。(構造体だけに用いるものでもない)

type Hoge struct {
	foo string
	bar int
}

hogeVar1 := Hoge(
	foo: "Hello!"
	bar: 15
)

hogeVar2 := Hoge(
	foo: "Good night"
	bar: 99
)

メソッド

Go にもメソッドはあるが、クラスにたいしてメソッドを紐付けるのではなく、型に対してメソッドを紐付ける。

type Hoge struct {
	foo string
	bar int
}

// func (レシーバ値 レシーバー型) メソッド名(引数名 引数型) 戻り値 { }
func (h Hoge) sayHello() {
	fmt.Println("Hello!")
}

型から作成した変数(構造体)でメソッドを使う

型にメソッドをつけると、その型から作成した変数(構造体)でも同じメソッドを使える。

fooMan := Hoge {,"HogeHoge---", 10}

fooMan.sayHello();
// => Hello!