2

私は現在、ロザリンドの問題(基本的には、一連のバイオインフォマティクス関連のコード カタ) を実行して Go を学習しています。

私は現在、次のタイプの DNA ストランドを表しています。

type DNAStrand struct {
    dna byte[]
}

私の最初の理由は、バイト スライスをカプセル化して、ヌクレオチドを表すバイトのみが含まれていることがわかるようにすることでした: 'A', 'C', 'G', 'T'. 私は単純にできるので、これは明らかに保証されていないことに気付きました:

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

そして、私の DNA ストランドに、これらの 4 バイトの要素のみを含むバイト配列が含まれているという保証はなくなりました。

私の構造体にはバイト配列のみが含まれているため、実行する方が良い/より理想的です:

type DNAStrand []byte

それとも、型に DNA 鎖を含ませたほうがよいのでしょうか? 2 つのアプローチのいずれかをいつ使用するかについての経験則はありますか?

4

3 に答える 3

11

あなたの具体的な例を挙げると、おそらく次のようなことをするでしょう:

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 でそれらの唯一の許可されたインスタンスを提供するため、ユーザーは独自の新しいヌクレオチドを提供できません。

于 2013-01-09T19:05:07.910 に答える
2

フィールドがゼロの構造体は便利です。多くのフィールドを持つ構造体はさらに便利です。ちょうど1つのフィールドを持つ構造体は少し特殊であり、「野生で」定期的に見られるにもかかわらず、それらを使用する合理的に「良い」ケースを考えることはできません。私は、例えば、それらを使用しません。

とにかく、スライスコンテンツに関してより厳密で防弾の安全性が本当に必要な場合DNAStrandは、単一フィールド構造体を使用して、この/そのような名前付きタイプの引数チェックセッターメソッドを定義することができます。

その場合、後で定義が他のパッケージから使用された場合、モジュロでパッケージを安全に使用せずに、チェックを回避して、例と同等の結果を得る方法はありませんDNAStrand{[]byte("foo bar")}

于 2013-01-09T13:39:06.230 に答える
1

type DNAStrand []byteシンプルで正規表現を使用できるので使用します。私はおそらく、すべてのバイトがACGTにあることをチェックする初期化関数を使用します。

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

func DNAStrandForString(s string) DNAStrand {
    if !validDNAStrandPat.Match(s) {
        panic("Invalid DNA Strand.")
    }
    return DNAStrand([]byte(s))
}
于 2013-01-09T22:47:48.767 に答える