我有一对这样定义的接口:
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
我怎样才能从这个指针到指针类型到我的接口类型而不需要打开每个可能的实现类型?