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

我目前正在通过处理rosalind问题(基本上是一堆与生物信息学相关的代码katas)来学习Go 。


我目前代表的是一种类型的DNA链:


type DNAStrand struct {

    dna byte[]

}

我最初的原因是封装字节片,所以我知道它只包含代表核苷酸的字节:'A', 'C', 'G', 'T'。我意识到这显然没有被保证,因为我可以简单地做到这一点:


DNAStrand{[]byte("foo bar")}

而且,不再保证我的dna链包含一个字节数组,其中只有这四个字节中的元素。


由于我的结构仅包含一个字节数组,因此这样做是更好/更理想的方法:


type DNAStrand []byte

还是让该类型包含dna链更好?是否有使用任何两种方法的经验法则?


慕工程0101907
浏览 203回答 3
3回答

慕少森

具有零字段的结构很方便。具有许多领域的结构更加方便。仅具有一个字段的结构有点特殊,即使在“野外”经常看到它们,我也想不出在哪里使用它们的合理“好”案例。我,一个,不要使用它们。无论如何,如果您真的真的需要更严格/更安全的DNAStrand切片内容安全性,那么可以使用单个字段结构并为此/此类命名类型定义参数检查设置方法。在那种情况下,如果以后在其他软件包中使用该定义,则无法使用软件包unsafe进行模运算来规避检查并获得与您的DNAStrand{[]byte("foo bar")}示例相同的结果。

白板的微信

以您的特定示例为例,我可能会执行以下操作: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中提供了它们的唯一允许实例,因此没有用户可以提供自己的新核苷酸。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go