真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語言泛型提案,go的泛型

GO語言(十五):泛型入門(下)-

在本節(jié)中,您將添加通用函數(shù)調(diào)用的修改版本,進(jìn)行小的更改以簡化調(diào)用代碼。您將刪除在這種情況下不需要的類型參數(shù)。

創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)與策劃設(shè)計(jì),沈陽網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:沈陽等地區(qū)。沈陽做網(wǎng)站價(jià)格咨詢:13518219792

當(dāng) Go 編譯器可以推斷您要使用的類型時(shí),您可以在調(diào)用代碼中省略類型參數(shù)。編譯器從函數(shù)參數(shù)的類型推斷類型參數(shù)。

請(qǐng)注意,這并不總是可能的。例如,如果您需要調(diào)用沒有參數(shù)的泛型函數(shù),則需要在函數(shù)調(diào)用中包含類型參數(shù)。

在 main.go 中,在您已有的代碼下方,粘貼以下代碼。

在此代碼中:

(1)調(diào)用泛型函數(shù),省略類型參數(shù)。

從包含 main.go 的目錄中的命令行,運(yùn)行代碼。

接下來,您將通過將整數(shù)和浮點(diǎn)數(shù)的并集捕獲到您可以重用的類型約束(例如從其他代碼中)來進(jìn)一步簡化函數(shù)。

正如您將在本節(jié)中看到的,約束接口也可以引用特定類型。

1、編寫代碼

在此代碼中:

b.在您已有的函數(shù)下方,粘貼以下通用 SumNumbers函數(shù)。

在此代碼中:

c.在 main.go 中,在您已有的代碼下方,粘貼以下代碼。

在此代碼中:

(1)調(diào)用SumNumbers打印每個(gè)map的總和。

與上一節(jié)一樣,在調(diào)用泛型函數(shù)時(shí)省略了類型參數(shù)(方括號(hào)中的類型名稱)。Go 編譯器可以從其他參數(shù)推斷類型參數(shù)。

從包含 main.go 的目錄中的命令行,運(yùn)行代碼。

做得很好!您剛剛學(xué)習(xí)了 Go 中的泛型。

如何看待go語言泛型的最新設(shè)計(jì)?

Go 由于不支持泛型而臭名昭著,但最近,泛型已接近成為現(xiàn)實(shí)。Go 團(tuán)隊(duì)實(shí)施了一個(gè)看起來比較穩(wěn)定的設(shè)計(jì)草案,并且正以源到源翻譯器原型的形式獲得關(guān)注。本文講述的是泛型的最新設(shè)計(jì),以及如何自己嘗試泛型。

例子

FIFO Stack

假設(shè)你要?jiǎng)?chuàng)建一個(gè)先進(jìn)先出堆棧。沒有泛型,你可能會(huì)這樣實(shí)現(xiàn):

type?Stack?[]interface{}func?(s?Stack)?Peek()?interface{}?{

return?s[len(s)-1]

}

func?(s?*Stack)?Pop()?{

*s?=?(*s)[:

len(*s)-1]

}

func?(s?*Stack)?Push(value?interface{})?{

*s?=?

append(*s,?value)

}

