次のように定義されたインターフェースのペアがあります。
type Marshaler interface {
Marshal() ([]byte, error)
}
type Unmarshaler interface {
Unmarshal([]byte) error
}
これらを実装する単純なタイプがあります:
type Foo struct{}
func (f *Foo) Marshal() ([]byte, error) {
return json.Marshal(f)
}
func (f *Foo) Unmarshal(data []byte) error {
return json.Unmarshal(data, &f)
}
別のインターフェイスを定義するライブラリを使用しており、次のように実装しています。
func FromDb(target interface{}) { ... }
渡される値target
は、ポインターへのポインターです。
fmt.Println("%T\n", target) // Prints **main.Foo
通常、この関数は型の切り替えを行い、その下の型で動作します。インターフェイスを実装するすべての型に共通のコードが必要ですUnmarshaler
が、特定の型のポインター ツー ポインターからインターフェイスへの取得方法がわかりません。
ポインターへのポインターでメソッドを定義することはできません。
func (f **Foo) Unmarshal(data []byte) error {
return json.Unmarshal(data, f)
}
// compile error: invalid receiver type **Foo (*Foo is an unnamed type)
ポインター型でレシーバー メソッドを定義することはできません。
type FooPtr *Foo
func (f *FooPtr) Unmarshal(data []byte) error {
return json.Unmarshal(data, f)
}
// compile error: invalid receiver type FooPtr (FooPtr is a pointer type)
キャストがUnmarshaler
機能しない:
x := target.(Unmarshaler)
// panic: interface conversion: **main.Foo is not main.Unmarshaler: missing method Unmarshal
へのキャストも*Unmarshaler
機能しません:
x := target.(*Unmarshaler)
// panic: interface conversion: interface is **main.Foo, not *main.Unmarshaler
このポインタからポインタへの型からインターフェイス型に、考えられるすべての実装型をオンにする必要なく、どのように取得できますか?