Go 由于不支持泛型而臭名昭著,但最近棚基,泛型已接近成為現(xiàn)實(shí)。Go 團(tuán)隊(duì)實(shí)施了一個看起來比較穩(wěn)定的設(shè)計草案,并且正以源到源翻譯器原型的形式獲得關(guān)注。本文講述的是泛型的最新設(shè)計,以及如何自己嘗試泛型。
成都網(wǎng)絡(luò)公司-成都網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司十年經(jīng)驗(yàn)成就非凡,專業(yè)從事成都網(wǎng)站設(shè)計、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設(shè),成都網(wǎng)頁設(shè)計,成都網(wǎng)頁制作,軟文發(fā)布平臺,一元廣告等。十年來已成功提供全面的成都網(wǎng)站建設(shè)方案,打造行業(yè)特色的成都網(wǎng)站建設(shè)案例,建站熱線:028-86922220,我們期待您的來電!
例子
FIFO Stack
假設(shè)你要創(chuàng)建一個先進(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)
}
但是,這里存在一個問題:每當(dāng)你 Peek 項(xiàng)時,都必須使用類型斷言將其從 interface{} 轉(zhuǎn)換為你需要的類型。如果你的堆棧是 *MyObject 的堆棧,則意味著很多 s.Peek().(*MyObject)這樣的代碼。這不僅讓人眼花繚亂,而且還可能引發(fā)錯誤。比如忘記 * 怎么辦?或者如果您輸入錯誤的類型怎么辦?s.Push(MyObject{})` 可以順利編譯,而且你可能不會發(fā)現(xiàn)到自己的錯誤,直到它影響到你的整個服務(wù)為止。
通常,使用 interface{} 是相對危險的。使用更多受限制的類型總是更安全,因?yàn)榭梢栽诰幾g時而不是運(yùn)行時發(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)
上面的堆棧示例適用于任何類型。但是,在許多情況下,你需要編寫僅適用于具有某些特征的類型的代碼。例如,你可能希望堆棧要求類型實(shí)現(xiàn) String() 函數(shù)
1. os.Getwd()函數(shù)
原型:func Getwd()(pwd string, err error)
作用:獲取當(dāng)前文件路晌伏徑
返回:當(dāng)前文件路徑的字符串和一個err信息
示例:
輸出:
當(dāng)前路徑: D:ProjectsGomGoLab01
2. os.Getenv()函數(shù)
原型:func Getenv(key string) string
作用:獲取系統(tǒng)環(huán)境變量的值
參數(shù):key - 系統(tǒng)環(huán)境變量名
返回:系統(tǒng)環(huán)境變量的值
示例:
輸出:
環(huán)境變量GOPATH的值是: D:/Projects/Go
3. os.Chdir()函數(shù)
原型:func Chdir(dir string) error
作用:將當(dāng)前文件路徑改變?yōu)槟繕?biāo)路徑(非真實(shí)改變)
參數(shù):dir - 目標(biāo)路徑(即改變之后的路徑)
返回:修改成功,返回 nil;修改失敗(如:目標(biāo)路徑不存在的情況),返回錯誤信息。
示例一:
輸出:宴謹(jǐn)攜
起始晌畝路徑: D:ProjectsGomGoLab01
修改后的路徑: D:ProjectsGoDemo02
示例二:
輸出:
起始路徑: D:ProjectsGomGoLab01
error: chdir D:ProjectsGoDemo03: The system cannot find the file specified.
注:文件路徑,Window 系統(tǒng)下默認(rèn)是“”,寫在代碼中時要用“”或“/”代替。
go 語言可以寫C/s程式語言嗎?我看到都是web程式設(shè)計也就是B/S
語言只是工具而已,有的適合做哪一方面。
一般來說高階語言除了寫底層的東西,什么都能做。
go語言聽說過但不了解
我想應(yīng)該像python ruby一樣吧
拿python來說,可以寫web,可以寫socket,資料庫,game,圖形介面,你去官網(wǎng)看看他能做什么在右邊的最下梁燃面有,幾乎什么都能做。
所以go語言開發(fā)cs架構(gòu)肯定是可以的,不知道適合不適合。
要編寫B(tài)/S和C/S之類的程式應(yīng)該學(xué)習(xí)什么程式語言
如果想B/S,C/S通吃的話建議C#
如果對C/S外面,效率沒要求的話就入Java
如果時間多,入C++,Java
敘述b/s程式設(shè)計模式j(luò)avascript語言
JavaScript一種直譯式指令碼語言,是一種動態(tài)型別、弱型別、基于原型的語言,內(nèi)建支援型別。它的直譯器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用于客戶端的指令碼語言,最早是在HTML(標(biāo)準(zhǔn)通用標(biāo)記語言下的一個應(yīng)用)網(wǎng)頁上使用,用來給HTML網(wǎng)頁增加動態(tài)功能。
c/c++語言程式設(shè)計問題?
C語言之所以要起名為“C”,是因?yàn)樗侵饕獏⒖寄莻€時候的一門叫B的語言,它的設(shè)計者認(rèn)為C語言是B語言的進(jìn)步,所以就起名為C語言;但是B語言并不是因?yàn)橹斑€有個A語言,而是B語言的作者為了紀(jì)念他的妻子,他的妻子名字的第一個字母是B; 當(dāng)C語言發(fā)展到頂峰的時刻,出現(xiàn)了一個版本叫C with Class,那就是C++最早的版本,在C語言中增加class關(guān)鍵字和類,那個時候有很多版本的C都希望在C語言中增加類的概念;后來C標(biāo)準(zhǔn)委員會決定為這個版本的C起個新的名字,那個時候征集了很多種名字,最后采納了其中一個人的意見,以C語言中的++運(yùn)算子來體現(xiàn)它是C語言的進(jìn)步,故而叫C++,成立了C++標(biāo)準(zhǔn)委員會。 美國ATT貝爾實(shí)驗(yàn)室的本賈尼·斯特勞斯特盧普(Bjarne Stroustrup)博士在20世紀(jì)80年代初期發(fā)明并實(shí)現(xiàn)了C++(最初這種語言被稱作“C with Classes”)。一開始C++是作為C語言的增強(qiáng)版出現(xiàn)的,從給C語言增加類開始,不斷的增加新特性。虛擬函式(virtual function)、運(yùn)算子過載(operator overloading)、多重繼承(multiple inheritance)、模板(template)、異常(exception)、RTTI、名稱空間(name space)逐漸被加入標(biāo)準(zhǔn)。1998年國際標(biāo)準(zhǔn)組織(ISO)頒布了C++程式設(shè)計語言的國際標(biāo)準(zhǔn)ISO/IEC 1488-1998。C++是具有國際標(biāo)準(zhǔn)的程式語言,通常稱作ANSI/ISO C++。1998年是C++標(biāo)準(zhǔn)委員會成立的第一年,以后每5年視實(shí)際需要更新一次標(biāo)準(zhǔn),下一次標(biāo)準(zhǔn)更新原定是在2009年,目前我們一般稱該標(biāo)準(zhǔn)C++0x,但是由帶亂于對于新特性的爭端激烈,除了在Technical Report 1(tr1)中的新增修改被基本確定外,完整的標(biāo)準(zhǔn)還遙遙無期。況且遺憾的是,由于C++語言過于復(fù)雜,以及經(jīng)歷了長年的演變,直到現(xiàn)在(2010年)都沒有有一個編譯器完全符合這個標(biāo)準(zhǔn)。 目前最符合和接近C++標(biāo)準(zhǔn)的編譯器有為 GNU GCC 4.5.0 和 Visual Studio 2010 等。 另外,就目前學(xué)習(xí)C++而言,可以認(rèn)為橡行虛他是一門獨(dú)立的語言;他并不依賴C語言,我們可以完全不學(xué)C語言,而直接學(xué)習(xí)C++。根據(jù)《C++程式設(shè)計思想》(Thinking in C++)一書所評述的,C++與C的效率往往相差在正負(fù)5%之間。所以有人認(rèn)為在大多數(shù)場合C++ 完全可以取代C語言(然而我們在微控制器等需要謹(jǐn)慎利用空間、直接操作硬體的地方還是要使用C語言)。
網(wǎng)路程式語言就是指不是程式設(shè)計EXE檔案的語言嗎
不是
原則上任何可以編寫網(wǎng)路通訊程式的語言都可以用來編寫網(wǎng)頁
c/perl--cgi(cgi可以用任何語言編寫,windows常用c;unix常用perl)
vb--asp
java--jsp
dephi--intraweb
所以“網(wǎng)路程式語言就是指不是程式設(shè)計EXE檔案的語言”說法是不對的
快速開發(fā)工具哪個比較好?支援B/S和C/S,并最好可以支援2種以2種語言程式語言以上的。
推薦使用微軟的 virsual stdio系列的,比如VS2010 VS2015等等,功能很強(qiáng)悍,支援C/S和B/S的開發(fā),支援多種程式語言。
程式語言都是免費(fèi)的么?
語言當(dāng)然是免費(fèi)的,程式設(shè)計軟體就不是都免費(fèi)的了。。
github 支援什么程式語言 ,就是在github上可以用什么程式語言建立專案
什么語言都可以,只是一個版本管理庫。和語言關(guān)系不大。
你可以用它來管理一個圖片的版本都可以
github is really really useful
swift 程式語言
用的xcode;
AE程式語言
AE的指令碼和表示式的基礎(chǔ)都是JavaScript程式語言,因此AE表示式語句直接繼承了Java的數(shù)學(xué)函式。
分享名稱:go語言設(shè)計模式原型 go語言原理
分享地址:http://www.chinadenli.net/article2/ddpgiic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、云服務(wù)器、網(wǎng)站設(shè)計公司、動態(tài)網(wǎng)站、服務(wù)器托管、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)