Go 由于不支持泛型而臭名昭著,但最近,泛型已接近成為現(xiàn)實。Go 團(tuán)隊實施了一個看起來比較穩(wěn)定的設(shè)計草案,并且正以源到源翻譯器原型的形式獲得關(guān)注。本文講述的是泛型的最新設(shè)計,以及如何自己嘗試泛型。
成都創(chuàng)新互聯(lián)公司主營永仁網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,手機(jī)APP定制開發(fā),永仁h5重慶小程序開發(fā)搭建,永仁網(wǎng)站營銷推廣歡迎永仁等地區(qū)企業(yè)咨詢
例子
FIFO Stack
假設(shè)你要創(chuàng)建一個先進(jìn)先出堆棧。沒有泛型,你可能會這樣實現(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)
}
但是,這里存在一個問題:每當(dāng)你 Peek 項時,都必須使用類型斷言將其從 interface{} 轉(zhuǎn)換為你需要的類型。如果你的堆棧是 *MyObject 的堆棧,則意味著很多 s.Peek().(*MyObject)這樣的代碼。這不僅讓人眼花繚亂,而且還可能引發(fā)錯誤。比如忘記 * 怎么辦?或者如果您輸入錯誤的類型怎么辦?s.Push(MyObject{})` 可以順利編譯,而且你可能不會發(fā)現(xiàn)到自己的錯誤,直到它影響到你的整個服務(wù)為止。
通常,使用 interface{} 是相對危險的。使用更多受限制的類型總是更安全,因為可以在編譯時而不是運行時發(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)
}
這會向 Stack 添加一個類型參數(shù),從而完全不需要 interface{}。現(xiàn)在,當(dāng)你使用 Peek() 時,返回的值已經(jīng)是原始類型,并且沒有機(jī)會返回錯誤的值類型。這種方式更安全,更容易使用。(譯注:就是看起來更丑陋,^-^)
此外,泛型代碼通常更易于編譯器優(yōu)化,從而獲得更好的性能(以二進(jìn)制大小為代價)。如果我們對上面的非泛型代碼和泛型代碼進(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)存,同時泛型的速度是非泛型的兩倍。
合約(Contracts)
上面的堆棧示例適用于任何類型。但是,在許多情況下,你需要編寫僅適用于具有某些特征的類型的代碼。例如,你可能希望堆棧要求類型實現(xiàn) String() 函數(shù)
根據(jù)Go趨勢報告顯示,全球范圍內(nèi)有 110 萬專業(yè)開發(fā)者選擇Go作為其主要開發(fā)語言。如果把以其他編程語言作為主要開發(fā)語言,同時也在使用Go的開發(fā)者計算在內(nèi),這一數(shù)字將高達(dá)270萬,中國的Go語言開發(fā)者排名第一,全球占比超過16%。
Go 語言能夠支持并構(gòu)建與微服務(wù)結(jié)合的內(nèi)部工具、架構(gòu)和后端服務(wù)而深受IT企業(yè)歡迎,許多IT架構(gòu)工具由Go構(gòu)建而成,例如大型的Kubernetes、Docker和Vault等。數(shù)據(jù)顯示,有63%的具有統(tǒng)治力的云原生項目都是用Go構(gòu)建。
因此,博睿數(shù)據(jù)在國內(nèi)首發(fā)支持Go語言智能探針,對于提升業(yè)務(wù)性能,助力企業(yè)數(shù)字化轉(zhuǎn)型有著非常重要的意義。
SmartAgent探針技術(shù)集結(jié)主流編程語言
SmartAgent是博睿數(shù)據(jù)自研的自動化部署的一體化探針,在已支持JAVA,PHP,.net,Nodejs,.NET Core,Python的基礎(chǔ)上,新增了對Go語言的支持。
相較而言,傳統(tǒng)探針技術(shù)需要客戶配合修改應(yīng)用程序代碼,風(fēng)險不可控,需要客戶重新編譯程序集成探針,耦合度高。
不同于行業(yè)內(nèi)傳統(tǒng)探針技術(shù),博睿數(shù)據(jù)GoAgent探針直接后臺安裝即可,主動注入和嵌碼,降低與客戶程序耦合、無需二次修改代碼、提高 GoAgent 技術(shù)易用性。無論是動態(tài)編譯還是靜態(tài)編譯的代碼,博睿數(shù)據(jù)Samrt Agent技術(shù)都可以在不進(jìn)行任何修改的情況下進(jìn)行服務(wù)級別和代碼級別的分布式鏈路跟蹤,實現(xiàn)業(yè)務(wù)的可觀測性。
GoAgent探針支持六大功能,實現(xiàn)全鏈路追蹤
1、較流行的主要編程語言——Java
Java語言在設(shè)計時引入了虛擬機(jī)(JVM),它架構(gòu)在操作系統(tǒng)之上,屏蔽了底層實現(xiàn)的差異,所以,對于java代碼,不管你在linux上還是windows上,只要安裝了相應(yīng)平臺的java虛擬機(jī),就可以跑起來。
2、較常用的整體編程語言——JavaScript
近些年來,JavaScript 的使用范圍,慢慢超越了瀏覽器,正在向通用的系統(tǒng)語言發(fā)展。雖說JavaScript 的發(fā)明目的,就是作為瀏覽器的內(nèi)置腳本語言,為你提供操控瀏覽器的能力。
如果你想提供漂亮的網(wǎng)頁、令用戶滿意的上網(wǎng)體驗、各種基于瀏覽器的便捷功能、前后端之間緊密的聯(lián)系,JavaScript 是你必不可少的工具。
3、較有前途的編程語言——Go
Go 語言被稱為“較有前途的編程語言”。因為 Go 在 2017 年的份額只有 百分之8,現(xiàn)在已達(dá)到 百分之18。此外,在調(diào)查報告中,多達(dá) (百分之13) 的開發(fā)人員愿意采用或遷移到 Go 語言。Go語言是谷歌推出的一種全新的編程語言,可以在不損失應(yīng)用程序性能的情況下降低代碼的復(fù)雜性。
4、世界上較好的編程語言——PHP
PHP 的語言之爭一直都是程序員社區(qū)中的話題王。
PHP是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利于學(xué)習(xí),使用廣泛,主要適用于Web開發(fā)領(lǐng)域。但是就算做移動端,我們也離不開PHP。比如很多游戲的服務(wù)端,以及很多APP像是天貓的服務(wù)器端,都離不開PHP的身影;百分之60-70的APP應(yīng)用服務(wù)器端,都對接PHP。
5、學(xué)習(xí)較多的編程語言——Python
Python,這門經(jīng)常在各大編程語言排行榜前列露臉的語言,它是學(xué)習(xí)較多的編程語言。百分之27 的受訪對象在過去 12 個月里開始或仍在持續(xù)學(xué)習(xí) Python。Python語言在學(xué)術(shù)上非常受歡迎,哪怕不是學(xué)習(xí)計算機(jī)的人,很多都在學(xué)習(xí)Python。
總的來說,學(xué)習(xí)哪種編程語言更有前途,還是要找適合自己的,并且有興趣、愿意在這個方面學(xué)習(xí)、鉆研的,并且能不斷為之努力的。
網(wǎng)站題目:go語言調(diào)查報告 語言使用調(diào)查報告
網(wǎng)頁URL:http://jinyejixie.com/article14/doppjge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、關(guān)鍵詞優(yōu)化、服務(wù)器托管、建站公司、網(wǎng)頁設(shè)計公司、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)