本文目錄一覽:
Go語言的應用
Go語言由Google公司開發,並於2009年開源,相比Java/Python/C等語言,Go尤其擅長並發編程,性能堪比C語言,開發效率肩比Python,被譽為「21世紀的C語言」。
Go語言在雲計算、大數據、微服務、高並發領域應用應用非常廣泛。BAT大廠正在把Go作為新項目開發的首選語言。
Go語言應用範圍:
1、服務端開發:以前你使用C或者C++做的那些事情,用Go來做很合適,例如日誌處理、文件系統、監控系統等;
2、DevOps:運維生態中的Docker、K8s、prometheus、grafana、open-falcon等都是使用Go語言開發;
3、網絡編程:大量優秀的Web框架如Echo、Gin、Iris、beego等,而且Go內置的 net/http包十分的優秀;
4、Paas雲平台領域:Kubernetes和Docker Swarm等;
5、分佈式存儲領域:etcd、Groupcache、TiDB、Cockroachdb、Influxdb等;
6、區塊鏈領域:區塊鏈裏面有兩個明星項目以太坊和fabric都使用Go語言;
7、容器虛擬化:大名鼎鼎的Docker就是使用Go語言實現的;
8、爬蟲及大數據:Go語言天生支持並發,所以十分適合編寫分佈式爬蟲及大數據處理。
bpftrace動態追蹤golang應用-函數內聯問題
在上一篇文章的golang代碼中,函數add的上一行,增加了一條注釋語句: //go:noinline 。在bpftrace追蹤時,是否可以去掉?有什麼作用?
為了說明該問題,設計一個例子。
golang代碼中,有兩個求和函數。其中,add1加上 //go:noinline ,另一個add2不加。代碼如下:
bpftrace程序分別對函數add1和add2的輸入參數、返回值進行追蹤,代碼如下:
執行程序後,可以看到bpftrace程序能夠正常追蹤到函數add1,但是無法追蹤到函數add2。
通過上文中的示例代碼,可以看到,沒有加 //go:noinline 的函數無法被bpftrace程序追蹤到。通過查閱golang相關文檔,可以知道, //go:noinline 表示該函數在編譯時,不會被內聯。
使用 objump -S 生成golang程序的彙編代碼如下:
通過彙編代碼,我們可以看到,主函數中,地址 0x498e52 處 callq 498e00 調用了add1函數,地址 0x498ebb 處 movq $0x4,(%rsp) 直接計算求值。
因此,golang編譯器在編譯代碼時,會對代碼進行分析,並按照內聯規則,將某些函數生成內聯代碼。一旦函數被內聯,bpftrace將無法追蹤到對應函數。也就是,上文中函數 add2 無法被追蹤到。
針對golang程序中編譯器內聯的問題,可以通過禁止內聯的方式來解決。禁止內聯的方式有:
在實踐中,可以通過 go build -gcflags=”-m -m” 來查看,哪些函數會在編譯時執行內聯,如:
從輸出中,可以看到:
關於golang編譯器進行內聯的場景,可以參考golang源碼:。
由於golang編譯器內聯優化,bpftrace可能無法正常追蹤golang程序。在編寫bpftrace腳本時,可以先使用 nm 命令查看一下可執行程序,是否存在需要追蹤的函數的符號信息。如果沒有則bpftrace將不能對其進行追蹤。
前面的示例中,都是對 int 類型的參數進行追蹤,那對於 string 類型的參數,是否也可以用同樣的方式進行追蹤?將在下一篇中進行討論。
go語言適合做什麼
go語言適用的領域有:
Go語言主要用作服務器端開發,其定位是用來開發「大型軟件」的,適合於很多程序員一起開發大型軟件,並且開發周期長,支持雲計算的網絡服務。
Go語言作為服務器編程語言,很適合處理日誌、數據打包、虛擬機處理、文件系統、分佈式系統、數據庫代理等;網絡編程方面,Go語言廣泛應用於Web應用、API應用、下載應用等;除此之外,Go語言還可用於內存數據庫和雲平台領域,目前國外很多雲平台都是採用Go開發。
Go語言能夠讓程序員快速開發,並且在軟件不斷的增長過程中,它能讓程序員更容易地進行維護和修改。它融合了傳統編譯型語言的高效性和腳本語言的易用性和富於表達性。
Go語言作為一門大型項目開發語言,在很多大公司相繼使用,甚至完全轉向Go開發,其中代表有Google、Facebook、騰訊、百度、阿里巴巴、京東、小米以及360、美團、滴滴以及新浪等,因此,Go語言的開發前景還是很不錯的!
Golang入門到項目實戰 | 第一個golang應用
1.創建一個文件夾,例如:golang入門到項目實戰
2.在golang入門到項目實戰文件夾中創建一個go文件,例如:test.go
3.在test.go中輸入如下內容:
4.編譯執行go run test.go
5.可僅選擇編譯執行go build test.go,則目錄下會多出個exe程序
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/158922.html