Go におけるポインタとポインタ型
go1// var 変数名 *型名 2var foo *string 3
変数宣言時、型名の先頭に *
をつけるとポインタ型になる。
ポインタ型はメモリアドレスなので、どの型でもサイズが同じ。 ポインタ変数に型を指定する理由は、間接参照したときに本来の値が持つ型を意識する必要があるため。
構造体
JS でいう協議のオブジェクトに近いという理解をした。
宣言は struct
でおこなう。
go1struct { 2 fieldName fieldType 3} 4
構造体は宣言しただけでは使えない。実際に値を入れるには、構造体変数を宣言する。
go1var hoge struct { 2 foo string 3 bar int 4} 5hoge.foo = "Hi" 6hoge.bar = "10 7
上記を簡略化するとこんな感じ。
各フィールドの後には ,
をつける。最後のフィールドにたいしてもつける。
go1 2var hoge:= struct { 3 foo string 4 bar int 5} { 6 foo: "Hi", 7 bar: 10, 8} 9
type
type
修飾子を使うと、構造体に名前をつけることできる。(構造体だけに用いるものでもない)
go1type Hoge struct { 2 foo string 3 bar int 4} 5 6hogeVar1 := Hoge( 7 foo: "Hello!" 8 bar: 15 9) 10 11hogeVar2 := Hoge( 12 foo: "Good night" 13 bar: 99 14) 15 16
メソッド
Go にもメソッドはあるが、クラスにたいしてメソッドを紐付けるのではなく、型に対してメソッドを紐付ける。
go1 2type Hoge struct { 3 foo string 4 bar int 5} 6 7// func (レシーバ値 レシーバー型) メソッド名(引数名 引数型) 戻り値 { } 8func (h Hoge) sayHello() { 9 fmt.Println("Hello!") 10} 11
型から作成した変数(構造体)でメソッドを使う
型にメソッドをつけると、その型から作成した変数(構造体)でも同じメソッドを使える。
go1 2fooMan := Hoge {,"HogeHoge---", 10} 3 4fooMan.sayHello(); 5// => Hello! 6 7 8
よかったらシェアしてください!