You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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等),只需要:

  1. 定义对应的包装结构体
  2. 在MyFunc中实现对应的类型转换逻辑
  3. 实现Adapter接口的Adapt方法返回包装实例

内容的提问来源于stack exchange,提问作者LeKSuS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 12:37:33