如何实现Go语言不同类型泛型接口间的动态转换适配器?
Go泛型适配器实现方案
要实现将Iface[A]适配为Iface[B]的核心思路是:创建一个包装结构体,它实现目标接口Iface[B],同时持有源接口Iface[A]的实例。在包装结构体的MyFunc方法中,完成B到A的类型转换,再调用源接口的MyFunc方法。
修正代码中的类型错误
首先注意,Go语言中基本类型int是小写,你的代码里Iface[Int]需要改为Iface[int]。
完整实现代码
package main import ( "fmt" "strconv" ) type Iface[T any] interface { MyFunc(T) } type Adapter[A any, B any] interface { Adapt(Iface[A]) Iface[B] } type StringToIntAdapter struct{} // 定义包装结构体,持有源接口实例 type stringToIntWrapper struct { src Iface[string] } // 实现Iface[int]接口的MyFunc方法 func (w stringToIntWrapper) MyFunc(num int) { // 将int转换为string,适配源接口的参数类型 str := strconv.Itoa(num) // 调用源接口的方法 w.src.MyFunc(str) } // 实现Adapter接口的Adapt方法 func (StringToIntAdapter) Adapt(src Iface[string]) Iface[int] { // 返回包装结构体实例,它实现了Iface[int] return stringToIntWrapper{src: src} } // 测试用例:实现Iface[string]的结构体 type StringHandler struct{} func (sh StringHandler) MyFunc(s string) { fmt.Printf("处理字符串:%s\n", s) } func main() { // 创建源接口实例 strHandler := StringHandler{} // 创建适配器 adapter := StringToIntAdapter{} // 适配为Iface[int] intHandler := adapter.Adapt(strHandler) // 调用适配后的方法 intHandler.MyFunc(123) // 输出:处理字符串:123 }
关键说明
- 包装结构体:
stringToIntWrapper是核心,它关联了源接口Iface[string],同时实现了目标接口Iface[int]。 - 类型转换逻辑:在
MyFunc方法中,根据业务需求完成int到string的转换(这里用strconv.Itoa),再传递给源接口的方法。 - 实例返回逻辑:
Adapt方法直接返回包装结构体的实例,无需额外“动态创建接口实例”——因为结构体只要实现了接口的所有方法,就自动成为该接口的实例。
如果需要适配其他类型(比如int转string、float64转int等),只需要:
- 定义对应的包装结构体
- 在
MyFunc中实现对应的类型转换逻辑 - 实现
Adapter接口的Adapt方法返回包装实例
内容的提问来源于stack exchange,提问作者LeKSuS
相关产品推荐
相关产品推荐

