Go語言程序設(shè)計(jì)及實(shí)例 課件全套 第1-8章 Go語言及編程環(huán)境 -Go語言微服務(wù)開發(fā)入門_第1頁
Go語言程序設(shè)計(jì)及實(shí)例 課件全套 第1-8章 Go語言及編程環(huán)境 -Go語言微服務(wù)開發(fā)入門_第2頁
Go語言程序設(shè)計(jì)及實(shí)例 課件全套 第1-8章 Go語言及編程環(huán)境 -Go語言微服務(wù)開發(fā)入門_第3頁
Go語言程序設(shè)計(jì)及實(shí)例 課件全套 第1-8章 Go語言及編程環(huán)境 -Go語言微服務(wù)開發(fā)入門_第4頁
Go語言程序設(shè)計(jì)及實(shí)例 課件全套 第1-8章 Go語言及編程環(huán)境 -Go語言微服務(wù)開發(fā)入門_第5頁
已閱讀5頁,還剩507頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第1章Go語言及編程環(huán)境Go語言簡(jiǎn)介01誕生背景誕生背景為應(yīng)對(duì)新時(shí)代互聯(lián)網(wǎng)的應(yīng)用程序需要,谷歌的羅伯特·格瑞史莫(RobertGriesemer)、羅布·派克(RobPike)和肯·湯普遜(KenThompson)于2007年9月開始著手設(shè)計(jì)一種全新的編程語言——Go語言,隨后IanLanceTaylor和RussCox加入該項(xiàng)目,新語言不僅原生支持并發(fā)多核編程、極大提升了編譯速度,而且徹底摒棄了傳統(tǒng)語言中很多復(fù)雜(并不實(shí)用)的語法。Go語言一經(jīng)推出就廣受歡迎,于2009年11月開放源代碼,并在Linux及MacOSX平臺(tái)上進(jìn)行了實(shí)現(xiàn),后來還追加了Windows系統(tǒng)下的實(shí)現(xiàn)。02設(shè)計(jì)哲學(xué)1.少即是多2.世界是組合的3.面向接口編程設(shè)計(jì)哲學(xué)(1)(2)(3)在編程領(lǐng)域也有一個(gè)所謂的“二八定律”,即:百分之八十的代碼僅使用到百分之二十的語言特性。可見,單純地增加語言特性并不能保證開發(fā)效率的提升,原因是它會(huì)增加復(fù)雜性,導(dǎo)致程序員更容易犯錯(cuò)。遵循“二八定律”正如用一個(gè)方向盤就可以控制汽車行駛,就沒必要造具有多個(gè)方向盤甚至復(fù)雜方向變換系統(tǒng)的汽車。例如,Go語言只有for循環(huán),而不像其他語言那樣還有while、dowhile、foreach等多種循環(huán)語句,只提供一種方法做事情,把事情做到極致就好。做任何事只提供一種方法幾何上的正交指兩個(gè)向量垂直,現(xiàn)實(shí)中的正交是指多個(gè)因素的一個(gè)發(fā)生變化,不會(huì)影響其他因素。例如,Go語言中的協(xié)程、接口、類型系統(tǒng)之間是相互獨(dú)立(正交)的,但在編程中通過組合運(yùn)用這些特性,卻可以極大地提升語言表現(xiàn)力,實(shí)現(xiàn)很多復(fù)雜的功能。提供正交的語言特性1.少即是多設(shè)計(jì)哲學(xué)2.世界是組合的Go語言的設(shè)計(jì)者從物質(zhì)世界的構(gòu)成模式得到啟發(fā),發(fā)現(xiàn)“組合”才是世間萬物最基本最常見的關(guān)系,而過往的以“繼承”為基礎(chǔ)的面向?qū)ο笳Z言(典型如Java),在對(duì)事物的描述上存在根本的缺陷,類和對(duì)象更適合表現(xiàn)孤立的單個(gè)事物,一旦涉及多個(gè)事物間的復(fù)雜交互就會(huì)出現(xiàn)各種問題,為此Go語言設(shè)計(jì)者提出“組合優(yōu)于繼承”的觀點(diǎn),采用組合的方式來描述對(duì)象之間的關(guān)系,更貼近真實(shí)的自然世界。Go沒有像Java一樣“宗教式”地完全面向?qū)ο螅墙Y(jié)合了面向過程、函數(shù)式設(shè)計(jì)及面向?qū)ο蟮膬?yōu)點(diǎn),其語法元素與C語言有相似之處,用結(jié)構(gòu)體(struct)及其強(qiáng)大的類型系統(tǒng)來構(gòu)建具有自身特色的面向?qū)ο篌w系,通過函數(shù)、接口、類型、閉包等元素的組合,能夠輕松地把大型程序的各個(gè)模塊巧妙地銜接運(yùn)作起來。設(shè)計(jì)哲學(xué)3.面向接口編程Go語言編程是面向接口的,采用一種Duck模型,即類型(類)不再需要顯式地聲明自己實(shí)現(xiàn)了哪個(gè)(些)接口,接口類型的判斷完全交給底層語言編譯器去處理,這就將接口與其實(shí)現(xiàn)徹底地分開,形成了一種“面向接口”的全新編程方式。程序員無須在一開始就精心設(shè)計(jì)整個(gè)系統(tǒng)的接口繼承體系,而是先基于當(dāng)下具體的某個(gè)應(yīng)用需求局部設(shè)計(jì)實(shí)現(xiàn)一些小的接口,后續(xù)再根據(jù)需求變化和應(yīng)用擴(kuò)展的需要,通過已有接口的自由組合,構(gòu)造出更抽象、更普適、功能更強(qiáng)的新接口,這使得Go程序的重構(gòu)非常容易,尤其適合互聯(lián)網(wǎng)時(shí)代應(yīng)用快速迭代的開發(fā)方式。03優(yōu)勢(shì)特性優(yōu)勢(shì)特性Go的優(yōu)勢(shì)特性主要體現(xiàn)在如下幾個(gè)方面。(1)Go的語法十分簡(jiǎn)潔,僅僅用了25個(gè)關(guān)鍵字,是所有主流編程語言中關(guān)鍵字最少的。(2)Go語言支持垃圾回收;內(nèi)置強(qiáng)大的類型系統(tǒng)支持各種復(fù)合數(shù)據(jù)類型,如關(guān)聯(lián)數(shù)組、切片、映射和列表等;內(nèi)存安全,如內(nèi)置數(shù)組邊界檢查,極大減少越界訪問帶來的安全隱患;還有大量的包和第三方庫(kù)的支持。(3)基于類似C的結(jié)構(gòu)體(struct)以組合方式構(gòu)建的面向?qū)ο笙到y(tǒng),不僅具備Java對(duì)象系統(tǒng)的所有功能,而且對(duì)問題域的描述和表現(xiàn)力更強(qiáng),更貼近客觀真實(shí)的世界;內(nèi)置接口類型,通過接口組合形成新的接口,非侵入式的接口機(jī)制徹底解除了接口與實(shí)現(xiàn)的耦合,便于快速重構(gòu)和迭代開發(fā)大型應(yīng)用系統(tǒng)。(4)Go在語言級(jí)別原生支持并發(fā),簡(jiǎn)化了并發(fā)程序設(shè)計(jì);基于通道和協(xié)程通信的并發(fā)機(jī)制相比傳統(tǒng)語言的線程機(jī)制效率更高,有利于充分發(fā)揮多核CPU的威力,為互聯(lián)網(wǎng)云時(shí)代微服務(wù)開發(fā)的首選語言。第1章Go語言及編程環(huán)境Go語言安裝與使用01平臺(tái)與版本平臺(tái)與版本Go是跨平臺(tái)的編程語言,在各主流操作系統(tǒng)平臺(tái)上都有對(duì)應(yīng)的安裝包,訪問官網(wǎng)/dl/(Golang中國(guó))可分別下載到Go在Windows、MacOSX、Linux平臺(tái)上的安裝包及源碼,如圖。02Windows平臺(tái)安裝Go語言1.下載Go語言編程環(huán)境2.安裝Go語言編程環(huán)境Windows平臺(tái)安裝Go語言1.下載Go語言編程環(huán)境在圖的頁面上點(diǎn)擊“MicrosoftWindows”區(qū)塊的鏈接下載Go的安裝包,得到的安裝包文件名為go1.20.4.windows-amd64.msi。2.安裝Go語言編程環(huán)境(1)雙擊下載得到的安裝包文件,啟動(dòng)安裝向?qū)鐖D,單擊“Next”按鈕。Windows平臺(tái)安裝Go語言(2)在“End-UserLicenseAgreement”界面勾選“IacceptthetermsintheLicenseAgreement”接受許可條款,如圖,單擊“Next”按鈕。Windows平臺(tái)安裝Go語言(3)在“DestinationFolder”界面設(shè)置Go的安裝目錄,這個(gè)目錄是作為Go語言環(huán)境的GOROOT路徑,通常默認(rèn)“C:\ProgramFiles\Go”,如圖,單擊“Next”按鈕。Windows平臺(tái)安裝Go語言(4)在下一個(gè)界面單擊“Install”按鈕開始安裝,界面進(jìn)度條顯示安裝進(jìn)度,完成后單擊“Finish”按鈕關(guān)閉向?qū)ВY(jié)束安裝。以管理員身份打開Windows命令行,輸入“goversion”,出現(xiàn)Go的版本信息就表示安裝成功,如圖。03第一個(gè)Go程序1.編寫Go程序2.運(yùn)行Go程序第一個(gè)Go程序1.編寫Go程序【實(shí)例1.1】編寫第一個(gè)Go程序。打開Windows記事本,編寫程序代碼如下(hello.go):packagemain //(a)

