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

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

帶有空接口的“通用”代碼中的強制類型

帶有空接口的“通用”代碼中的強制類型

Go
人到中年有點甜 2021-05-07 18:27:25
我正在閱讀這本書http://algs4.cs.princeton.edu/home/,我認為將Go中的示例作為學習練習來實現(xiàn)會很好,但是該書使用Java作為其語言來描述。第一章中的一章討論了設置一些核心數(shù)據(jù)類型/容器樣式類以供以后重用,但是我很難將它們設置為Go設置,這主要是因為這些數(shù)據(jù)類型似乎喜歡使用Java泛型。例如,我編寫了以下代碼package bagtype T interface{}type Bag []Tfunc (a *Bag) Add(t T) {    *a = append(*a, t)}func (a *Bag) IsEmpty() bool {    return len(*a) == 0}func (a *Bag) Size() int {    return len(*a)}從某種意義上說,這可以正常工作,我可以將項目添加到中,Bag并檢查其大小和所有內(nèi)容。但這也意味著以下代碼是合法的a := make(bag.Bag,0,0)a.Add(1)a.Add("Hello world!")a.Add(5.6)a.Add(time.Now())我只是想知道是否有任何強制類型的方式,使其符合類似于以下內(nèi)容的合同Bag<T> bagOfMyType = new Bag<T>()例如Bag<Integer> bagOfInts = new Bag<Integer>()我知道Go沒有泛型,并且它們并不是真正的The Go Way,但我只是想知道是否有可能在編譯時“強制”執(zhí)行任何操作(可能沒有)
查看完整描述

2 回答

?
四季花海

TA貢獻1811條經(jīng)驗 獲得超5個贊

我是Go我的新手,所以我很好奇是否有人會得到更好的答案,但是我是這樣看的:


您希望在編譯時強制執(zhí)行,當在Add()上調(diào)用時IntSlice,其參數(shù)為int。好吧,這是您的操作方式:


func (i *IntSlice) Add(t int) {

? ? *i = append(*i, t)

}

由于沒有泛型,因此Add()每種類型的方法都會有所不同Bag,因此Bag假設您需要,接口將變?yōu)椋?/p>


type Bag interface {

? ? IsEmpty() bool

? ? Size() int

}

這對我來說很有意義,因為您不能Bag繞過一圈,只扔任何東西。Bag僅僅知道某物是一個東西還不足以知道如何調(diào)用Add()它。您必須知道Bag您要處理的是哪種類型。


您可以使接口特定于該類型,例如IntBag,但是由于實際上只有一種類型可以滿足該接口,因此您也可以刪除該接口并將其名稱更改IntSlice為IntBag。


基本上,這意味著完全放棄所有類似于泛型的東西,而只是使用一些可以滿足您需要的方法來創(chuàng)建類型:


type IntBag []int


func (b *IntBag) Add(i int) {

? ? *b = append(*b, i)

}


func (b IntBag) IsEmpty() bool {

? ? return len(b) == 0

}


func (b IntBag) Size() int {

? ? return len(b)

}

更新:有時泛型確實會派上用場。在我看來,我們只能根據(jù)具體情況選擇最適合特定問題的方法。使用空接口和反射,您可以得到一些類似泛型的行為,但是它看起來很丑陋,并且您放棄了一些編譯時類型檢查?;蛘吣艞壏盒投M行一些代碼重復?;蛘吣皇怯猛耆煌姆绞絹碜?。


幾周前,我問了一個問題,關(guān)于我應該如何使用Go來處理看起來像我需要類層次結(jié)構(gòu)的問題。答案基本上是沒有通用的解決方案。視情況而定。我認為泛型也是如此:Go中沒有泛型,也沒有將基于泛型的解決方案轉(zhuǎn)換為Go的通用解決方案。

在許多情況下,您可能會在另一種語言中使用泛型,但是在Go中,接口是完全足夠的(或真正的亮點)。您的示例在這里,接口并不是真正合適的替代品。


查看完整回答
反對 回復 2021-05-17
  • 2 回答
  • 0 關(guān)注
  • 217 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

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