はじめに
題名の通りです。使用言語がJavaからGolangへ変わり、ポインタで苦しんでおります。
前提
// インターフェース
type MyInterface interface {
method1() int
method2() int
}
// レシーバー
type MyStruct struct {
int1 int
int2 int
}
func (s MyStruct) method1() int { return s.int1 }
func (s MyStruct) method2() int { return s.int2 }
// ポインタレシーバー
type MyStructWithPtrReceiver struct {
int1 int
int2 int
}
func (s *MyStructWithPtrReceiver) method1() int { return s.int1 }
func (s *MyStructWithPtrReceiver) method2() int { return s.int2 }
ポインタについておさらい
var myStruct1 MyStruct = MyStruct{}
var ptrOfMyStruct1 *MyStruct = &MyStruct{}
var ptrOfMyStruct2 *MyStruct = &myStruct1
var myStruct2 MyStruct = *ptrOfMyStruct1
/*
* mystruct MyStruct ---(&myStruct)---------------------> *Mystruct
*
* MyStruct <--(*ptrOfMyStruct)--- ptrOfMyStruct *MyStruct
*/
-
Struct
型のポインタ型は*Struct
-
&struct
で実体struct
からポインタを取得 -
*pointer
でポインタpointer
から実体を取得
今回のハマりポイント
var myIF1 MyInterface = MyStruct{}
var myIF2 MyInterface = &MyStruct{}
// var myIF3 MyInterface = MyStructWithPtrReceiver{} -> コンパイルエラー
var myIF4 MyInterface = &MyStructWithPtrReceiver{}
- 値レシーバでメソッドを実装した
MyStruct
型- 実体
MyStruct{}
をMyInterface
型で受けられる - ポインタ
&MyStruct{}
をMyInterface
型で受けられる
- 実体
- ポインタレシーバでメソッドを実装した
MyStructWithPtrReceiver
型- 実体
MyStructWithPtrReceiver{}
はMyInterface
型で受けられない - ポインタ
&MyStructWithPtrReceiver{}
ならMyInterface
型で受けられる
- 実体