第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

使用泛型實(shí)現(xiàn)可比較的結(jié)構(gòu)

使用泛型實(shí)現(xiàn)可比較的結(jié)構(gòu)

Go
胡說(shuō)叔叔 2022-11-08 15:13:30
考慮以下版本 go1.18beta2 linux/amd64 的代碼片段    type Vector[T comparable] struct {       data_ []T    }        func (v *Vector[T]) Contains(e T) bool {       for _, x := range v.data_ {          if x == e {             return true          }       }       return false    }        func TestVector(t *testing.T) {       v2 := Vector[Vector[int]]{}    }這不會(huì)編譯并給出錯(cuò)誤:“Vector[int] does not implement comparable”僅僅是因?yàn)閂ector沒有定義相等運(yùn)算符。但是,我找不到如何定義它們。問(wèn)題:這種創(chuàng)建可比較結(jié)構(gòu)的方法是否不允許,為什么?還是文檔還沒有寫好?
查看完整描述

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ò)誤的。


查看完整回答
反對(duì) 回復(fù) 2022-11-08
  • 1 回答
  • 0 關(guān)注
  • 88 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)