如何在 Go 中的指针到指针上键入选择接口?

我有一对这样定义的接口:


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

我怎样才能从这个指针到指针类型获得我的接口类型而不需要打开每个可能的实现者类型?


慕容708150
浏览 170回答 2
2回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go