不同类型泛型接口之间的动态转换

问题描述 投票:0回答:1

假设我有以下通用接口:

type Iface[T any] interface {
    MyFunc(T)
}

我想实现“适配器”或“转换器”类,它有助于在不同类型的接口之间进行转换。本质上,它包装了

Iface[A]
,使其表现得像
Iface[B]
:

type Adapter[A any, B any] interface {
    Adapt(Iface[A]) Iface[B]
}

所以,我不知道如何编写

Adapt
函数:

type Iface[T any] interface {
    MyFunc(T)
}

type Adapter[A any, B any] interface {
    Adapt(Iface[A]) Iface[B]
}

type StringToIntAdapter struct {
}

func (StringToIntAdapter) Adapt(Iface[string]) Iface[Int] {
    // ???
}

我认为我需要以某种方式在适配器内部动态创建接口的新实例。但我找不到任何关于如何做到这一点的提示。

go generics adapter
1个回答
0
投票

诸如

Iface[string]
之类的接口是通过声明
MyFunc(string)
方法的类型来实现的。同样,
Iface[int]
由声明
MyFunc(int)
的类型实现。

您的问题和您的

Adapt
函数相当于问“如何在具有
MyFunc(string)
方法的类型与具有
MyFunc(int)
方法的类型之间转换?”。

抽象来说,这是没有意义的。接口描述了一种行为。要在接口之间进行转换,实现类型要么表现出两种行为,要么不表现出两种行为。

如果它表现出两种行为,例如该类型同时具有

MyFunc(string)
MyFunc(int)
方法,您可以通过断言将一个接口更改为另一个接口。

var a Iface[string] = // ... assign some concrete value
var b Iface[int] = a.(Iface[int])

如果类型不表现出这两种行为,则您定义的

Adapt
方法无法工作。您必须指定实现
Iface[T]
的类型如何将其行为更改为另一个
Iface[U]

例如通过定义附加接口:

type Convertable[T, U any] interface {
    Iface[T]
    Convert() Iface[U]
}

func Adapt(v Convertable[string, int]) Iface[int] {
    return v.Convert()
}

这强制要求您传递给

Adapt
的任何类型都会实现一种将自身更改为所需输出接口的方法。然后,每种类型都必须通过实现
Convert() Iface[U]
方法来指定自己的逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.