Go 由于不支持泛型而臭名昭著,但最近,泛型已接近成為現(xiàn)實(shí)。Go 團(tuán)隊(duì)實(shí)施了一個(gè)看起來比較穩(wěn)定的設(shè)計(jì)草案,并且正以源到源翻譯器原型的形式獲得關(guān)注。本文講述的是泛型的最新設(shè)計(jì),以及如何自己嘗試泛型。
創(chuàng)新互聯(lián)公司于2013年創(chuàng)立,先為香河等服務(wù)建站,香河等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為香河企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
例子
FIFO Stack
假設(shè)你要創(chuàng)建一個(gè)先進(jìn)先出堆棧。沒有泛型,你可能會這樣實(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{})` 可以順利編譯,而且你可能不會發(fā)現(xiàn)到自己的錯(cuò)誤,直到它影響到你的整個(gè)服務(wù)為止。
通常,使用 interface{} 是相對危險(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)
}
這會向 Stack 添加一個(gè)類型參數(shù),從而完全不需要 interface{}。現(xiàn)在,當(dāng)你使用 Peek() 時(shí),返回的值已經(jīng)是原始類型,并且沒有機(jī)會返回錯(cuò)誤的值類型。這種方式更安全,更容易使用。(譯注:就是看起來更丑陋,^-^)
此外,泛型代碼通常更易于編譯器優(yōu)化,從而獲得更好的性能(以二進(jìn)制大小為代價(jià))。如果我們對上面的非泛型代碼和泛型代碼進(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ù)
1、學(xué)習(xí)曲線
它包含了類C語法、GC內(nèi)置和工程工具。這一點(diǎn)非常重要,因?yàn)镚o語言容易學(xué)習(xí),所以一個(gè)普通的大學(xué)生花一個(gè)星期就能寫出來可以上手的、高性能的應(yīng)用。在國內(nèi)大家都追求快,這也是為什么國內(nèi)Go流行的原因之一。
2、效率
Go擁有接近C的運(yùn)行效率和接近PHP的開發(fā)效率,這就很有利的支撐了上面大家追求快速的需求。
3、出身名門、血統(tǒng)純正
之所以說Go語言出身名門,是因?yàn)槲覀冎繥o語言出自Google公司,這個(gè)公司在業(yè)界的知名度和實(shí)力自然不用多說。Google公司聚集了一批牛人,在各種編程語言稱雄爭霸的局面下推出新的編程語言,自然有它的戰(zhàn)略考慮。而且從Go語言的發(fā)展態(tài)勢來看,Google對它這個(gè)新的寵兒還是很看重的,Go自然有一個(gè)良好的發(fā)展前途。我們看看Go語言的主要創(chuàng)造者,血統(tǒng)純正這點(diǎn)就可見端倪了。
4、組合的思想、無侵入式的接口
Go語言可以說是開發(fā)效率和運(yùn)行效率二者的完美融合,天生的并發(fā)編程支持。Go語言支持當(dāng)前所有的編程范式,包括過程式編程、面向?qū)ο缶幊桃约昂瘮?shù)式編程。
5、強(qiáng)大的標(biāo)準(zhǔn)庫
這包括互聯(lián)網(wǎng)應(yīng)用、系統(tǒng)編程和網(wǎng)絡(luò)編程。Go里面的標(biāo)準(zhǔn)庫基本上已經(jīng)是非常穩(wěn)定,特別是我這里提到的三個(gè),網(wǎng)絡(luò)層、系統(tǒng)層的庫非常實(shí)用。
6、部署方便
我相信這一點(diǎn)是很多人選擇Go的最大理由,因?yàn)椴渴鹛奖?,所以現(xiàn)在也有很多人用Go開發(fā)運(yùn)維程序。
7、簡單的并發(fā)
它包含降低心智的并發(fā)和簡易的數(shù)據(jù)同步,我覺得這是Go最大的特色。之所以寫正確的并發(fā)、容錯(cuò)和可擴(kuò)展的程序如此之難,是因?yàn)槲覀冇昧隋e(cuò)誤的工具和錯(cuò)誤的抽象,Go可以說這一塊做的相當(dāng)簡單。
8、穩(wěn)定性
Go擁有強(qiáng)大的編譯檢查、嚴(yán)格的編碼規(guī)范和完整的軟件生命周期工具,具有很強(qiáng)的穩(wěn)定性,穩(wěn)定壓倒一切。那么為什么Go相比于其他程序會更穩(wěn)定呢?這是因?yàn)镚o提供了軟件生命周期的各個(gè)環(huán)節(jié)的工具,如go
tool、gofmt、go test。
Go作為Google2009年推出的語言,其被設(shè)計(jì)成一門應(yīng)用于搭載 Web 服務(wù)器,存儲集群或類似用途的巨型中央服務(wù)器的系統(tǒng)編程語言。
對于高性能分布式系統(tǒng)領(lǐng)域而言,Go 語言無疑比大多數(shù)其它語言有著更高的開發(fā)效率。它提供了海量并行的支持,這對于 游戲 服務(wù)端的開發(fā)而言是再好不過了。
到現(xiàn)在Go的開發(fā)已經(jīng)是完全開放的,并且擁有一個(gè)活躍的社區(qū)。
=================================
哪些大公司在使用Go語言:
1、Google
這個(gè)不用多做介紹,作為開發(fā)Go語言的公司,當(dāng)仁不讓。Google基于Go有很多優(yōu)秀的項(xiàng)目,比如: ,大家也可以在Github上 查看更多Google的Go開源項(xiàng)目。
2、Facebook
Facebook也在用,為此他們還專門在Github上建立了一個(gè)開源組織facebookgo,大家可以通過 訪問查看facebook開源的項(xiàng)目,比如著名的是平滑升級的grace。
3、騰訊
騰訊作為國內(nèi)的大公司,還是敢于嘗試的,尤其是Docker容器化這一塊,他們在15年已經(jīng)做了docker萬臺規(guī)模的實(shí)踐,具體可以參考
4、百度
目前所知的百度的使用是在運(yùn)維這邊,是百度運(yùn)維的一個(gè)BFE項(xiàng)目,負(fù)責(zé)前端流量的接入。他們的負(fù)責(zé)人在2016年有分享,大家可以看下這個(gè)
5、阿里
阿里巴巴具體的項(xiàng)目不太清楚,不過聽說其系統(tǒng)部門、CDN等正在招Go方面的人。
6、京東
京東云消息推送系統(tǒng)、云存儲,以及京東商城等都有使用Go做開發(fā)。
7、小米
小米對Golang的支持,莫過于運(yùn)維監(jiān)控系統(tǒng)的開源,也就是
此外,小米互娛、小米商城、小米視頻、小米生態(tài)鏈等團(tuán)隊(duì)都在使用Golang。
8、360
360對Golang的使用也不少,一個(gè)是開源的日志搜索系統(tǒng)Poseidon,托管在Github上,
==================================
Go適合做什么?為何這么多人偏愛Go語言?
Go強(qiáng)大的開發(fā)團(tuán)隊(duì)
1、自由高效:組合的思想、無侵入式的接口
Go語言可以說是開發(fā)效率和運(yùn)行效率二者的完美融合,天生的并發(fā)編程支持。Go語言支持當(dāng)前所有的編程范式,包括過程式編程、面向?qū)ο缶幊桃约昂瘮?shù)式編程。程序員們可以各取所需、自由組合、想怎么玩就怎么玩。
2、強(qiáng)大的標(biāo)準(zhǔn)庫
這包括互聯(lián)網(wǎng)應(yīng)用、系統(tǒng)編程和網(wǎng)絡(luò)編程。Go里面的標(biāo)準(zhǔn)庫基本上已經(jīng)是非常穩(wěn)定了,特別是我這里提到的三個(gè),網(wǎng)絡(luò)層、系統(tǒng)層的庫非常實(shí)用。
3、部署方便:二進(jìn)制文件、Copy部署
我相信這一點(diǎn)是很多人選擇Go的最大理由,因?yàn)椴渴鹛奖懔?,所以現(xiàn)在也有很多人用Go開發(fā)運(yùn)維程序。
4、簡單的并發(fā)
它包含了降低心智的并發(fā)和簡易的數(shù)據(jù)同步,我覺得這是Go最大的特色。之所以寫正確的并發(fā)、容錯(cuò)和可擴(kuò)展的程序如此之難,是因?yàn)槲覀冇昧隋e(cuò)誤的工具和錯(cuò)誤的抽象,Go可以說這一塊做的相當(dāng)簡單。
5、穩(wěn)定性
Go擁有強(qiáng)大的編譯檢查、嚴(yán)格的編碼規(guī)范和完整的軟件生命周期工具,具有很強(qiáng)的穩(wěn)定性,穩(wěn)定壓倒一切。那么為什么Go相比于其他程序會更穩(wěn)定呢?這是因?yàn)镚o提供了軟件生命周期(開發(fā)、測試、部署、維護(hù)等等)的各個(gè)環(huán)節(jié)的工具,如go tool、gofmt、go test。
================================
我們?yōu)槭裁催x擇GO語言
選擇GO語言,主要是基于兩方面的考慮
1. 執(zhí)行性能 縮短API的響應(yīng)時(shí)長,解決批量請求訪問超時(shí)的問題。在Uwork的業(yè)務(wù)場景下,一次API批量請求,往往會涉及對另外接口服務(wù)的多次調(diào)用,而在之前的PHP實(shí)現(xiàn)模式下,要做到并行調(diào)用是非常困難的,串行處理卻不能從根本上提高處理性能。而GO語言不一樣,通過協(xié)程可以方便的實(shí)現(xiàn)API的并行處理,達(dá)到處理效率的最大化。 依賴Golang的高性能HTTP Server,提升系統(tǒng)吞吐能力,由PHP的數(shù)百級別提升到數(shù)千里甚至過萬級別。
2. 開發(fā)效率 GO語言使用起來簡單、代碼描述效率高、編碼規(guī)范統(tǒng)一、上手快。 通過少量的代碼,即可實(shí)現(xiàn)框架的標(biāo)準(zhǔn)化,并以統(tǒng)一的規(guī)范快速構(gòu)建API業(yè)務(wù)邏輯。 能快速的構(gòu)建各種通用組件和公共類庫,進(jìn)一步提升開發(fā)效率,實(shí)現(xiàn)特定場景下的功能量產(chǎn)。
Go語言近兩年的發(fā)展速度還是非??斓?,一方面Go語言有強(qiáng)大的行業(yè)背書,另一方面Go語言在設(shè)計(jì)時(shí)充分考慮了當(dāng)前的編程環(huán)境,加強(qiáng)了大數(shù)據(jù)量、高并發(fā)等應(yīng)用場景的處理能力,強(qiáng)調(diào)編程語言自身對于處理性能的追求,相信Go語言在未來大數(shù)據(jù)和人工智能相關(guān)技術(shù)逐漸落地應(yīng)用的背景下,會有一個(gè)較為廣闊的發(fā)展空間。
當(dāng)前名稱:go語言組合思想 go語言的基本類型
地址分享:http://jinyejixie.com/article30/ddoggso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、網(wǎng)站營銷、定制開發(fā)、網(wǎng)站內(nèi)鏈、網(wǎng)站制作、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)