为了账号安全,请及时绑定邮箱和手机立即绑定

避免使用来自不同结构类型的相同值的重复函数

避免使用来自不同结构类型的相同值的重复函数

Go
猛跑小猪 2022-08-15 10:04:01
我有一个方法,应该得到不同的类型,建议如何解决这个问题,而不是重复的函数,基本上做同样的事情...(我想避免创建包装结构....)type A1 struct {    Spec              A1Spec    `json:"spec,omitempty"`    Status            A1Status `json:"status,omitempty"`    metav1.TypeMeta   `json:",inline"`    metav1.ObjectMeta `json:"metadata,omitempty"`}type B1 struct {    Spec               B1Spec   `json:"spec,omitempty"`    Status            B1Status `json:"status,omitempty"`    metav1.TypeMeta   `json:",inline"`    metav1.ObjectMeta `json:"metadata,omitempty"`}func ExecuteA1(ctx context.Context, a1 A1, Client client.Client) error {if a1.Spec.Type == "test" {….}}func ExecuteB1(ctx context.Context, b1 B1, Client client.Client) error {if  b1.Spec.Type == "test" {….}….}两个函数都做着一样,但类型不同,我想避免创建两个函数,它建议如何解决这个问题?https://play.golang.org/p/kV7s3LRd-eh
查看完整描述

1 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

通过使用接口。两者兼而有之,并实现一个接口,该接口具有获取(返回)类型的方法。那么你只需要一个需要这个接口类型值的函数,就可以调用接口定义的方法。然后,您可以传递 值 或 ,或者实现该接口的任何其他类型。A1B1Execute()A1B1


例如:


type HasType interface {

    GetType() string

}


func (a A1) GetType() string {

    return a.Spec.Type

 }


func (b B1) GetType() string {

    return b.Spec.Type

}


func Execute(ctx context.Context, foo HasType, Client client.Client) error {

    if foo.GetType() == "test" {

    }

}

你可以这样称呼它:


var a A1 = ...

var b B1 = ...


Execute(ctx, a, client)

Execute(ctx, b, client)

请参阅为什么 Golang 中需要接口?


另请注意,在此特定示例中,您可以只传递类型而不是 and ,因此可以省略接口和方法声明。A1B1


例如,你可以这样创建:Execute()


func Execute(ctx context.Context, typ string, Client client.Client) error {

    if typ == "test" {

    }

}

并这样称呼它:


var a A1 = ...

var b B1 = ...


Execute(ctx, a.Spec.Type, client)

Execute(ctx, b.Spec.Type, client)



查看完整回答
反对 回复 2022-08-15
  • 1 回答
  • 0 关注
  • 81 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信