import"fmt" //(b)

funcmain(){ //(c) fmt.Printf("Hello,我愛Go語言!@easybooks\n") //(d)}說明:(a)包聲明語句。在所有Go源程序文件頭部都要用一行“package包名”聲明其代碼所屬的包,Go通過包來管理和組織源代碼。(b)包導(dǎo)入語句。“import"包名"”語句導(dǎo)入包,通常Go程序都要像這樣在開頭用一條或多條import語句導(dǎo)入一個(gè)或多個(gè)需要引用的外部包,可以是Go語言內(nèi)置標(biāo)準(zhǔn)庫(kù)的包,也可以是第三方包或自定義的包。(c)入口函數(shù)。用func關(guān)鍵字聲明定義一個(gè)函數(shù),這里所聲明的main函數(shù)是Go程序的入口函數(shù),程序編譯后由此進(jìn)入開始執(zhí)行。(d)“fmt.Printf("Hello,我愛Go語言!@easybooks\n")”調(diào)用標(biāo)準(zhǔn)輸入/輸出包的Printf函數(shù)輸出字符串,要輸出的字符串作為實(shí)參傳入Printf函數(shù),必須用雙引號(hào)("")括起來,注意這里不能用單引號(hào)。第一個(gè)Go程序2.運(yùn)行Go程序在Windows命令行下運(yùn)行Go程序有兩種方式。(1)gorun命令直接運(yùn)行g(shù)orun命令直接編譯并執(zhí)行源碼中的main函數(shù)。打開命令行,用cd命令進(jìn)入到GOPATH目錄,輸入命令:gorunhello.go立即看到程序輸出結(jié)果。第一個(gè)Go程序(2)gobuild命令生成可執(zhí)行文件運(yùn)行g(shù)obuild命令會(huì)先將源碼編譯為可執(zhí)行(.exe)文件,然后由用戶運(yùn)行該文件來執(zhí)行程序。在命令行GOPATH目錄中執(zhí)行命令:gobuildhello.go待命令執(zhí)行過后,去到GOPATH目錄下可以看到生成了一個(gè)hello.exe文件。運(yùn)行文件hello.exe,直接輸入:hello.exe輸出同樣的結(jié)果。以上兩種方式運(yùn)行Go程序的過程如圖。第1章Go語言及編程環(huán)境Go語言集成開發(fā)環(huán)境01常用集成開發(fā)環(huán)境常用集成開發(fā)環(huán)境可用于Go語言編程的集成開發(fā)環(huán)境很多,比較常用的如下。(1)GolandGoland是由著名的JetBrains公司推出的一個(gè)商業(yè)IDE,它整合IntelliJ平臺(tái),提供了針對(duì)Go語言的編碼輔助和大量工具集成。(2)LiteIDELiteIDE是由國(guó)內(nèi)開發(fā)者做出的一款專門針對(duì)Go語言的輕量級(jí)開發(fā)環(huán)境,它基于Qt、Kate和SciTE,包含了跨平臺(tái)開發(fā)及其它一些必要特性,對(duì)代碼編寫、自動(dòng)補(bǔ)全和運(yùn)行調(diào)試都有很好的支持,同時(shí)還包括了對(duì)源代碼的抽象語法樹視圖和一些內(nèi)置工具。(3)SublimeText這是一個(gè)跨平臺(tái)的文本編輯器,支持編寫非常多的編程語言代碼,它通過一個(gè)叫GoSublime的插件來支持Go語言的代碼補(bǔ)全和程序模版創(chuàng)建。(4)GoClipseGoClipse是一個(gè)為Eclipse添加Go語言編程功能的插件,通過gocode來實(shí)現(xiàn)代碼補(bǔ)全,為初學(xué)者創(chuàng)造一個(gè)開發(fā)Go語言的環(huán)境,它依附于著名的Eclipse平臺(tái),可以很容易地享有Eclipse本身所具有的諸多功能。(5)VSCodeVSCode是一款由微軟開發(fā)的跨平臺(tái)開源代碼編輯器,它使用JSON格式的配置文件進(jìn)行所有功能和特性的配置,通過擴(kuò)展程序?yàn)榫庉嬈鲗?shí)現(xiàn)語法高亮、參數(shù)提示、編譯、調(diào)試、文檔生成等各種功能。02GoLand安裝與配置1.安裝2.初始啟動(dòng)3.項(xiàng)目配置GoLand安裝與配置1.安裝(1)GoLand下載地址/go/,單擊官方主頁上的“Download”按鈕,轉(zhuǎn)到下載頁,點(diǎn)擊頁面上的“directlink”鏈接下載GoLand安裝包。(2)雙擊下載得到的安裝包goland-2023.1.2.exe,啟動(dòng)GoLand安裝向?qū)鐖D,單擊“Next”按鈕。GoLand安裝與配置(3)在“ChooseInstallLocation”界面設(shè)置GoLand安裝目錄,單擊“Next”按鈕。(4)在“InstallationOptions”界面對(duì)GoLand安裝選項(xiàng)進(jìn)行配置,如圖。為方便使用Go語言環(huán)境,建議選中全部選項(xiàng),單擊“Next”按鈕。GoLand安裝與配置(5)在“ChooseStartMenuFolder”界面選擇(命名)要在其中創(chuàng)建程序快捷方式的開始菜單目錄(通常保持默認(rèn)的“JetBrains”),單擊“Install”按鈕開始安裝,界面進(jìn)度條顯示安裝進(jìn)度,完成后在“CompletingGoLandSetup”界面確保選中了“Rebootnow”選項(xiàng),單擊“Finish”按鈕關(guān)閉向?qū)В鐖D,系統(tǒng)會(huì)自動(dòng)重啟,使所有的GoLand安裝選項(xiàng)生效。GoLand安裝與配置2.初始啟動(dòng)(1)GoLand環(huán)境支持老用戶使用已有的配置,在初次啟動(dòng)時(shí)會(huì)彈出如圖所示的對(duì)話框詢問是否導(dǎo)入已有設(shè)置,由于筆者計(jì)算機(jī)是第一次安裝GoLand,選“Donotimportsettings”,單擊“OK”按鈕。GoLand安裝與配置(2)GoLand是商業(yè)軟件,需要先激活才能使用。在如左圖所示的界面上選中“ActivateGoLand”、“Activationcode”,于下方文本區(qū)粘貼獲取到的激活碼,單擊“Activate”按鈕,激活成功后,在接下來的界面單擊“Continue”,出現(xiàn)歡迎界面如右圖所示。GoLand安裝與配置(3)GoLand界面默認(rèn)背景是暗黑色,如果不習(xí)慣可以進(jìn)行更改,操作方法是:點(diǎn)選歡迎界面左側(cè)“Customize”切換至環(huán)境定制選項(xiàng)頁,在“Colortheme”下拉列表中選擇“IntelliJLight”選項(xiàng),界面背景立刻變?yōu)槭孢m的亮白色,如左圖所示。點(diǎn)選左側(cè)“Projects”又切換回歡迎界面,如右圖所示。

GoLand安裝與配置3.項(xiàng)目配置(1)創(chuàng)建Go項(xiàng)目點(diǎn)擊GoLand歡迎界面上的“NewProject”()圖標(biāo)按鈕創(chuàng)建一個(gè)Go項(xiàng)目,出現(xiàn)“NewProject”界面,在“Location”欄設(shè)置項(xiàng)目保存路徑及給項(xiàng)目命名。項(xiàng)目默認(rèn)保存在操作系統(tǒng)當(dāng)前用戶的GolandProjects目錄下,第一次創(chuàng)建項(xiàng)目時(shí)GoLand會(huì)自動(dòng)生成這個(gè)目錄,并給項(xiàng)目取默認(rèn)名awesomeProject,如圖所示。GoLand安裝與配置(2)配置項(xiàng)目的Go環(huán)境項(xiàng)目的Go環(huán)境通過GOROOT與GOPATH兩個(gè)環(huán)境變量來配置,之前在安裝使用Go語言的時(shí)候?qū)λ鼈兊囊饬x已有所提及。GOROOT:Go語言本身(與所使用的開發(fā)工具無關(guān))的安裝目錄,通常默認(rèn)為“C:\ProgramFiles\Go”,當(dāng)然在安裝Go語言時(shí)也可通過向?qū)У摹癉estinationFolder”界面進(jìn)行更改。GOPATH:這是Go程序編譯時(shí)參考的工作目錄,類似于Java的工作區(qū)(Workspace),由用戶自己創(chuàng)建或指定,筆者的是C:\Users\Administrator\go。開發(fā)時(shí)Go項(xiàng)目所要引用的第三方庫(kù)、框架及其他獨(dú)立的.go源文件都放在這個(gè)目錄(及其子目錄)下,以便Go編譯器能夠找到。GoLand安裝與配置GOPATH則需要用戶來設(shè)置,可以在一開始創(chuàng)建項(xiàng)目時(shí)就通過點(diǎn)選“NewProject”界面左側(cè)“Go(GOPATH)”切換到另一個(gè)選項(xiàng)頁界面上去設(shè)置GOPATH,也可以在項(xiàng)目創(chuàng)建好后于GoLand集成開發(fā)環(huán)境中選擇菜單“File”→“Settings...”,打開如圖1.16所示的“Settings”對(duì)話框窗口,在左側(cè)樹狀導(dǎo)航視圖中選中“Go”→“GOPATH”,在右邊界面“GlobalGOPATH”欄工具條上點(diǎn)擊“Add”()按鈕添加GOPATH路徑條目。03集成開發(fā)環(huán)境編寫Go程序1.編寫Go程序2.運(yùn)行Go程序集成開發(fā)環(huán)境編寫Go程序【實(shí)例1.2】在GoLand集成開發(fā)環(huán)境下編寫和運(yùn)行第一個(gè)Go程序。1.編寫Go程序在GoLand集成開發(fā)環(huán)境下右擊項(xiàng)目名,選擇“New”→“GoFile”,彈出“NewGoFile”提示用戶輸入文件名,如圖,這里選“Emptyfile”,輸入“hello”直接回車,就在項(xiàng)目中創(chuàng)建了一個(gè)Go程序文件hello.go。集成開發(fā)環(huán)境編寫Go程序GoLand自動(dòng)打開hello.go文件編輯器,在其中編寫Go程序代碼(或?qū)?.2.3節(jié)的程序代碼復(fù)制粘貼到編輯器中)保存即可,如圖。集成開發(fā)環(huán)境編寫Go程序2.運(yùn)行Go程序在GoLand環(huán)境左側(cè)項(xiàng)目樹狀視圖中右擊hello.go文件項(xiàng),彈出菜單選“Run'gobuildhello.go'”或者直接單擊工具欄按鈕運(yùn)行程序,在開發(fā)環(huán)境底部出現(xiàn)子窗口顯示運(yùn)行結(jié)果,如圖。第2章Go語言基礎(chǔ)標(biāo)

