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

一个类型何时应为包含另一个类型的结构,何时应仅“扩展”(?)该类型?

一个类型何时应为包含另一个类型的结构,何时应仅“扩展”(?)该类型?

Go
慕工程0101907 2021-05-07 14:19:01
我目前正在通过处理rosalind问题(基本上是一堆与生物信息学相关的代码katas)来学习Go 。我目前代表的是一种类型的DNA链:type DNAStrand struct {    dna byte[]}我最初的原因是封装字节片,所以我知道它只包含代表核苷酸的字节:'A', 'C', 'G', 'T'。我意识到这显然没有被保证,因为我可以简单地做到这一点:DNAStrand{[]byte("foo bar")}而且,不再保证我的dna链包含一个字节数组,其中只有这四个字节中的元素。由于我的结构仅包含一个字节数组,因此这样做是更好/更理想的方法:type DNAStrand []byte还是让该类型包含dna链更好?是否有使用任何两种方法的经验法则?
查看完整描述

3 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

具有零字段的结构很方便。具有许多领域的结构更加方便。仅具有一个字段的结构有点特殊,即使在“野外”经常看到它们,我也想不出在哪里使用它们的合理“好”案例。我,一个,不要使用它们。

无论如何,如果您真的真的需要更严格/更安全的DNAStrand切片内容安全性,那么可以使用单个字段结构并为此/此类命名类型定义参数检查设置方法。

在那种情况下,如果以后在其他软件包中使用该定义,则无法使用软件包unsafe进行模运算来规避检查并获得与您的DNAStrand{[]byte("foo bar")}示例相同的结果。


查看完整回答
反对 回复 2021-05-31
?
白板的微信

TA贡献1883条经验 获得超3个赞

以您的特定示例为例,我可能会执行以下操作:


type neucleotide char // unexported type users can't construct their own.


type DNAStrand []neucleotide // because users can't construct their own

                             // nucleotides they also can't construct their

                             // own DNAStrands.


const (

  // These are exported values so they can use these nucleotides to construct a

  // DNAStrand with.

  A nucleotide = 'A'

  C nucleotide = 'C'

  G nudleotide = 'G'

  T nucleotide = 'T'

)


// This function allows them to actually construct a DNAstrand with a list of

//  nucleotides from the constants above.

func New(nts ...nucleotide) DNAStrand {

    return nts

}

由于不输出核苷酸类型,因此用户无法构建自己的核苷酸。您在导出的const中提供了它们的唯一允许实例,因此没有用户可以提供自己的新核苷酸。


查看完整回答
反对 回复 2021-05-31
  • 3 回答
  • 0 关注
  • 202 浏览
慕课专栏
更多

添加回答

举报

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