知識點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/Apackage和Bpath/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