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