在不与参数类型紧密耦合的情况下将参数传递给函数的最佳方法是什么?

时间:2019-07-12 16:11:02

标签: go interface reusability

我有两个结构,每个结构都有整数字段a,b。现在我想编写一个称为sum的函数,结果为a + b

type Type1 struct {
    a int64
    b int64
}

type Type2 struct {
    a int64
    b int64
}

func sum(details Type1) int64 {
    return details.a + details.b
}

func sum2(details Type2) int64 {
    return details.a + details.b
}

func main() {
    type1Obj: = Type1 {}
    type2Obj: = Type2 {}
    sum(type1Obj)
    sum2(type2Obj)
}

实际:由于类型的原因,我正在为相同的行为创建两个函数。

预期:我需要借助单个函数来解决用例。

1 个答案:

答案 0 :(得分:1)

这是界面的经典用法。

// There is some interface that expresses the behaviors you need
type Summable interface {
    A() int64
    B() int64
}

// And it can be summed
func sum(s Summable) int64 {
    return s.A() + s.B()
}

然后,您可以使各种类型符合Summable:

type Type1 struct {
    a int64
    b int64
}

// Type1 conforms to Summable
func (t Type1) A() int64 { 
    return t.a 
}

func (t Type1) B() int64 {
    return t.b
}

type Type2 struct {
    a int64
    b int64
}

// And so does Type2
func (t Type2) A() int64 { 
    return t.a 
}

func (t Type2) B() int64 {
    return t.b
}

然后您可以对任何Summable类型求和:

func main() {
    type1Obj := Type1 {}
    type2Obj := Type2 {}
    println(sum(type1Obj))
    println(sum(type2Obj))
}

Playground