1 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超2個(gè)贊
約束comparable由語(yǔ)言規(guī)范預(yù)先聲明和支持。您不能“手動(dòng)”使類型實(shí)現(xiàn)它。該文檔在規(guī)范中可用(在Type Constraints下):
預(yù)先聲明的接口類型可比較表示所有可比較的具體(非接口)類型的集合。具體來(lái)說(shuō),類型 T 在以下情況下實(shí)現(xiàn)可比較:
T不是接口類型,T支持操作 == 和 !=; 或者
T是一個(gè)接口類型,并且類型T集中的每個(gè)類型都實(shí)現(xiàn)了可比性。
您的類型Vector[T comparable]不滿足任何這些條件。它不是接口類型,也不支持相等操作,因?yàn)樗囊粋€(gè)字段data_ []T由于是切片而無(wú)法比較——即使元素類型受comparable.
約束的目的comparable實(shí)際上只是允許使用==和!=運(yùn)算符編寫通用代碼。如果一個(gè)類型在設(shè)計(jì)上是不可比較的,那么你就不能編寫這樣的代碼。即使Vector沒有類型參數(shù)也是如此。
如果您的目標(biāo)是實(shí)例化Vector[Vector[T]]并允許在 的實(shí)例之間進(jìn)行相等性測(cè)試Vector[T],您可能需要添加一個(gè)Equal處理此特定用例的方法——只允許使用與接收器相同的類型參數(shù)實(shí)例化的向量:
func (v *Vector[T]) Equal(e Vector[T]) bool {
// test equality in a way that makes sense for this type
}
值得一提的是,有一種方法可以自行Vector[T comparable]比較,data_即將字段更改為指向切片的指針:
type Vector[T comparable] struct {
data_ *[]T
}
Vector[Vector[int]]現(xiàn)在用編譯實(shí)例化。然而,除了用結(jié)構(gòu)字面量(操場(chǎng))進(jìn)行初始化非常麻煩之外,它還帶有指針比較的所有警告。進(jìn)一步來(lái)說(shuō):
如果兩個(gè)指針值指向同一個(gè)變量,或者兩者的值都為零,則它們的值相等。指向不同的零大小變量的指針可能相等,也可能不相等。
現(xiàn)在比較測(cè)試和字段中x == e存儲(chǔ)的內(nèi)存地址是否相同。這可能會(huì)扭曲比較兩個(gè)實(shí)例的語(yǔ)義——如果兩個(gè)向量實(shí)例持有對(duì)同一切片的引用,那么說(shuō)它們相等是否正確?也許。這取決于您的程序想要做出的假設(shè)。就個(gè)人而言,我認(rèn)為這實(shí)際上并不比使用單獨(dú)的方法和/或重新設(shè)計(jì)數(shù)據(jù)類型更好,但像往常一樣,YMMV。data_xeVector[T]Equal
另請(qǐng)注意,如果您實(shí)例化為Vector[float64]并比較NaN值,則比較將是錯(cuò)誤的。
- 1 回答
- 0 關(guān)注
- 88 瀏覽
添加回答
舉報(bào)