亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

一個類型何時應為包含另一個類型的結構,何時應僅“擴展”(?)該類型?

一個類型何時應為包含另一個類型的結構,何時應僅“擴展”(?)該類型?

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 關注
  • 233 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號