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