doupai8095 2019-07-17 08:54
浏览 45

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

I have a parent struct :

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

And two child structs :

type Plaintext BigPoly
type Ciphertext BigPoly

I would like to have functions accepting both Plaintext and Ciphertext. My solution is to use a function of the form :

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

and use a switch-case to decide what to do, but I find it troublesome and it can lead to very complicated cases if the number of inputs grows.

However since Plaintext and Ciphertext have exactly the same structure and internal variables and only differ in their name, is it possible to create a function accepting both Plaintext and Ciphertext in a cleaner way ? I.e. it doesn't care if it is a type Plaintext or Ciphertext, as long as it is a type BigPoly.

  • 写回答

1条回答 默认 最新

  • dongyongan9941 2019-07-17 09:05
    关注

    Use a non-empty interface:

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

    Then define your struct as:

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

    And your consumer as:

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

报告相同问题?

悬赏问题

  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?