我有一个父结构:
type BigPoly struct{
Value []*ring.Poly
}
和两个子结构:
type Plaintext BigPoly
type Ciphertext BigPoly
我想具有同时接受纯文本和密文的功能。我的解决方案是使用以下形式的功能:
func Add(a *Ciphertext, b interface{}) (*Ciphertext)
并使用切换案例来决定要做什么,但是我发现这很麻烦,而且如果输入数量增加,可能会导致非常复杂的案例。
但是,由于Plaintext和Ciphertext具有完全相同的结构和内部变量,并且名称不同,是否有可能创建一种以更简洁的方式同时接受Plaintext和Ciphertext的函数?即只要是BigPoly类型,它就不管是纯文本还是密文。
答案 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
}