十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
1.Docker項目
創(chuàng)新互聯(lián)專注于莆田企業(yè)網(wǎng)站建設,成都響應式網(wǎng)站建設公司,商城網(wǎng)站開發(fā)。莆田網(wǎng)站建設公司,為莆田等地區(qū)提供建站服務。全流程按需制作網(wǎng)站,專業(yè)設計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務
網(wǎng)址為 。
介紹:Docker是一種操作系統(tǒng)層面的虛擬化技術,可以在操作系統(tǒng)和應用程序之間進行隔離,也可以稱之為容器。Docker可以在一臺物理服務器上快速運行一個或多個實例。例如,啟動一個Cent OS操作系統(tǒng),并在其內(nèi)部命令行執(zhí)行指令后結束,整個過程就像自己在操作系統(tǒng)一樣高效。
2.golang項目
網(wǎng)址為 。
介紹:Go語言的早期源碼使用C語言和匯編語言寫成。從Go 1.5版本自舉后,完全使用Go語言自身進行編寫。Go語言的源碼對了解Go語言的底層調(diào)度有極大的參考意義,建議希望對Go語言有深入了解的讀者讀一讀。
3.Kubernetes項目
網(wǎng)址為 。
介紹:Google公司開發(fā)的構建于Docker之上的容器調(diào)度服務,用戶可以通過Kubernetes集群進行云端容器集群管理。
4.etcd項目
網(wǎng)址為 。
介紹:一款分布式、可靠的KV存儲系統(tǒng),可以快速進行云配置。
5.beego項目
網(wǎng)址為 。
介紹:beego是一個類似Python的Tornado框架,采用了RESTFul的設計思路,使用Go語言編寫的一個極輕量級、高可伸縮性和高性能的Web應用框架。
6.martini項目
網(wǎng)址為 。
介紹:一款快速構建模塊化的Web應用的Web框架。
7.codis項目
網(wǎng)址為 Labs/codis。
介紹:國產(chǎn)的優(yōu)秀分布式Redis解決方案。
8.delve項目
網(wǎng)址為 。
介紹:Go語言強大的調(diào)試器,被很多集成環(huán)境和編輯器整合。
go可以在安卓運行的,github.com/golang/mobile,這是用golang做移動端開發(fā)的庫,
go是靜態(tài)編譯語言,不是腳本語言
1. 部署簡單
Go
編譯生成的是一個靜態(tài)可執(zhí)行文件,除了glibc外沒有其他外部依賴。這讓部署變得異常方便:目標機器上只需要一個基礎的系統(tǒng)和必要的管理、監(jiān)控工具,完全不需要操心應用所需的各種包、庫的依賴關系,大大減輕了維護的負擔。
2. 并發(fā)性好
Goroutine和channel使得編寫高并發(fā)的服務端軟件變得相當容易,很多情況下完全不需要考慮鎖機制以及由此帶來的各種問題。單個Go應用也能有效的利用多個CPU核,并行執(zhí)行的性能好。
3. 良好的語言設計
從學術的角度講Go語言其實非常平庸,不支持許多高級的語言特性;但從工程的角度講,Go的設計是非常優(yōu)秀的:規(guī)范足夠簡單靈活,有其他語言基礎的程序員都能迅速上手。更重要的是
Go 自帶完善的工具鏈,大大提高了團隊協(xié)作的一致性。
4. 執(zhí)行性能好
雖然不如 C 和 Java,但相比于其他編程語言,其執(zhí)行性能還是很好的,適合編寫一些瓶頸業(yè)務,內(nèi)存占用也非常省。
在上一篇文章的golang代碼中,函數(shù)add的上一行,增加了一條注釋語句: //go:noinline 。在bpftrace追蹤時,是否可以去掉?有什么作用?
為了說明該問題,設計一個例子。
golang代碼中,有兩個求和函數(shù)。其中,add1加上 //go:noinline ,另一個add2不加。代碼如下:
bpftrace程序分別對函數(shù)add1和add2的輸入?yún)?shù)、返回值進行追蹤,代碼如下:
執(zhí)行程序后,可以看到bpftrace程序能夠正常追蹤到函數(shù)add1,但是無法追蹤到函數(shù)add2。
通過上文中的示例代碼,可以看到,沒有加 //go:noinline 的函數(shù)無法被bpftrace程序追蹤到。通過查閱golang相關文檔,可以知道, //go:noinline 表示該函數(shù)在編譯時,不會被內(nèi)聯(lián)。
使用 objump -S 生成golang程序的匯編代碼如下:
通過匯編代碼,我們可以看到,主函數(shù)中,地址 0x498e52 處 callq 498e00 調(diào)用了add1函數(shù),地址 0x498ebb 處 movq $0x4,(%rsp) 直接計算求值。
因此,golang編譯器在編譯代碼時,會對代碼進行分析,并按照內(nèi)聯(lián)規(guī)則,將某些函數(shù)生成內(nèi)聯(lián)代碼。一旦函數(shù)被內(nèi)聯(lián),bpftrace將無法追蹤到對應函數(shù)。也就是,上文中函數(shù) add2 無法被追蹤到。
針對golang程序中編譯器內(nèi)聯(lián)的問題,可以通過禁止內(nèi)聯(lián)的方式來解決。禁止內(nèi)聯(lián)的方式有:
在實踐中,可以通過 go build -gcflags="-m -m" 來查看,哪些函數(shù)會在編譯時執(zhí)行內(nèi)聯(lián),如:
從輸出中,可以看到:
關于golang編譯器進行內(nèi)聯(lián)的場景,可以參考golang源碼:。
由于golang編譯器內(nèi)聯(lián)優(yōu)化,bpftrace可能無法正常追蹤golang程序。在編寫bpftrace腳本時,可以先使用 nm 命令查看一下可執(zhí)行程序,是否存在需要追蹤的函數(shù)的符號信息。如果沒有則bpftrace將不能對其進行追蹤。
前面的示例中,都是對 int 類型的參數(shù)進行追蹤,那對于 string 類型的參數(shù),是否也可以用同樣的方式進行追蹤?將在下一篇中進行討論。
有沒有覺得,發(fā)展到現(xiàn)在,軟件開發(fā)行業(yè)是越來越成熟了,無論是過程管理、架構方法、設計方法,還是語言、平臺、框架、工具等,都發(fā)展到了一個前所未有的高度,相關思想和理念也日臻完善,我們真正進入了一個最好的時代。
單就編程語言來說,近些年包括Scala(2003)、Groovy(2003)、Go(2009)、Kotlin(2011)、Swift(2014)等新興編程語言如雨后春筍版涌現(xiàn)出來,也給我們帶來了很多讓人眼前一亮的編程特性,甚至Java這等老牌編程語言也是不斷推陳出新,編程再也不像過去那般枯燥。
本篇就帶大家一起感受一下現(xiàn)代編程語言那些激動人心的特性。
這個特性其實有點早了,但是也是很早就讓人感動的語言特性了,熟悉Javascript的同學應該對它很了解。Javascript語言具有動態(tài)性,我們可以隨時為類的某個實例添加方法,也可以利用動態(tài)原型,為類的所有實例添加方法,有沒有感覺擴展類的實現(xiàn)變得非常方便了呢?
擴展和原型很像,允許我們在不修改或繼承類的情況下,將新的函數(shù)方法添加到原類中。這個特性較早見于C#這門語言,目前在Kotlin、Swift中均可以看到。這里順便說一下C#,當時C#出來的時候,不得不說很多特性是非常棒的,包括擴展方法、泛型、分部類等等,比Java好不要太多。像Kotlin,不僅可以擴展類的方法,還可以擴展類的屬性。
前兩個都是關于擴展代碼的,這里再來一個。我們知道Java 1.8以來,接口interface里的方法可以有自己的默認實現(xiàn)了,大大方便了實現(xiàn)類,減少了重復代碼。相對于Java的這個實現(xiàn)是顯示的,Go語言的接口實現(xiàn)可以是隱式的,添加隱式實現(xiàn)后,所有繼承的結構(Go沒有類,都是結構struct)都可以調(diào)用這個方法,和前面的兩個特性有異曲同工之妙,下面我們對比看一下。
C語言就有宏的概念,通過 #define 定義,然后在代碼中進行替換。宏作為Rust語言的高級特性,可以操作語法單元,是一種通過編寫代碼來生成代碼的方式,被稱作“元編程”(meta programming)。相對于函數(shù),宏可以接受任意多個參數(shù),可以減少重復代碼,定義DSL。宏語法比較復雜,難以編寫和調(diào)試,以至于在Rust文檔中說,宏將是其最后的特性。
當你回想寫代碼枯燥的時候,應該會想到為字段編寫getter、setter吧?較早的時候,C#就意識到了這個問題,貼心地推出了自動屬性這個語法糖。而Java開發(fā)者則是通過Eclipse、IDEA這樣的開發(fā)工具來自動生成getter、setter代碼。當然,現(xiàn)在也可以依賴Lombook包,使用lombok的注解@Getter @Setter來編譯時生成相關代碼。
據(jù)說空指針異常是軟件業(yè)最貴的異常,價值10億美元。你有沒有為處理調(diào)用鏈中的null值而煩惱過?又或者被傷害過?Kotlin會在編譯期提示對可能為null變量的不安全使用,也提供了Elvis 操作符 ?: 來方便地處理null值。而有了可選鏈,就舒服多了??蛇x鏈語法應該較早出現(xiàn)在JavaScript語言中,新興語言Swift也提供了這一省心的特性。Swift英明地決定變量是不允許直接存儲NIL值,當然也提供了optionals的裝箱功能允許將NIL或其它值包裝起來,方便有時使用。
輸入乃萬惡之源,函數(shù)首要的事情就是檢查不規(guī)范和不安全的輸入,這也是衛(wèi)語句的來歷。Swift語言為此提供了專門的衛(wèi)語句語法,有了它的貼身防護,整個代碼都干爽多了,劇烈運動都不怕,不信往下瞧:
如果要評選最酷的語言特性,那么Lambda表達式必須獲得提名。Lambda表達式很早就出現(xiàn)在Lisp語言中,python也有,在后來的C#語言大放異彩,又一次狠狠地羞辱了不長進的Java,而Java也終于在1.8版本后加入了這一特性,甚至C++ 11也光榮地上車了。
我們知道編程語言有靜態(tài)和動態(tài)之分,靜態(tài)語言如Java 、 C# 、 C 和 C++,動態(tài)語言如Perl,Python,JavaScript,Ruby 和 PHP等,多數(shù)為腳本語言。而融合了靜態(tài)和動態(tài)特性的語音,就被稱為漸進式語言,如TypeScript、Common LISP、Dylan、Cecil、Visual Basic.NET、Bigloo Scheme、Strongtalk等。靜態(tài)類型檢查可以盡早地發(fā)現(xiàn) BUG,動態(tài)類型檢查可以方便地處理依賴于運行時信息的值的類型。 漸進式語言允許類型注釋來控制程序的一部分使用靜態(tài)類型檢查,而另一部分為動態(tài)檢查,更具靈活性。 Python從3.5開始引入了對靜態(tài)類型檢查的支持。
在面向?qū)ο蟮木幊陶Z言中,狀態(tài)是計算的基礎。由于可變狀態(tài)的存在,在編寫高并發(fā),多線程代碼時,無法知道并行進行的諸多狀態(tài)讀寫中是否有順序上的錯誤,而且這種錯誤又是難以察覺的,而不變性則規(guī)避了這個問題。 不變性是函數(shù)式編程的基礎,不變性意味著函數(shù)沒有副作用,無論多少次執(zhí)行,相同的輸入就意味著相同的輸出,所有線程都可以無所顧忌的執(zhí)行同一個函數(shù)的代碼,代碼更像數(shù)學函數(shù),更易理解和測試。
String就是構建在Java語言內(nèi)核中的不可變類的一個典型例子。Java 的 CopyOnWrite系列容器類也是利用了不變性增強了并發(fā)安全性。Java可以通過final修飾符實現(xiàn)類和變量的不可變。而Scala、Swift、Groovy等語言也有各自的語法實現(xiàn)不可變的變量和類。
多重分派是一些編程語言的特性,其中的函數(shù)或者方法,可以在運行時間(動態(tài)的)使用一個或多個實際參數(shù)的組合特征,路由動態(tài)分派至實現(xiàn)函數(shù)或方法。多重分派主要區(qū)別于我們常見的重載方法,重載方法是在編譯期就綁定了,而多重分派是在運行期分派的。Lisp、Julia、C#、Groovy等語言內(nèi)建多分派特性,JavaScript、Python和C等語言通過擴展支持多分派。 多重分派可以避免我們寫很多分支條件,而是更直觀地用對象類型表達,使代碼變得可讀性更好并且較少發(fā)生錯誤。
前面幾個特性是不是略顯沉悶,那么來看一下這個激動一下。解構這一語法特性用于從數(shù)組索引或?qū)ο髮傩詣?chuàng)建變量,簡直帥到飛起。
愛寫單元測試的同學有福了,這個絕壁是重磅炸彈,在生產(chǎn)代碼里夾著測試代碼,你有想過這么寫測試嗎?誰想的?簡直腦洞打開?。≡撎匦栽赑yret語言中,Pyret旨在作為編程教育的杰出選擇,同時 探索 腳本和函數(shù)式編程的融合。
如果內(nèi)聯(lián)測試沒有讓你震驚,D語言內(nèi)聯(lián)編譯期的這個特性絕對會讓你驚掉下巴,基于該特性,開發(fā)人員可以直接在D語言中嵌入?yún)R編代碼,徹底放飛自我了,俺滴親娘?。∈懿涣?!受不了!順便說一下,D語言比較小眾,是C++的一個改進型,它包括了按合約設計、垃圾回收、關聯(lián)數(shù)組、數(shù)組切片和惰性求值等特性。
好吧,我們看點其它的來壓壓驚吧。盡管Kotlin語言也說自己實現(xiàn)了模式匹配,但是實際上只是一點點帥,真正帥的是 Elixir語言的模式匹配,Elixir作為一種在Erlang OTP上運行的動態(tài)類型語言,將模式匹配提升到了一個全新的水平。
在編程語法上,Python真是個神一樣的存在,for循環(huán)都能寫出花來。
Java 8 中提供了Stream API特性, Stream 使用一種類似用 SQL 語句從數(shù)據(jù)庫查詢數(shù)據(jù)的直觀方式,來提供一種對 Java 集合運算和表達的高階抽象。事實上這個特性C#早就有了(Java又躺槍一次)。不得不說,利用這個特性寫出來的代碼,看上去還真的是很流利的。
單片機不像一些應用軟件,和硬件結合十分緊密,必須要求“高效”,所以匯編語言是最好選擇,其次就是C語言了。其他語言編譯效率都太低,滿足不了要求。