本文介紹一些Go語言的基礎語法。
為興城等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及興城網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為網(wǎng)站設計制作、網(wǎng)站制作、興城網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
先來看一個簡單的go語言代碼:
go語言的注釋方法:
代碼執(zhí)行結果:
下面來進一步介紹go的基礎語法。
go語言中格式化輸出可以使用 fmt 和 log 這兩個標準庫,
常用方法:
示例代碼:
執(zhí)行結果:
更多格式化方法可以訪問中的fmt包。
log包實現(xiàn)了簡單的日志服務,也提供了一些格式化輸出的方法。
執(zhí)行結果:
下面來介紹一下go的數(shù)據(jù)類型
下表列出了go語言的數(shù)據(jù)類型:
int、float、bool、string、數(shù)組和struct屬于值類型,這些類型的變量直接指向存在內(nèi)存中的值;slice、map、chan、pointer等是引用類型,存儲的是一個地址,這個地址存儲最終的值。
常量是在程序編譯時就確定下來的值,程序運行時無法改變。
執(zhí)行結果:
執(zhí)行結果:
Go 語言的運算符主要包括算術運算符、關系運算符、邏輯運算符、位運算符、賦值運算符以及指針相關運算符。
算術運算符:
關系運算符:
邏輯運算符:
位運算符:
賦值運算符:
指針相關運算符:
下面介紹一下go語言中的if語句和switch語句。另外還有一種控制語句叫select語句,通常與通道聯(lián)用,這里不做介紹。
if語法格式如下:
if ... else :
else if:
示例代碼:
語法格式:
另外,添加 fallthrough 會強制執(zhí)行后面的 case 語句,不管下一條case語句是否為true。
示例代碼:
執(zhí)行結果:
下面介紹幾種循環(huán)語句:
執(zhí)行結果:
執(zhí)行結果:
也可以通過標記退出循環(huán):
--THE END--
部署簡單。Go編譯生成的是一個靜態(tài)可執(zhí)行文件,除了glibc外沒有其他外部依賴。這讓部署變得異常方便:目標機器上只需要一個基礎的系統(tǒng)和必要的管理、監(jiān)控工具,完全不需要操心應用所需的各種包、庫的依賴關系,大大減輕了維護的負擔。這和Python有著巨大的區(qū)別。由于歷史的原因,Python的部署工具生態(tài)相當混亂【比如setuptools,distutils,pip,
buildout的不同適用場合以及兼容性問題】。官方PyPI源又經(jīng)常出問題,需要搭建私有鏡像,而維護這個鏡像又要花費不少時間和精力。
并發(fā)性好。Goroutine和channel使得編寫高并發(fā)的服務端軟件變得相當容易,很多情況下完全不需要考慮鎖機制以及由此帶來的各種問題。單個Go應用也能有效的利用多個CPU核,并行執(zhí)行的性能好。這和Python也是天壤之比。多線程和多進程的服務端程序編寫起來并不簡單,而且由于全局鎖GIL的原因,多線程的Python程序并不能有效利用多核,只能用多進程的方式部署;如果用標準庫里的multiprocessing包又會對監(jiān)控和管理造成不少的挑戰(zhàn)【我們用的supervisor管理進程,對fork支持不好】。部署Python應用的時候通常是每個CPU核部署一個應用,這會造成不少資源的浪費,比如假設某個Python應用啟動后需要占用100MB內(nèi)存,而服務器有32個CPU核,那么留一個核給系統(tǒng)、運行31個應用副本就要浪費3GB的內(nèi)存資源。
良好的語言設計。從學術的角度講Go語言其實非常平庸,不支持許多高級的語言特性;但從工程的角度講,Go的設計是非常優(yōu)秀的:規(guī)范足夠簡單靈活,有其他語言基礎的程序員都能迅速上手。更重要的是Go自帶完善的工具鏈,大大提高了團隊協(xié)作的一致性。比如gofmt自動排版Go代碼,很大程度上杜絕了不同人寫的代碼排版風格不一致的問題。把編輯器配置成在編輯存檔的時候自動運行gofmt,這樣在編寫代碼的時候可以隨意擺放位置,存檔的時候自動變成正確排版的代碼。此外還有gofix,
govet等非常有用的工具。
執(zhí)行性能好。雖然不如C和Java,但通常比原生Python應用還是高一個數(shù)量級的,適合編寫一些瓶頸業(yè)務。內(nèi)存占用也非常省。
寫在前面的話: 最近接觸llvm比較多,在這個上面花了不少的時間。感覺llvm要完全理解透是個很不容易的事情,需要在學習過程中好好的整理下自己的思路。剛好又閱讀了開源項目Storm的作者Nathan Marz的博客《You should blog even if you have no readers》,就打開自己的blog,開始了這個llvm每日談的系列。希望自己能堅持的久一點,多寫寫llvm的每個方面,多寫寫自己的理解。 llvm是low level virtual machine的簡稱,其實是一個編譯器框架。llvm隨著這個項目的不斷的發(fā)展,已經(jīng)無法完全的代表這個項目了,只是這種叫法一直延續(xù)下來。 llvm是一個開源的項目。它最早的時候是Illinois的一個研究項目,主要負責人是Chris Lattner,他現(xiàn)在就職于Apple. Apple 目前也是llvm項目的主要贊助者之一。 llvm的主要作用是它可以作為多種語言的后端,它可以提供可編程語言無關的優(yōu)化和針對很多種CPU的代碼生成功能。此外llvm目前已經(jīng)不僅僅是個編程框架,它目前還包含了很多的子項目,比如最具盛名的clang. llvm的優(yōu)點是開源,有一個表達形式很好的IR語言,模塊化作的特別好。 llvm這個框架目前已經(jīng)有基于這個框架的大量的工具可以使用。 llvm的官方網(wǎng)站地址是:llvm.org。在這里可以下載最新的發(fā)布代碼,也可以找到介紹llvm的相關文檔。 附錄:llvm目前支持的工具(描述來自網(wǎng)絡) llvm-as 將人類可讀的 .ll 文件匯編成字節(jié)代碼 llvm-dis 將字節(jié)代碼文件反編成人類可讀的 .ll 文件 opt 在一個字節(jié)代碼文件上運行一系列的 LLVM 到 LLVM 的優(yōu)化 llc 為一個字節(jié)代碼文件生成本機器代碼 lli 直接運行使用 JIT 編譯器或者解釋器編譯成字節(jié)代碼的程序 llvm-link 將幾個字節(jié)代碼文件連接成一個 llvm-ar 打包字節(jié)代碼文件 llvm-ranlib 為 llvm-ar 打包的文件創(chuàng)建索引 llvm-nm 在 字節(jié)代碼文件中打印名字和符號類型 llvm-prof 將 'llvmprof.out' raw 數(shù)據(jù)格式化成人類可讀的報告 llvm-ld 帶有可裝載的運行時優(yōu)化支持的通用目標連接器 llvm-config 打印出配置時 LLVM 編譯選項、庫、等等 llvmc 一個通用的可定制的編譯器驅(qū)動 llvm-diff 比較兩個模塊的結構 bugpoint 自動案例測試減速器 llvm-extract 從 LLVM 字節(jié)代碼文件中解壓出一個函數(shù) llvm-bcanalyzer 字節(jié)代碼分析器 (分析二進制編碼本身,而不是它代表的程序) FileCheck 靈活的文件驗證器,廣泛的被測試工具利用 tblgen 目標描述閱讀器和生成器 lit LLVM 集成測試器,用于運行測試
GO語言由Google公司開發(fā),并于2009年開源,對比Java、Python、C等語言,GO尤其擅長并發(fā)編程,性能堪比C語言,開發(fā)效率比肩Python,被譽為21世紀的C語言。GO語言在云計算、大數(shù)據(jù)、微服務、高并發(fā)領域,應用非常廣泛。BAT大廠正在把GO作為新項目開發(fā)的首選語言。
LLVM是構架編譯器(compiler)的框架系統(tǒng),以C++編寫而成,用于優(yōu)化以任意程序語言編寫的程序的編譯時間(compile-time)、鏈接時間(link-time)、運行時間(run-time)以及空閑時間(idle-time),對開發(fā)者保持開放,并兼容已有腳本。
TinyGo是一個為微控制器、WebAssembly(Wasm)和命令行工具等小型場景設計的Go語言編譯器。TinyGo重用了Go語言工具和LLVM使用的庫,以編譯用Go語言編寫的程序。目前,該項目在GitHub上已經(jīng)積累了10.1k的Star。
如下為一個示例程序,當運行在任何支持的帶板載LED的主板上時,則會點亮內(nèi)置LED。
上述程序可以在單片機、Adafruit ItsyBitsy M0微控制器或任何支持的帶內(nèi)置LED的板上進行編譯和不需要修改的運行,只要設置正確的TinyGo編譯器目標即可。例如,設置如下目標可以編譯和點亮 單片機。
項目概述
TinyGo項目旨在將Go語言引入到具有單進程或核心的微控制器和小系統(tǒng)。TinyGo類似于emgo,但主要的區(qū)別在于作者想要保留Go內(nèi)存模型。另一個區(qū)別在于TinyGo在內(nèi)部使用LLVM,因而可以獲得更小更高效的代碼以及更高的靈活性。
創(chuàng)建TinyGo項目的初衷是,如果Python可以在微控制器上運行,Go語言當然也應該能夠在更低級微設備上運行。
支持設備
你可以為微控制器、WebAssembly和Linux編譯TinyGo程序。目前,TinyGo支持以下85種微處理器板。
更多技術細節(jié)請參閱原項目。