当前位置: 首页 > 知识库问答 >
问题:

什么时候一个类型应该是一个包含另一个类型的结构,什么时候它应该只是“扩展”(?)那种类型?

楚涵润
2023-03-14

我目前正在学习做rosalind问题(基本上是一堆与生物信息学相关的代码)。

我目前正在用以下类型表示一条DNA链:

type DNAStrand struct {
    dna byte[]
}

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

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

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

因为我的结构只包含一个字节数组是更好/更理想的做法:

type DNAStrand []byte

还是让类型包含dna链更好?对于何时使用这两种方法中的任何一种,是否有经验法则?

共有3个答案

农诚
2023-03-14

我会使用类型DNAStrand[]byte,因为它很简单,而且我可以在上面使用regexps。我可能会使用一个初始化函数来检查每个字节是否在ACGT中。

var validDNAStrandPat = regexp.MustCompile("[ACTG]*")

func DNAStrandForString(s string) DNAStrand {
    if !validDNAStrandPat.Match(s) {
        panic("Invalid DNA Strand.")
    }
    return DNAStrand([]byte(s))
}
龚勇锐
2023-03-14

零字段的结构很方便。具有许多字段的结构更加方便。只有一个字段的结构有点特殊,我想不出一个合理的“好”案例来使用它们——尽管它们经常在“野外”被看到。就我而言,我不使用它们。

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

在这种情况下,如果定义稍后从其他包中使用,就没有办法绕过检查并获得与您的DNAStrand{[]byte("foo bar")}示例等效的结果。

马亮
2023-03-14

以您的具体示例为例,我可能会这样做:

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
}

由于核苷酸类型未导出,用户无法构建自己的类型。您在导出的常量中提供了它们的唯一允许实例,因此用户无法提供自己的新核苷酸。

 类似资料:
  • 我目前正在通过做rosalind问题(基本上是一堆生物信息学相关的代码katas)来学习Go。 我当前表示的DNA链类型为: 我最初的原因是封装字节片,这样我就知道它只包含代表核苷酸的字节:。我意识到这显然不是瓜分,因为我可以简单地做到: 由于我的结构只包含一个字节数组,这样做是否更好/更理想: 还是让类型包含dna链更好?对于何时使用这两种方法中的任何一种,有什么经验法则吗?

  • 问题内容: 我目前正在通过处理rosalind问题(基本上是一堆与生物信息学相关的代码katas)来学习Go 。 我目前用一种类型代表一条DNA链: 我最初的原因是封装字节片,所以我知道它只包含代表核苷酸的字节:。我意识到这显然没有被保证,因为我可以这样做: 并且不再保证我的dna链包含一个字节数组,其中只有这四个字节中的元素。 由于我的结构仅包含一个字节数组,因此这样做是更好/更理想的方法: 还

  • 我看到越来越多的软件组织在其面向服务的架构中使用gRPC,但人们也仍然在使用REST。在什么用例中使用gRPC是有意义的,什么时候使用REST进行服务间通信是有意义的? 有趣的是,我遇到过同时使用REST和GRPC的开源项目。例如,Kubernetes和Docker Swarm都在某种程度上使用gRPC来进行集群协调,但也公开了REST API来与主/主节点进行接口。为什么不上下使用gRPC?

  • 问题内容: 什么时候应该创建一个检查异常,什么时候应该创建一个运行时异常? 例如,假设我创建了以下类: 我应该如何创建我的?它应该扩展还是?还是我应该只使用它? 问题答案: 在这个话题上有很多分歧。在我的上一份工作中,我们遇到了一些实际问题,运行时异常被遗忘了,直到它们出现在生产环境中(在ageswards.com上),因此我们决定只使用已检查的异常。 在我目前的工作中,我发现在很多情况下都有很多

  • 邮件列表和网上讨论中似乎经常出现的一个话题是攻读计算机科学学位的优点(或不足)。对于否定的一方来说,一个似乎一再出现的论点是,他们已经编码了一些年了,他们从来没有使用过递归。 所以问题是: 什么是递归? 何时使用递归? 为什么人们不使用递归?

  • 给定一个呈现其子级的简单组件: 问题:儿童道具的道具类型应该是什么? 当我将其设置为对象时,当我使用具有多个子级的组件时,它会失败: 警告:失败的道具类型:提供给