Go語言常知常會-基礎(chǔ)篇

知識點var,for循環(huán)、while循環(huán)、死循環(huán)、空標(biāo)示符、if語句、多行注釋、包管理等

1、var變量聲明

var是用來聲明變量的關(guān)鍵字,一般格式是

var ?關(guān)鍵字 ?變量類型

比如

// 聲明一個string類型的變量,名稱為name。常用的變量聲明方式之一

var ?name string?

完整格式

var ?關(guān)鍵字 ?變量類型 = 賦值表達式

比如

var name string = "Jack"

變量在聲明的時候可以初始化,如果沒有顯式的初始化,則會根據(jù)變量類型隱式地初始化為0或空字符等等。這是Go語言中的zero-value 機制,保證每個變量都有一個合適的類型。

其它的聲明和初始化的方式有

//使用:=,也叫短變量聲明,常用的變量聲明方式之一。

name := ""

//顯式初始化,隱式的類型

var name = ""

//顯式初始化,顯式的類型

var s string = ""


2、支持循環(huán)的語句for

結(jié)構(gòu)如下

for 初始化語句; 條件語句;執(zhí)行后的語句{

? ? ? ?//一些操作語句

初始化語句在for循環(huán)開始之前執(zhí)行。

Go里面的while循環(huán)通過將for循環(huán)中的初始化語句和執(zhí)行后的語句刪除來表達,結(jié)構(gòu)如下

for ?條件語句 {

Go里面的死循環(huán)直接將for循環(huán)的初始化語句、條件語句、執(zhí)行后語句刪除表達,結(jié)構(gòu)如下

for {

Go里面也使用continue的關(guān)鍵字允許跳過一些執(zhí)行語句,直接進入下一次循環(huán)。

3、空標(biāo)示符

也就是下劃線標(biāo)示"_"。它的出現(xiàn)是由于Go語言不允許出現(xiàn)未使用的局部變量。它在語法上需要一個臨時變量,但是代碼邏輯不需要的時候使用。比如,和range配合起來,range返回的是鍵值對。空標(biāo)示符可以作為索引值(key)使用,也可以代替值使用。如果真的需要使用這個變量,還是最好起個名字:)

//代替鍵使用

for ?_, name := range os.Args[1:] {

}

空標(biāo)示符是沒有辦法使用的。

4、 條件語句if

跟其它語言語法無區(qū)別,格式如下

if 條件語句 {

}else {

5、多行注釋

跟C和C++一樣,GO使用/* ... */作為多行注釋。

6、格式化輸出

使用fmt里的Printf函數(shù),可以達到和C語言中printf同樣的效果

fmt.Printf("%d, %s\n", id, ?name)

7、指針

Go語言也提供指針,通過&來獲取指針地址,*來獲得指針?biāo)赶虻刂返闹怠?盏闹羔樖莕il。

8、常用包

Go語言有著100余個標(biāo)準(zhǔn)包,提供大量的基礎(chǔ)函數(shù)。提供包管理工具是基于模塊化管理的思想,讓相似的功能聚合到一起,達到高類聚的設(shè)計理念,這為大型工程的設(shè)計和維護提供了基礎(chǔ)。包只需要對外暴露接口和幫助文檔,而實現(xiàn)的細節(jié)則封裝到每個包的具體實現(xiàn)內(nèi)。通過包的封裝,程序的變動將只會影響局部,而不是全局。

試了一下大概有143個包。

Go 語言的導(dǎo)入使用import。如果打算對外提供包,則最好在包前加上域名。

import path

在每個文件的開通使用package來聲明該包的名稱。只有路徑+包才能定義具體使用的包,即Apath/ApackageBpath/Apackage雖然名稱相同,但是不同的包。面對這樣的情況引入包的程序,可以選擇使用一個別名來替代其中一個重名的包(別名只在導(dǎo)入的文件中有作用),如下:

import (

? ? ? ?"Apath/Apackage"

? ? ? ?xpackage "Bpath/Apackage" ? ?//使用別名,避免沖突

)

例舉一些常用的包和其中的函數(shù)功能。

net 和網(wǎng)絡(luò)相關(guān)http.Get, http.HandleFunc,http.ListenAndServe

io 和輸入輸出相關(guān) ioutil.ReadAll,io.Copy, ioutil.Discard

math 提供數(shù)學(xué)計算

image 和圖像處理相關(guān)

os 和系統(tǒng)相關(guān)Stdout Stderr等

fmt 和格式化輸出相關(guān)Printf,Println等fmt.Sprintf

time 和時間相關(guān)time.Now

log 和日志相關(guān),log.Fatal

syn 和同步相關(guān)sync.Mutex(互斥鎖)

flag 提供命令行傳遞參數(shù)的功能,如flag.Parse(),flag.Args()

使用go doc工具提供查看每個包或者函數(shù)的支持文檔,也可以通過https://golong.org/pkg獲取相關(guān)信息。

9、管道

Go語言中Gorutine之間通信的方式為Channel。

//管道的創(chuàng)建

ch := make(chan 類型)

//從管道中獲取

fmt.Println(<-ch)

//輸出到管道

ch <- fmt.Sprintf("")

10、變量名稱

Go語言中包名一般為小寫,外部可見的函數(shù)、變量一般大寫。使用駝峰命名法。

11、文件結(jié)構(gòu)

每個文件需要寫上屬于哪個package,文件屬于哪個package。文件結(jié)構(gòu)如下組織

package XXXX

import XXXX

包級別的類型、變量、常量、函數(shù)聲明

函數(shù)定義

12、函數(shù)結(jié)構(gòu)

Go當(dāng)中的函數(shù)結(jié)構(gòu)如下定義

func 函數(shù)名稱 (參數(shù)名稱 參數(shù)類型)返回值類型 {

13、作用域

Go語言的變量是有作用域的,分為4種:

universal 全局的比如內(nèi)置函數(shù)、類型等,float64、new

package level 任何函數(shù)外的變量

file level 導(dǎo)入的變量、函數(shù)等

local 本地變量

可以在不同的范圍內(nèi)聲明相同名稱的變量,但是存在一種shadow的機制,shadow是指聲明的變量有著相同的名字,但是作用域不同,則更靠近執(zhí)行語句內(nèi)部的聲明會讓更外部的失去效果(inaccessible)。比如new在Go中用來創(chuàng)建一個變量。但是,一不小心重定義該名稱,則new就失去了本來的作用,變成一個普通的變量。如下代碼段所示

func delta(old, new int) int { return new - old}

14、垃圾回收機制

Go語言提供垃圾回收機制,使用者不需要顯式地分配和釋放內(nèi)存,但使用者仍然需要考慮如何利用好內(nèi)存。比如,避免長生命周期的對象中出現(xiàn)指針指向一個短生命周期的對象,長生命周期對象不回收的情況,會讓垃圾回收機制也無法回收分配的短生命周期的對象,造成內(nèi)存浪費。

15、聲明新的類型

使用基本的類型來聲明新的類型

type 新的類型名稱 低層類型

比如,Age類型都是int型的

type ?Age int

不同的類型都有轉(zhuǎn)換操作T(x),即將x轉(zhuǎn)換成T類型。低層類型相同的兩個新類型不能直接比較。

16、元組賦值

Go語言中賦值的一種方式,讓賦值“=”的右邊和左邊一一對應(yīng)。在等式兩邊同時需要出現(xiàn)相同變量的場景(比如交換值),該機制非常非常好用。該機制基于更新左邊變量前,右邊的值都已經(jīng)確定下來(evaluted),因此,不用擔(dān)心在賦值的時候有負面效果。

x, y = y, x

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。