識(shí)

符01標(biāo)識(shí)符及命名規(guī)范標(biāo)識(shí)符及命名規(guī)范Go語言的標(biāo)識(shí)符命名規(guī)范如下。(1)標(biāo)識(shí)符由任意多個(gè)字符(大/小寫字母A~Z/a~z)、數(shù)字(0~9)、下畫線(_)組成。(2)第一個(gè)字符必須是字母或下畫線。(3)區(qū)分大小寫,如hello與Hello是兩個(gè)不同的標(biāo)識(shí)符。(4)標(biāo)識(shí)符中不能含有空格及#、$、@等特殊符號(hào)。例如:_123 //合法123 //非法,不能以數(shù)字開頭a123 //合法$a123 //非法,不能以特殊符號(hào)開頭HelloWorld //合法HelloWorld //非法,不能含有空格Subject //合法Subject# //非法,不能含有#02關(guān)

字關(guān)鍵字Go是一門極簡(jiǎn)的語言,僅有25個(gè)關(guān)鍵字,它們按功能的不同大致可分為3類,見下表所示。分

類關(guān)鍵字功

能引導(dǎo)程序整體結(jié)構(gòu)package聲明程序所在的包import導(dǎo)入程序要用的外部(含第三方)包var聲明變量const聲明常量func聲明和定義函數(shù)defer延遲執(zhí)行g(shù)o并發(fā)執(zhí)行return函數(shù)返回值定義特殊類型type自定義類型struct定義結(jié)構(gòu)interface定義接口map聲明或創(chuàng)建映射chan創(chuàng)建通道(并發(fā)編程)控制程序流程if條件語句elsefor控制循環(huán)rangebreakcontinueswitch分支語句selectcasedefaultfallthroughgoto跳轉(zhuǎn)語句03保

字保留字除關(guān)鍵字外,Go語言還有一些內(nèi)部保留字,用于預(yù)定義內(nèi)置的數(shù)據(jù)類型、函數(shù)及常量。Go共有39個(gè)保留字,分類列于表。分類保留字說

明內(nèi)置數(shù)據(jù)類型int整型int8int16int32int64byte無符號(hào)整型uintuint8uint16uint32uint64uintptrfloat32浮點(diǎn)型float64complex64復(fù)數(shù)型complex128string字符串型runebool布爾型分類保留字說

error接口型內(nèi)置函數(shù)make這些函數(shù)都是Go語言內(nèi)置的,具有“全局可見性”,在編寫程序時(shí)可直接調(diào)用,無須import導(dǎo)入或聲明newlencapappendcopydeletepanicrecoverclosecomplexrealimagprintprintln內(nèi)部常量true布爾型值falseiota連續(xù)的枚舉值nil指針/引用的默認(rèn)空值第2章Go語言基礎(chǔ)變量與常量01變

量1.變量聲明2.變量賦值變

量1.變量聲明在Go語言中,變量的聲明比較靈活,有3種方式。(1)標(biāo)準(zhǔn)方式標(biāo)準(zhǔn)方式就是以關(guān)鍵字var顯式地聲明單獨(dú)的一個(gè)變量,格式為:var變量名類型例如:varnamestring //聲明字符串型變量namevarsexbool //聲明布爾型變量sexvarageint //聲明整型變量age(2)批量方式在需要使用一組相關(guān)的多個(gè)變量的情形下,用批量方式進(jìn)行聲明會(huì)更加高效。此方式根據(jù)多變量類型是否相同,又有兩種不同的聲明形式,如下。①類型相同多變量的聲明當(dāng)要聲明的幾個(gè)變量類型都相同時(shí),只須在標(biāo)準(zhǔn)方式的基礎(chǔ)上擴(kuò)充即可,格式變?yōu)椋簐ar變量名1,變量名2,...,變量名n類型例如:varage,weight,heightint //聲明3個(gè)整型變量age、weight、height變

