Go语言编写AWS服务工厂时*ecr.ECR与*ecs.ECS的公共返回类型是什么
解决方案
方案1:返回 interface{}(快速实现)
如果你的使用场景是调用GetService时明确知道传入的服务类型,后续会自行做类型断言处理,可以直接把返回值设为interface{},Go 1.18及以上版本也可以用别名any替代,效果完全一致。
修正后的代码示例:
func GetService(service string) interface{} { session, err := session.NewSession(&aws.Config{Region: aws.String(Region)}) if err != nil { // 建议补充错误处理逻辑 panic(err) } switch service { case "ecr": return ecr.New(session) case "ecs": return ecs.New(session) default: // 建议补充非法参数的处理逻辑 panic("unsupported service type") } }
使用时的类型断言示例:
ecrSvc := GetService("ecr").(*ecr.ECR) ecsSvc := GetService("ecs").(*ecs.ECS)
缺点:没有编译期类型校验,类型断言错误会在运行时才触发
方案2:自定义公共接口(更安全,推荐)
如果你调用返回的服务实例只会用到特定的几类方法,可以把这些方法抽象为公共接口,返回该接口类型,获得编译期类型检查能力。
比如你需要统一调用各服务的资源列举方法,可以定义如下接口:
type AWSService interface { ListResources(input interface{}) (interface{}, error) // 补充你需要用到的其他公共方法 }
然后为*ecr.ECR和*ecs.ECS实现这个接口:
func (s *ecr.ECR) ListResources(input interface{}) (interface{}, error) { return s.DescribeRepositories(input.(*ecr.DescribeRepositoriesInput)) } func (s *ecs.ECS) ListResources(input interface{}) (interface{}, error) { return s.DescribeClusters(input.(*ecs.DescribeClustersInput)) }
之后工厂函数的返回值就可以写AWSService:
func GetService(service string) AWSService { // 内部逻辑和方案1一致 }
优点:类型安全,编译期就能检查出方法调用错误,适合有统一操作服务的场景
内容的提问来源于stack exchange,提问作者coderelliot
相关产品推荐
相关产品推荐

