结构嵌入,函数输入,多态

时间:2019-07-17 08:54:16

标签: function go input struct types

我有一个父结构:

type BigPoly struct{
    Value []*ring.Poly
}

和两个子结构:

type Plaintext BigPoly
type Ciphertext BigPoly

我想具有同时接受纯文本和密文的功能。我的解决方案是使用以下形式的功能:

func Add(a *Ciphertext, b interface{}) (*Ciphertext)

并使用切换案例来决定要做什么,但是我发现这很麻烦,而且如果输入数量增加,可能会导致非常复杂的案例。

但是,由于Plaintext和Ciphertext具有完全相同的结构和内部变量,并且名称不同,是否有可能创建一种以更简洁的方式同时接受Plaintext和Ciphertext的函数?即只要是BigPoly类型,它就不管是纯文本还是密文。

1 个答案:

答案 0 :(得分:0)

使用非空接口:

type Poly interface {
    Value() []*ring.Poly
}

然后将您的结构定义为:

type BigPoly struct{
    value []*ring.Poly
}

func (p *BigPoly) Value() []*ring.Poly {
    return p.value
}

您的消费者为:

func Add(a, b Poly) Poly {
    aValue := a.Value()
    bValue := b.Value()
    // ... do something with aValue and bValue
}