量②類型不同多變量的聲明當(dāng)要批量聲明的一組相關(guān)變量的類型不同時(shí),Go語言提供一種新方法,用關(guān)鍵字var搭配括號(hào)將這組變量的定義放在一起,格式為:var(

變量名1類型1

變量名2類型2 ...

變量名n類型n)例如:var( namestring //姓名 sexbool //性別 weightint //體重 heightint //身高 bmifloat32 //身體質(zhì)量指數(shù)(體重÷身高2))變

量(3)簡(jiǎn)短方式這種方式不用var關(guān)鍵字,直接以“:=”操作符在聲明變量的同時(shí)就對(duì)其進(jìn)行初始化,格式為:變量名:=表達(dá)式 //聲明(同時(shí)初始化)單個(gè)變量或者變量名1,變量名2,...,變量名n:=表達(dá)式1,表達(dá)式2,...,表達(dá)式n //聲明多個(gè)變量(右邊表達(dá)式要與左邊變量名一一對(duì)應(yīng))變

量2.變量賦值(1)變量初始值凡用var關(guān)鍵字聲明的變量,Go系統(tǒng)都會(huì)自動(dòng)賦予其初始值,為變量類型的零值或空值,比如,string類型為空字符串,bool類型為false,int類型為0等。【實(shí)例2.1】聲明并查看不同類型變量的初始值。程序代碼如下(var00.go):packagemainimport"fmt"funcmain(){ varnamestring //標(biāo)準(zhǔn)方式聲明字符串變量 varweight,heightint //批量方式聲明同類型變量 var( sexbool ageint bmifloat32 ) //批量方式聲明不同類型變量 note:="我的體態(tài)" //簡(jiǎn)短方式聲明并初始化變量 //輸出各變量的初始值 fmt.Println(note+"\n姓名:"+name) fmt.Println("性別:",sex) fmt.Println("年齡:",age) fmt.Println("體重:",weight) fmt.Println("身高:",height) fmt.Println("BMI指數(shù):",bmi)}運(yùn)行結(jié)果如圖。變

量(2)單變量賦值給單個(gè)變量賦值的語句標(biāo)準(zhǔn)格式為:var變量名[類型]=值其中,“類型”可省略,Go編譯器能夠根據(jù)所賦值的數(shù)據(jù)類型自動(dòng)推斷出變量的類型,例如,下面這兩條語句是等價(jià)的:varnamestring="周何駿" //單變量賦值varname="周何駿" //單變量賦值(省略類型)變

量(3)多變量賦值給多個(gè)變量賦值的程序代碼的標(biāo)準(zhǔn)格式為:var(

變量名1[類型1]=值1

變量名2[類型2]=值2 ...

變量名n[類型n]=值n)這里各個(gè)變量的類型也是可以省略的,交給Go編譯器自行推斷。例如:var( namestring="周何駿" //姓名 sexbool=true //性別 weightint=60 //體重 heightint=173 //身高 bmifloat32=20.05 //身體質(zhì)量指數(shù)(體重÷身高2))變

量也可以將多個(gè)變量的賦值語句寫為一行,形如:var變量名1,變量名2,...,變量名n=值1,值2,...,值n各變量名與所賦的值按順序?qū)?yīng)列于等號(hào)的兩邊,中間以英文逗號(hào)(,)分隔,要注意變量與值的一一對(duì)應(yīng)關(guān)系。變量類型可以相同也可以不同,編譯器能自動(dòng)識(shí)別。例如:varweight,height=60,173 //類型相同的多變量賦值varname,sex,age="周何駿",true,19 //類型不同的多變量賦值變

量【實(shí)例2.2】用多種不同方式給單個(gè)或多個(gè)變量賦值,并查看所賦的值。程序代碼如下(var01.go):packagemainimport"fmt"funcmain(){ varname="周何駿" //單變量賦值 varweight,height=60,173 //多變量賦值(寫為一行) var( sex=true age=19 bmi=20.05 ) //多變量賦值(標(biāo)準(zhǔn)格式) note:="我的體態(tài)" //輸出各變量所賦的值 fmt.Println(note+"\n姓名:"+name) fmt.Println("性別:",sex) fmt.Println("年齡:",age) fmt.Println("體重:",weight) fmt.Println("身高:",height) fmt.Println("BMI指數(shù):",bmi)}運(yùn)行結(jié)果如圖。02常

量1.常量聲明2.常量初始化常

量1.常量聲明Go語言的常量使用關(guān)鍵字const聲明,格式如下:const常量名[類型]=值常量必須在聲明的同時(shí)就賦一個(gè)確定值,這是與變量不一樣的地方。大家會(huì)發(fā)現(xiàn),常量聲明語句與單變量的賦值語句在形式上一樣,其“類型”也可省略,由編譯器來推導(dǎo)。例如:constefloat32=2.71828 //自然常數(shù)econstcint=299792458 //光速cconstg=6.67e-11 //引力常數(shù)G(省略類型)constpi=3.1416 //圓周率π(省略類型)constlanguagestring="Go語言" //字符串常量constsexbool=true //布爾型常量常

量也可以像變量聲明那樣批量聲明一組常量,只須用關(guān)鍵字const搭配括號(hào),如下:const( name="周何駿" sex=true weight=60 height=173)常量的值必須是能夠在編譯時(shí)就被確定的,可以在其賦值表達(dá)式中涉及計(jì)算過程,但是所有用于計(jì)算的值必須在編譯期間就能獲得,例如://錯(cuò)誤(weight、height為變量,直到運(yùn)行期才被賦值)varweight,height=60,173constbmi=weight/((height/100)^2)

//正確(weight、height為常量,在編譯期就能得到值)constweight,height=60,173constbmi=weight/((height/100)^2)常

量2.常量初始化對(duì)于一組數(shù)值間存在遞增(減)關(guān)系的常量,可以使用Go語言的常量生成器iota進(jìn)行初始化。iota可自動(dòng)生成一組以相似規(guī)則初始化的常量,而不用每行都寫一遍初始化表達(dá)式。在一個(gè)const聲明語句中,第1個(gè)聲明的常量所在行的iota會(huì)被置為0,之后的每一個(gè)有常量聲明的行iota會(huì)被自動(dòng)加1,如下:const( c0=iota //c0==0 c1=iota //c1==1 c2=iota //c2==2 ... cn=iota //cn==n)也可以簡(jiǎn)寫為:const( c0=iota //c0==0 c1 //c1==1 c2 //c2==2 ... cn //cn==n)常

量【實(shí)例2.3】用生成器iota初始化月份常量值。程序代碼如下(const.go):packagemainimport"fmt"funcmain(){ const( month=iota Jan Feb Mar Apr ) fmt.Print(Jan,"月、",Feb,"月、",Mar,"月、",Apr,"月...")}運(yùn)行結(jié)果如圖。第2章Go語言基礎(chǔ)運(yùn)算符與表達(dá)式運(yùn)算符與表達(dá)式1.運(yùn)算符Go語言有幾十種運(yùn)算符,被分為了十幾個(gè)類別,詳見下表。優(yōu)先級(jí)分

類運(yùn)

符結(jié)合性1(最高)括號(hào)()、[]從左向右2單目運(yùn)算符!、*(指針)、&、++、--、+(正號(hào))、-(負(fù)號(hào))從右向左3乘/除/取余*、/、%從左向右4加/減+、-從左向右5位移運(yùn)算符<<、>>從左向右6關(guān)系運(yùn)算符<、<=、>、>=從左向右7等于/不等于==、!=從左向右8按位“與”&從左向右9按位“異或”^從左向右10按位“或”|從左向右11邏輯“與”&&從左向右12邏輯“或”||從左向右13賦值運(yùn)算符=、+=、-=、*=、/=、%=、>=、<<=、&=、^=、|=從右向左14逗號(hào)運(yùn)算符,從左向右運(yùn)算符與表達(dá)式2.優(yōu)先級(jí)和結(jié)合性(1)算術(shù)運(yùn)算符優(yōu)先級(jí)同數(shù)學(xué)因Go語言中大部分算術(shù)運(yùn)算符(包括加/減/乘/除/取余等)的優(yōu)先級(jí)和數(shù)學(xué)中是一致的,故只要知道數(shù)學(xué)運(yùn)算的優(yōu)先級(jí)即可正確計(jì)算算術(shù)表達(dá)式的值,例如:vara,b,cint=2,4,8d:=a+b*c對(duì)于第2行程序語句中的表達(dá)式“a+b*c”,按照數(shù)學(xué)運(yùn)算規(guī)則,應(yīng)該先計(jì)算乘法,再計(jì)算加法。(2)加括號(hào)的部分最先算從上表可見,第1行括號(hào)的優(yōu)先級(jí)為最高,故不管表達(dá)式如何復(fù)雜,都要首先計(jì)算其加括號(hào)的部分。例如,要想改變表達(dá)式“a+b*c”的求值順序,先計(jì)算加法后計(jì)算乘法,只須對(duì)其加法部分加括號(hào),語句改為如下:d:=(a+b)*c運(yùn)算符與表達(dá)式(3)多個(gè)括號(hào)最內(nèi)層最優(yōu)先當(dāng)表達(dá)式中有多個(gè)括號(hào)嵌套時(shí),最內(nèi)層的括號(hào)最優(yōu)先。例如:constbmi=weight/((height/100)^2)計(jì)算時(shí)應(yīng)當(dāng)先執(zhí)行內(nèi)層括號(hào)里的“height/100”(將身高換算成米為單位),然后才執(zhí)行外層括號(hào)的乘方(^2)運(yùn)算。(4)其余遵循Go語言運(yùn)算符優(yōu)先級(jí)對(duì)于由多種不同類別運(yùn)算符混合構(gòu)成的表達(dá)式,則根據(jù)Go語言運(yùn)算符的優(yōu)先級(jí)來決定運(yùn)算順序,可參照上表。運(yùn)算符的結(jié)合性是指,當(dāng)相同優(yōu)先級(jí)的運(yùn)算符在同一個(gè)表達(dá)式中(且沒有括號(hào))時(shí),計(jì)算的順序,通常有“從左向右”和“從右向左”兩個(gè)方向。運(yùn)算符與表達(dá)式3.運(yùn)算符測(cè)試(1)自增(++)和自減(--)運(yùn)算符自增(如a++,a是變量)表示將變量值加1。Go語言為了保持簡(jiǎn)潔性,避免混淆和錯(cuò)誤,取消了對(duì)前綴自增(如++a)的支持,這與絕大多數(shù)語言如C/C++、Java等都不一樣。同理,自減也僅支持后綴自減(如a--),表示將變量值減1。另外,GO中的a++、a--等都是語句而非表達(dá)式,必須單獨(dú)寫為一行。【實(shí)例2.4】測(cè)試自增和自減運(yùn)算符。程序代碼如下(opt01.go):運(yùn)行結(jié)果如圖。運(yùn)算符與表達(dá)式(2)位運(yùn)算符位運(yùn)算符是對(duì)變量值按其在計(jì)算機(jī)內(nèi)部的二進(jìn)制表示按位進(jìn)行操作的一類運(yùn)算符,介紹如下。①按位“與”(&)對(duì)參與運(yùn)算的兩個(gè)數(shù)值相應(yīng)的二進(jìn)制位進(jìn)行與運(yùn)算,規(guī)則為:0&0=0,0&1=0,1&0=0,1&1=1。②按位“或”(|)對(duì)參與運(yùn)算的兩個(gè)數(shù)值相應(yīng)的二進(jìn)制位進(jìn)行或運(yùn)算,規(guī)則為:0|0=0,0|1=1,1|0=1,1|1=1。③按位“異或”(^)對(duì)參與運(yùn)算的兩個(gè)數(shù)值相應(yīng)的二進(jìn)制位進(jìn)行異或運(yùn)算,即相同的是0、不相同是1:0^0=0,1^0=1,0^1=1,1^1=0。異或運(yùn)算還有一個(gè)特別的性質(zhì),對(duì)于兩個(gè)整數(shù)x、y,表達(dá)式(x^y)^y的值又會(huì)還原為x,利用這個(gè)特性可以對(duì)數(shù)值進(jìn)行加密。④右移(>>)將一個(gè)數(shù)值的所有二進(jìn)制位向右移若干位,右移后左邊空出的位用0填充。向右移一位相當(dāng)于整除2(舍棄小數(shù)部分)。⑤左移(<<)將一個(gè)數(shù)值的所有二進(jìn)制位向左移若干位,右邊空出的位填0。左邊移出的位并不丟棄(依然有效),故左移一位相當(dāng)于乘以2。運(yùn)算符與表達(dá)式【實(shí)例2.5】測(cè)試位運(yùn)算符。程序代碼如下(opt02.go):運(yùn)行結(jié)果如圖。第2章Go語言基礎(chǔ)基本數(shù)據(jù)類型01整

型整

型Go語言內(nèi)置了多達(dá)12種整型,大體分為無符號(hào)與有符號(hào)兩大類,各整型的名稱、描述及取值范圍如表。分類名稱描

述取值范圍無符號(hào)uint88位整型0~255byteuint8的別名0~255uint1616位整型0~65535uint3232位整型0~4294967295uint6464位整型0~18446744073709551615uint32或64位(基于架構(gòu))的整型—uintptr用于存放指針的整型(基于架構(gòu))—有符號(hào)int88位整型-128~127int1616位整型-32768~32767int3232位整型-2147483648~2147483647int6464位整型-9223372036854775808~9223372036854775807int32或64位(基于架構(gòu))的整型—整

型其中,uint、uintptr和int這3個(gè)類型是基于架構(gòu)的,即它們的位數(shù)由實(shí)際運(yùn)行程序的操作系統(tǒng)來決定,在32位操作系統(tǒng)上就是32位(4個(gè)字節(jié))的整型,而在64位操作系統(tǒng)上則變成64位。不同類型的整型變量在相互賦值時(shí)必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換,例如:varaint=2varbint32b=int32(a) //正確//b=a //錯(cuò)誤fmt.Println("b=",b)整

型整型常量有十進(jìn)制、八進(jìn)制、十六進(jìn)制三種表示法,十進(jìn)制直接寫出數(shù)值,八進(jìn)制值以數(shù)字0開頭,十六進(jìn)制則以0x或0X開頭,例如:variint=123 //十進(jìn)制正整數(shù)fmt.Println("i=",i) //i=123

variint=-48 //十進(jìn)制負(fù)整數(shù)fmt.Println("i=",i) //i=-48

variint=017 //八進(jìn)制正整數(shù)fmt.Println("i=",i) //i=15

variint=-021 //八進(jìn)制負(fù)整數(shù)fmt.Println("i=",i) //i=-17

variint16=32768fmt.Println("i=",i) //錯(cuò)誤,超范圍

variint=0x12a6 //十六進(jìn)制數(shù)fmt.Println("i=",i) //i=4774(1*16^3+2*16^2+10*16+6)

vara,b=0xAB12,-0x1a0 //十六進(jìn)制數(shù)fmt.Print("a=",a,",b=",b) //a=43794,b=-41602浮點(diǎn)型浮點(diǎn)型浮點(diǎn)型用于表示包含小數(shù)點(diǎn)的數(shù)值,Go語言內(nèi)置兩種浮點(diǎn)型:float32和float64,分別表示32位和64位的浮點(diǎn)數(shù),它們都遵循IEEE754標(biāo)準(zhǔn),該標(biāo)準(zhǔn)采用二進(jìn)制數(shù)據(jù)的科學(xué)記數(shù)法來表示浮點(diǎn)數(shù),如下。float32:用1位表示數(shù)字的符號(hào),用8位表示指數(shù)(底數(shù)為2),用23位表示尾數(shù),最大范圍為3.40282346638528859811704183484516925440e+38。float64:用1位表示數(shù)字的符號(hào),用11位表示指數(shù)(底數(shù)為2),用52位表示尾數(shù),最大范圍為1.797693134862315708145274237317043567981e+308。浮點(diǎn)型浮點(diǎn)型數(shù)有兩種表示形式,如下。(1)十進(jìn)制小數(shù)形式直接寫出含小數(shù)點(diǎn)的數(shù),當(dāng)數(shù)的整數(shù)或小數(shù)部分為0時(shí)可省略小數(shù)點(diǎn)前或后的數(shù)字,但小數(shù)點(diǎn)兩邊的數(shù)字不能同時(shí)省略且小數(shù)點(diǎn)不能省略,例如:varffloat32=3.14fmt.Println("f=",f) //f=3.14

varffloat32=5.fmt.Println("f=",f) //f=5

varffloat32=.618fmt.Println("f=",f) //f=0.618

varffloat32=036.70fmt.Println("f=",f) //f=36.7

varffloat32=. //錯(cuò)誤,小數(shù)點(diǎn)兩邊的數(shù)字不能同時(shí)省略fmt.Println("f=",f)浮點(diǎn)型(2)科學(xué)記數(shù)法形式如1.26×10-21表示為1.26e-21或1.26E-21,e或E的前面必須有數(shù)字且后面必須是一個(gè)正/負(fù)整數(shù)(正號(hào)可省略),例如:consthfloat64=6.62607015E-34 //普朗克常數(shù)fmt.Println("h=",h) //h=6.62607015e-34

constcfloat32=2.99792458e8 //真空中的光速fmt.Println("c=",c) //c=2.9979245e+08

constcfloat64=2.99792458e8fmt.Println("c=",c) //c=2.99792458e+08

constcfloat64=.299792458E09fmt.Println("c=",c) //c=2.99792458e+08

varffloat32=4.e+0fmt.Println("f=",f) //f=4

varffloat32=6E3fmt.Println("f=",f) //f=6000浮點(diǎn)型使用浮點(diǎn)型還要特別注意兩點(diǎn):(1)浮點(diǎn)型變量會(huì)被Go編譯器默認(rèn)推斷為float64型。(2)目前的計(jì)算機(jī)事實(shí)上并不能精確表示和存儲(chǔ)浮點(diǎn)數(shù),因此不應(yīng)當(dāng)在程序中使用==或!=直接比較兩個(gè)浮點(diǎn)數(shù)。例如:f1:=2.71828varf2float32=f1 //錯(cuò)誤,f1為float64型varf2float32=float32(f1) //正確

constpi=math.Pi //圓周率πvarpfloat64=3.1415926 //祖沖之計(jì)算值fmt.Println(p==pi) //false,直接比較一定是不相等的fmt.Println(math.Abs(p-pi)<1e-6) //true,應(yīng)當(dāng)采用差的絕對(duì)值小于給定誤差來判斷03復(fù)數(shù)型復(fù)數(shù)型Go語言原生支持復(fù)數(shù),內(nèi)置了兩種復(fù)數(shù)型:complex64和complex128。復(fù)數(shù)在計(jì)算機(jī)內(nèi)部用兩個(gè)浮點(diǎn)型數(shù)表示,一個(gè)為實(shí)部另一個(gè)為虛部。相應(yīng)地,Go的復(fù)數(shù)型也由兩個(gè)浮點(diǎn)型構(gòu)成,complex64是由兩個(gè)float32浮點(diǎn)型構(gòu)成的,而complex128則是由兩個(gè)float64浮點(diǎn)型構(gòu)成的。在程序中,復(fù)數(shù)型數(shù)的寫法與數(shù)學(xué)表示法一樣,其實(shí)部和虛部數(shù)值的表示形式同浮點(diǎn)型,例如。此外,Go還有3個(gè)內(nèi)置函數(shù)專用于處理復(fù)數(shù),使用如下:varc=complex(2.718,0.618) //構(gòu)造一個(gè)復(fù)數(shù)a:=real(c) //返回實(shí)部b:=imag(c) //返回虛部fmt.Print("c=(",a,"+",b,"i)") //c=(2.718+0.618i)04布爾型1.布爾運(yùn)算2.布爾型的轉(zhuǎn)換布爾型1.布爾運(yùn)算布爾型無法參與數(shù)值運(yùn)算,故不可用算術(shù)運(yùn)算符(+、-、*、/、%等)對(duì)它進(jìn)行操作,但可以用邏輯運(yùn)算符(&&、||、!)將多個(gè)關(guān)系表達(dá)式、布爾型變量(或常量)組成一個(gè)邏輯表達(dá)式(布爾表達(dá)式)進(jìn)行運(yùn)算,稱為“布爾運(yùn)算”,規(guī)則為:(1)a&&b(“與”運(yùn)算):只有a與b都為true,結(jié)果才為true;有一個(gè)為false,結(jié)果就為false。(2)a||b(“或”運(yùn)算):只有a與b都為false,結(jié)果才為false;有一個(gè)為true,結(jié)果就為true。(3)!a(“非”運(yùn)算):?jiǎn)文窟\(yùn)算符!取與a值相反的布爾值,因此!true的值為false。布爾型布爾運(yùn)算的結(jié)果一定也是布爾型值,另外,關(guān)系運(yùn)算符(<、<=、>、>=、==、!=等)的比較操作也會(huì)產(chǎn)生布爾型的值。例如:fmt.Println(!true==false) //true

varb=88fmt.Println(b==86) //false

varx,y=14,8fmt.Println((x-y)<2*4) //truefmt.Println((x>y)&&((x-y)>7)) //false布爾型2.布爾型的轉(zhuǎn)換在Go語言中,布爾型無法與其他數(shù)據(jù)類型直接轉(zhuǎn)換,例如,不允許將布爾型強(qiáng)制轉(zhuǎn)換為整型來參與算術(shù)運(yùn)算:varb=truefmt.Println(int(b)+2)編譯錯(cuò)誤,輸出信息:cannotconvertb(variableoftypebool)totypeint而且,布爾值也不會(huì)隱式轉(zhuǎn)換為數(shù)值0或1,反之亦然,只能編寫程序代碼進(jìn)行轉(zhuǎn)換:varb=truefmt.Println(b+2) //錯(cuò)誤varbVal=0ifb{ bVal=1}fmt.Println(bVal+2) //正確,輸出3布爾型【實(shí)例2.6】布爾運(yùn)算判斷性別。程序代碼如下(bool.go):packagemainimport( "fmt" "strings" //Go語言內(nèi)置字符串處理包)funcmain(){ var( namestring="王燕" //姓名 profession="女博士" //身份 sexbool=true //性別(男:true;女:false) ) vargenderbool=strings.Contains(profession,"女")||!sex varsexString="男性" ifgender{ sex=false sexString="女性" } fmt.Println("sex=",sex) fmt.Print(name+"是一名",sexString)}運(yùn)行結(jié)果如圖。05字符串型1.字符串創(chuàng)建2.字符串訪問3.字符串修改字符串型1.字符串創(chuàng)建Go語言將字符串作為一種原生的基本數(shù)據(jù)類型,創(chuàng)建一個(gè)字符串非常容易,如:vars="Hello,Go語言!"這句代碼聲明了字符串s,并初始化其內(nèi)容為“Hello,Go語言!”。【實(shí)例2.7】字符串內(nèi)容的兩種引用方式。程序代碼如下(string01.go):packagemainimport"fmt"funcmain(){ s1:="我愛\"Go語言\"編程\n@easybooks" //支持轉(zhuǎn)義,但不能跨行 s2:=`我愛\"Go語言\"程序設(shè)計(jì)\n@easybooks` //可以跨行,但不支持轉(zhuǎn)義 fmt.Println(s1) fmt.Println(s2)}運(yùn)行結(jié)果如圖。字符串型實(shí)際應(yīng)用中,雙引號(hào)使用最廣泛,而反引號(hào)多用在書寫多行消息文本、HTML源碼及正則表達(dá)式的場(chǎng)合。Go語言的字符串是不可變的,但可以對(duì)其進(jìn)行級(jí)聯(lián)(+)和追加(+=)操作,例如:s:="我愛"+"Go語言編程!"fmt.Println(s) //我愛Go語言編程!s+="@easybooks"fmt.Println(s) //我愛Go語言編程!@easybooks字符串型2.字符串訪問(1)單字節(jié)字符串訪問如果一個(gè)字符串全部由單字節(jié)字符構(gòu)成,就是“單字節(jié)字符串”,如:s1:="IloveGoprogramming!"s2:="HelloWorld!"s3:="Hello,Golanguage.@easybooks"單字節(jié)字符串可以通過索引直接提取其任意位置的字節(jié),在方括號(hào)[]內(nèi)寫入索引,索引從0開始計(jì)數(shù),如對(duì)于字符串s,s[0]訪問其首字節(jié),s[i-1]訪問第i個(gè)字節(jié),s[len(s)-1]則訪問最后1個(gè)字節(jié),如果想要獲取字節(jié)所對(duì)應(yīng)的字符內(nèi)容,則通過string轉(zhuǎn)換,如第i個(gè)字節(jié)的字符為string(s[i-1])。字符串型【實(shí)例2.8】單字節(jié)字符串的訪問。程序代碼如下(string02.go):packagemainimport"fmt"funcmain(){ s:="Hello,Golanguage.@easybooks" fmt.Println("總字節(jié)數(shù):",len(s)) fmt.Println(s[0]) //索引位置為0(首字節(jié))的ASCII碼值 fmt.Println(string(s[0])) //索引位置為0(首字節(jié))對(duì)應(yīng)字符 fmt.Println(s[6:8]) //截取索引位置6~7(不包含最后8)的字符串 fmt.Println(s[18:]) //從索引位置18(對(duì)應(yīng)字符@)一直截取至末尾 fmt.Println(s[:5]) //截取索引位置0~4(不包含最后5)的字符串}運(yùn)行結(jié)果如圖。字符串型(2)多字節(jié)字符串訪問如果字符串的字符不全是單字節(jié)的(比如含有中文),就不能直接使用索引訪問,Go語言專門提供了一個(gè)rune類型用于這類字符串的操作。rune是Go內(nèi)部整型int32的別名,占4個(gè)字節(jié)(UTF-8編碼最大字節(jié)),能表示不同字長(zhǎng)的字符。使用時(shí),先將待訪問的字符串轉(zhuǎn)換為rune型,然后就可以按單字節(jié)索引的方式獲取指定位置的內(nèi)容。【實(shí)例2.9】多字節(jié)字符串的訪問。程序代碼如下(string03.go):packagemainimport( "fmt" "unicode/utf8")funcmain(){ s:="Hello,Go語言。@easybooks" fmt.Println("總字節(jié)數(shù):",len(s))//一個(gè)中文字符占3個(gè)字節(jié) fmt.Println("總字符數(shù):",utf8.RuneCountInString(s)) sc:=[]rune(s) //將字符串轉(zhuǎn)為rune型 fmt.Println(sc[0]) //索引位置為0(首字節(jié))的ASCII碼值 fmt.Println(string(sc[0])) //索引位置為0(首字節(jié))對(duì)應(yīng)字符 fmt.Println(string(sc[6:11])) //截取索引位置6~10,不包含最后11(對(duì)應(yīng)中文。) fmt.Println(string(sc[12:])) //從索引位置12(對(duì)應(yīng)字符@)一直截取至末尾 fmt.Println(string(sc[:5])) //截取索引位置0~4(不包含最后5)的字符串}運(yùn)行結(jié)果如圖。字符串型3.字符串修改在Go語言中,不能直接修改字符串的內(nèi)容,比如,下面這種試圖修改指定字符的方式是不被允許的:s:="Hello,Go語言。@easybooks"s[6]="g"編譯錯(cuò)誤,輸出信息:cannotassigntos[6](valueoftypebyte)要想修改字符串的內(nèi)容,必須先將字符串復(fù)制到一個(gè)可寫的變量中,然后再進(jìn)行修改。對(duì)于單字節(jié)和多字節(jié)字符串來說,接收它們的變量類型是不同的。(1)單字節(jié)字符串修改單字節(jié)字符串復(fù)制到一個(gè)byte類型(Go字節(jié)類,uint8的別名)變量中,如下:字符串:="......"變量:=[]byte(字符串)變量[索引]='值' //注意值要用單引號(hào)(不能用雙引號(hào))引起來(2)多字節(jié)字符串修改多字節(jié)字符串修改則是先通過復(fù)制到一個(gè)rune類型變量,如下:字符串:="......"變量:=[]rune(字符串)變量[索引]='值' //注意值要用單引號(hào)(不能用雙引號(hào))引起來字符串型【實(shí)例2.10】?jī)煞N字符串的修改。程序代碼如下(string04.go):packagemainimport"fmt"funcmain(){ //單字節(jié)字符串修改 ss:="Hello,Golanguage.@easybooks" fmt.Println("單字節(jié):",ss) bStr:=[]byte(ss) //轉(zhuǎn)為byte型,字符串被自動(dòng)復(fù)制到變量bStr bStr[6]='g' ss=string(bStr) fmt.Println("修改后:",ss)

//多字節(jié)字符串修改 sc:="Hello,Go語言。@easybooks" fmt.Println("多字節(jié):",sc) rStr:=[]rune(sc) //轉(zhuǎn)為rune型,字符串被自動(dòng)復(fù)制到變量rStr rStr[9]='程' rStr[10]='序' sc=string(rStr) fmt.Println("修改后:",sc)}運(yùn)行結(jié)果如圖。第2章Go語言基礎(chǔ)程序流程控制01條件語句條件語句條件語句又稱if語句,它使部分程序代碼塊只有在滿足特定條件時(shí)才會(huì)被執(zhí)行,語法格式為:if<布爾表達(dá)式1>{ <語句塊1>}[elseif<布爾表達(dá)式2>{ <語句塊2>}...}elseif<布爾表達(dá)式n>{ <語句塊n>}else{ <語句塊n+1>}]說明:(1)該語句首先計(jì)算<布爾表達(dá)式1>的值,若是true,則執(zhí)行<語句塊1>,當(dāng)<語句塊1>執(zhí)行完成,整個(gè)if語句也就結(jié)束了;當(dāng)<布爾表達(dá)式1>的值是false時(shí),再計(jì)算<布爾表達(dá)式2>,若是true,則執(zhí)行第一個(gè)elseif部分的<語句塊2>,當(dāng)<語句塊2>執(zhí)行完成,整個(gè)if語句執(zhí)行結(jié)束;……以此類推,若所有布爾表達(dá)式的值都是false時(shí),就執(zhí)行else部分的<語句塊n+1>,執(zhí)行完成后結(jié)束整個(gè)if語句。(2)整個(gè)語句只有if部分是必須的,后面所有的elseif和最后的else部分都是可選的,視程序邏輯需要可構(gòu)成單獨(dú)的一個(gè)if、if-elseif、if-else或者if-elseif-else等多種不同結(jié)構(gòu)的if語句變體。(3)與其他語言不同,Go語言if語句中用于判斷條件的布爾表達(dá)式不需要用括號(hào)括起來。條件語句(4)按照Go的語法,包裹每個(gè)語句塊的前半個(gè)大括號(hào)“{”必須放在行尾,而不能另起一行。如下面這幾種寫法都是錯(cuò)誤的:if<布爾表達(dá)式1>{ <語句塊1>}elseif<布爾表達(dá)式2>{ //錯(cuò)誤 <語句塊2>}else{ <語句塊3>}

if<布爾表達(dá)式1>{ //錯(cuò)誤 <語句塊1>}

if<布爾表達(dá)式1>{ <語句塊1>}else{ //錯(cuò)誤 <語句塊2>}(5)Go語言沒有其他語言都有的條件運(yùn)算符(形如“表達(dá)式1?表達(dá)式2:表達(dá)式3”),因?yàn)橛胕f語句就能夠?qū)崿F(xiàn)條件運(yùn)算符的功能。條件語句【實(shí)例2.11】用條件語句判斷用戶輸入年份是否為閏年。程序代碼如下(if.go):運(yùn)行演示如圖。02分支語句分支語句分支語句又稱switch語句,它會(huì)根據(jù)傳入的參數(shù)檢測(cè)并執(zhí)行符合條件的分支,當(dāng)程序有多個(gè)分支(兩個(gè)以上)時(shí),用它比用多個(gè)嵌套的if語句更加簡(jiǎn)明,其語法格式如下:switch[<表達(dá)式>]{case<表達(dá)式1>: [<語句1>] [fallthrough]case<表達(dá)式2>: [<語句2>] [fallthrough]...case<表達(dá)式n>:[<語句n>][default:<語句n+1>]}分支語句說明:(1)該語句首先計(jì)算<表達(dá)式>的值,然后判斷該值與<表達(dá)式1>的值是否相等,若相等,則執(zhí)行<語句1>;否則,繼續(xù)判斷<表達(dá)式>的值與<表達(dá)式2>的值是否相等,若相等,則執(zhí)行<語句2>;……以此類推,若沒有一個(gè)表達(dá)式的值與<表達(dá)式>的值相等,則執(zhí)行default后面的<語句n+1>。(2)與其他語言不同,Go的switch語句中的每一個(gè)case都是獨(dú)立的代碼塊,程序僅僅執(zhí)行滿足條件的那個(gè)case后面的語句,而不會(huì)像其他語言那樣一直執(zhí)行到底,故不需要通過break關(guān)鍵字跳出。(3)switch后面的<表達(dá)式>可省去,改由各個(gè)case后面的表達(dá)式直接判斷執(zhí)行條件,這種情況case后面的表達(dá)式就必須是布爾表達(dá)式,其效果等同于多重“if-elseif-else”結(jié)構(gòu)的條件語句。(4)語句中的各條件表達(dá)式不限于數(shù)值常量,可以是任意支持相等比較運(yùn)算的類型變量。(5)在一個(gè)case分支的語句中,可以通過fallthrough語句來強(qiáng)制執(zhí)行下一個(gè)case分支的語句而不管其表達(dá)式條件是否滿足。分支語句【實(shí)例2.12】用分支語句選擇輸出雷鋒叔叔的名言。程序代碼如下(switch.go):運(yùn)行演示如圖。03循環(huán)語句循環(huán)語句循環(huán)語句的作用是反復(fù)執(zhí)行一段代碼,直到不滿足循環(huán)條件為止。Go語言遵循“少即是多”的設(shè)計(jì)哲學(xué),只提供了for循環(huán)語句,語法格式如下:for初始化;循環(huán)條件;迭代部分{

循環(huán)體}說明:(1)初始化:該部分是一個(gè)表達(dá)式,可缺省不寫。用來設(shè)置循環(huán)的初始條件,比如設(shè)置循環(huán)控制變量的初始值。(2)循環(huán)條件:這是一個(gè)布爾表達(dá)式,表示循環(huán)繼續(xù)執(zhí)行的條件,每一次循環(huán)體執(zhí)行完后都要對(duì)該表達(dá)式求值,以決定是否繼續(xù)循環(huán)。若該部分缺省不寫,則表示條件永遠(yuǎn)為真(成為死循環(huán))。(3)迭代部分:它也是一個(gè)表達(dá)式,同樣可以缺省不寫,用來改變循環(huán)控制變量的值,從而改變循環(huán)條件表達(dá)式的布爾值。循環(huán)語句(4)循環(huán)體:這是循環(huán)操作的主體部分,為任意合法Go語句組成的代碼塊,可以是一條語句,也可以是多條。for語句的執(zhí)行流程是:第1步:首先計(jì)算“初始化”表達(dá)式,該表達(dá)式的值僅在此計(jì)算一次,以后不再計(jì)算。第2步:計(jì)算“循環(huán)條件”布爾表達(dá)式,若值為false,則結(jié)束整個(gè)for循環(huán)語句,程序繼續(xù)執(zhí)行緊跟在該for語句之后的語句;若值為true,則依次執(zhí)行循環(huán)體中的語句。第3步:循環(huán)體執(zhí)行一次后,計(jì)算“迭代部分”表達(dá)式,再轉(zhuǎn)第2步。例如:vari,total=1,0forprice:=10.58;i<=100;i++{ total+=i ifi==100{ fmt.Println("price=",price) //price=10.58 }}fmt.Println("i=",i) //i=101fmt.Println("total=",total) //total=5050循環(huán)語句Go語言沒有大多數(shù)語言的while和do-while循環(huán),但僅用for語句也能實(shí)現(xiàn)與這兩種循環(huán)完全一樣的功能,如下。(1)while循環(huán)等價(jià)實(shí)現(xiàn)將for語句的初始化省略,原迭代部分移至循環(huán)體末尾,即可實(shí)現(xiàn)與while循環(huán)等價(jià)的功能,代碼形式為:for循環(huán)條件{

循環(huán)體

迭代部分}例如:vari,total=1,0fori<=100{ total+=i i++}fmt.Println("total=",total) //total=5050循環(huán)語句(2)do-while循環(huán)等價(jià)實(shí)現(xiàn)將for語句的初始化、循環(huán)條件、迭代部分全部省略,迭代部分移至循環(huán)體末尾,其后用一個(gè)if語句判斷對(duì)循環(huán)條件取反的布爾表達(dá)式值,若為true跳出循環(huán),如此就能夠?qū)崿F(xiàn)與do-while循環(huán)等價(jià)的功能,代碼形式為:for{

循環(huán)體

迭代部分 if!循環(huán)條件{ break }}例如:vari,total=1,0for{ total+=i i++ if!(i<=100){ break }}fmt.Println("total=",total) //total=5050循環(huán)語句【實(shí)例2.13】用循環(huán)語句設(shè)計(jì)一個(gè)計(jì)算階乘的程序。說明:階乘(!)是基斯頓·卡曼(ChristianKramp,1760~1826)于1808年發(fā)明的運(yùn)算符號(hào),一個(gè)自然數(shù)n的階乘寫作n!,是所有小于及等于該數(shù)的正整數(shù)的乘積,亦即n!=1×2×3×...×(n-1)×n,并且規(guī)定0!=1。程序代碼如下(for01.go):packagemainimport"fmt"funcmain(){ varnint //接收輸入自然數(shù) fmt.Print("請(qǐng)輸入:") fmt.Scanln(&n) vars=1 ifn!=0{ fori:=1;i<=n;i++{ s=s*i } } fmt.Print(n,"!=",s)}運(yùn)行演示如圖。循環(huán)語句【實(shí)例2.14】用循環(huán)語句設(shè)計(jì)一個(gè)程序,輸出所有的水仙花數(shù)。說明:所謂水仙花數(shù),是指一個(gè)3位數(shù),其各位數(shù)字的立方和等于該數(shù)自身,例如,153=13+53+33。程序代碼如下(for02.go):packagemainimport"fmt"funcmain(){ vari=0 //百位數(shù) varj=0 //十位數(shù) vark=0 //個(gè)位數(shù) varn,p=0,0 fmt.Println("水仙花數(shù)有:") form:=100;m<1000;m++{ i=m/100 //得到百位數(shù) n=m%100 j=n/10 //得到十位數(shù) k=n%10 //得到個(gè)位數(shù) p=i*i*i+j*j*j+k*k*k ifp==m{ fmt.Println(m) //打印水仙花數(shù) } }}運(yùn)行結(jié)果如圖。04跳轉(zhuǎn)語句1.goto語句2.break語句3.continue語句4.return語句跳轉(zhuǎn)語句跳轉(zhuǎn)語句用于改變程序流程的方向,簡(jiǎn)單直接。Go語言的跳轉(zhuǎn)語句常與標(biāo)簽一起配合使用,標(biāo)簽標(biāo)識(shí)一個(gè)語句,通常寫在需要程序跳轉(zhuǎn)到的目標(biāo)位置,如下:標(biāo)簽名:

語句iGo的跳轉(zhuǎn)語句包括goto、break、continue和return,下面分別舉例說明它們的應(yīng)用。1.goto語句goto語句可無條件地跳轉(zhuǎn)到指定標(biāo)簽,格式為:...goto標(biāo)簽L...標(biāo)簽L:

語句i跳轉(zhuǎn)語句

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論