但是,這里存在一個(gè)問題:每當(dāng)你 Peek 項(xiàng)時(shí),都必須使用類型斷言將其從 interface{} 轉(zhuǎn)換為你需要的類型。如果你的堆棧是 *MyObject 的堆棧,則意味著很多 s.Peek().(*MyObject)這樣的代碼。這不僅讓人眼花繚亂,而且還可能引發(fā)錯(cuò)誤。比如忘記 * 怎么辦?或者如果您輸入錯(cuò)誤的類型怎么辦?s.Push(MyObject{})` 可以順利編譯,而且你可能不會(huì)發(fā)現(xiàn)到自己的錯(cuò)誤,直到它影響到你的整個(gè)服務(wù)為止。

通常,使用 interface{} 是相對(duì)危險(xiǎn)的。使用更多受限制的類型總是更安全,因?yàn)榭梢栽诰幾g時(shí)而不是運(yùn)行時(shí)發(fā)現(xiàn)問題。

泛型通過允許類型具有類型參數(shù)來解決此問題:

type?Stack(type?T)?[]Tfunc?(s?Stack(T))?Peek()?T?{

return?s[len(s)-1]

}

func?(s?*Stack(T))?Pop()?{

*s?=?(*s)[:

len(*s)-1]

}

func?(s?*Stack(T))?Push(value?T)?{

*s?=?

append(*s,?value)

}

這會(huì)向 Stack 添加一個(gè)類型參數(shù),從而完全不需要 interface{}?,F(xiàn)在,當(dāng)你使用 Peek() 時(shí),返回的值已經(jīng)是原始類型,并且沒有機(jī)會(huì)返回錯(cuò)誤的值類型。這種方式更安全,更容易使用。(譯注:就是看起來更丑陋,^-^)

此外,泛型代碼通常更易于編譯器優(yōu)化,從而獲得更好的性能(以二進(jìn)制大小為代價(jià))。如果我們對(duì)上面的非泛型代碼和泛型代碼進(jìn)行基準(zhǔn)測試,我們可以看到區(qū)別:

type?MyObject?struct?{

X?

int

}

var?sink?MyObjectfunc?BenchmarkGo1(b?*testing.B)?{

for?i?:=?0;?i??b.N;?i++?{

var?s?Stack

s.Push(MyObject{})

s.Push(MyObject{})

s.Pop()

sink?=?s.Peek().(MyObject)

}

}

func?BenchmarkGo2(b?*testing.B)?{

for?i?:=?0;?i??b.N;?i++?{

var?s?Stack(MyObject)

s.Push(MyObject{})

s.Push(MyObject{})

s.Pop()

sink?=?s.Peek()

}

}

結(jié)果:

BenchmarkGo1BenchmarkGo1-16?????12837528?????????87.0?ns/op???????48?B/op????????2?allocs/opBenchmarkGo2BenchmarkGo2-16?????28406479?????????41.9?ns/op???????24?B/op????????2?allocs/op

在這種情況下,我們分配更少的內(nèi)存,同時(shí)泛型的速度是非泛型的兩倍。

合約(Contracts)

上面的堆棧示例適用于任何類型。但是,在許多情況下,你需要編寫僅適用于具有某些特征的類型的代碼。例如,你可能希望堆棧要求類型實(shí)現(xiàn) String() 函數(shù)

嘗試用golang 1.18泛型實(shí)現(xiàn)orm

這幾天golang社區(qū)對(duì)泛型的討論非常多的,一片熱火朝天的景象。對(duì)我們廣大gopher來說總歸是好事。

泛型很有可能會(huì)顛覆我們之前的很多設(shè)計(jì),帶著這種疑問和沖動(dòng),我準(zhǔn)備嘗試用golang泛型實(shí)現(xiàn)幾個(gè)orm的常見功能。

本文并沒完全實(shí)現(xiàn)通用的orm,只是探討其實(shí)現(xiàn)的一種方式提供各位讀者做借鑒。

雖然golang有了泛型,但是目前在標(biāo)準(zhǔn)庫sql底層還沒有改造,目前還有很多地方需要用到reflect。

調(diào)用方式

這個(gè)部分跟傳統(tǒng)的orm使用上沒有太大區(qū)別,沒辦法不使用反射的情況下,泛型的方式可能變得有點(diǎn)繁瑣。

調(diào)用方式

和創(chuàng)建table類似,寫入數(shù)據(jù)好像比沒有之前的orm有優(yōu)勢。

讀取數(shù)據(jù)是非常高頻的操作,所以我們稍作封裝。

調(diào)用方式

稍微比原先的orm方式有了多一點(diǎn)想象空間,比如 在[T any]做更明確的約束,比如要求實(shí)現(xiàn)Filter定制方法。

鑒于本人能力還認(rèn)證有限,目前還沒有發(fā)現(xiàn)泛型對(duì)orm劇烈的改進(jìn)和突破的可能。未來如果go對(duì)底層sql做出改動(dòng),或者實(shí)現(xiàn)諸如Rust那種Enum方式,可能會(huì)帶來更多的驚喜。

golang 2.0發(fā)布時(shí)間

golang2.0發(fā)布時(shí)間是2019年2月1日。目前在golang2.0的提案中,大約有120個(gè)未解決的問題被標(biāo)記為golang2.0的提案,每一個(gè)問題都與重要的庫或語言更改相關(guān),而這些問題通常不能滿足當(dāng)前Go1的兼容性,開發(fā)人員將這些提案分類為Go2Cleanup、NeedsDecision等,以便后續(xù)的執(zhí)行操作。

golang2.0設(shè)計(jì)

本概覽及附帶的細(xì)節(jié)草案是《golang2.0設(shè)計(jì)草案》golang2.0文檔的一部分,golang2.0的總體目標(biāo)是為Go無法擴(kuò)展到大型代碼庫和大量開發(fā)人員這一問題提供最重要的解決方式。

在Go開源之前,Go團(tuán)隊(duì)成員尤其是IanLanceTaylor就一直在研討泛型的可能設(shè)計(jì)即參數(shù)多態(tài),parametricpolymorphism。谷歌從C和Java的經(jīng)驗(yàn)中得知,這一話題非常豐富、復(fù)雜,要想考慮透徹并設(shè)計(jì)出一個(gè)良好的解決方案將花費(fèi)很長時(shí)間。


本文名稱:go語言泛型提案,go的泛型
網(wǎng)站地址:http://weahome.cn/article/hsggcg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部