Go語(yǔ)言入門之基礎(chǔ)語(yǔ)法和常用特性解析
Go語(yǔ)言的特點(diǎn)
簡(jiǎn)單易學(xué): Go語(yǔ)言的語(yǔ)法簡(jiǎn)潔清晰,與C語(yǔ)言風(fēng)格相似,易于學(xué)習(xí)和掌握。
高性能、并發(fā)編程: Go語(yǔ)言原生支持并發(fā)編程,采用了輕量級(jí)的Goroutine并發(fā)模型和Channel通信機(jī)制,使得編寫(xiě)并發(fā)程序變得更加簡(jiǎn)單和高效。Go語(yǔ)言具備良好的性能,它的編譯器將Go代碼編譯為機(jī)器碼,且在運(yùn)行時(shí)使用垃圾回收機(jī)制來(lái)管理內(nèi)存,有效地提高了程序的執(zhí)行效率。
完善的工具鏈: Go語(yǔ)言內(nèi)置了豐富的工具集,包括格式化工具、測(cè)試工具、性能分析工具等,開(kāi)發(fā)者可以方便地進(jìn)行代碼格式化、單元測(cè)試和性能借助于這些標(biāo)準(zhǔn)庫(kù),開(kāi)發(fā)者可以更快地構(gòu)建出高效、可靠和安全的應(yīng)用程序。此外,Go語(yǔ)言社區(qū)也提供了豐富的第三方包,可供開(kāi)發(fā)者使用和擴(kuò)展。優(yōu)化等操作。
豐富的標(biāo)準(zhǔn)庫(kù): Go語(yǔ)言的標(biāo)準(zhǔn)庫(kù)是它的一個(gè)重要特點(diǎn),它提供了許多功能豐富和易于使用的包,涵蓋了各個(gè)領(lǐng)域。借助于這些標(biāo)準(zhǔn)庫(kù),開(kāi)發(fā)者可以更快地構(gòu)建出高效、可靠和安全的應(yīng)用程序。此外,Go語(yǔ)言社區(qū)也提供了豐富的第三方包,可供開(kāi)發(fā)者使用和擴(kuò)展。
跨平臺(tái)支持:Go語(yǔ)言支持多種主流操作系統(tǒng)和硬件架構(gòu),可以編譯生成可執(zhí)行文件,無(wú)需依賴其他庫(kù)或運(yùn)行環(huán)境,便于在不同平臺(tái)上部署和運(yùn)行。
垃圾回收:Go語(yǔ)言通過(guò)垃圾回收機(jī)制自動(dòng)管理內(nèi)存,避免了常見(jiàn)的內(nèi)存錯(cuò)誤,如內(nèi)存泄漏和野指針,提高了程序的安全性和穩(wěn)定性。
靜態(tài)鏈接:Go語(yǔ)言是一種靜態(tài)類型語(yǔ)言,編譯器會(huì)在編譯階段進(jìn)行類型檢查,可以提早發(fā)現(xiàn)潛在的類型錯(cuò)誤,減少運(yùn)行時(shí)的錯(cuò)誤。
快速編譯:Go語(yǔ)言具有快速的編譯速度,這是由于Go編譯器的設(shè)計(jì)和優(yōu)化帶來(lái)的。
Go語(yǔ)言的基礎(chǔ)語(yǔ)法
HelloWorld
package main //表示一個(gè)可獨(dú)立執(zhí)行的程序,每個(gè)Go應(yīng)用程序都包含一個(gè)名為main的包,一定包含一個(gè)main包 import ( "fmt" ) func main() { fmt.Println("hello world") }
package main
表示一個(gè)可獨(dú)立執(zhí)行的程序,每個(gè)Go應(yīng)用程序都包含一個(gè)名為main
的包,一定包含一個(gè)main
包
import
關(guān)鍵字用于導(dǎo)入其他包(packages
)的代碼。導(dǎo)入語(yǔ)句通常放置在Go源文件的開(kāi)頭。需要導(dǎo)入多個(gè)包,將它們放在圓括號(hào)中并用換行符分隔。
fmt
是Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的一個(gè)包,提供了格式化輸入輸出的功能。它包含了一系列的函數(shù),可以用來(lái)打印文本、格式化字符串、讀取輸入等。
常用的fmt
函數(shù)和方法如下:
fmt.Print
:打印輸出內(nèi)容,不會(huì)在文本末尾添加換行符。fmt.Println
:打印輸出內(nèi)容,并在文本末尾添加換行符。fmt.Printf
:格式化打印輸出內(nèi)容,可以使用占位符來(lái)指定輸出格式。fmt.Sprint
:將給定的參數(shù)格式化為字符串并返回該字符串,不會(huì)進(jìn)行打印輸出。fmt.Sprintf
:將給定的參數(shù)格式化為字符串并返回該字符串,可以使用占位符來(lái)指定輸出格式。fmt.Scan
:從標(biāo)準(zhǔn)輸入中讀取一個(gè)值并使用指定的格式將其存儲(chǔ)到傳入的變量中。fmt.Scanln
:從標(biāo)準(zhǔn)輸入中讀取一行文本,并嘗試將其解析為參數(shù)列表中變量的值。
變量
var + 變量名 + 變量類型 (在Go語(yǔ)言中變量類型在變量名后面)
使用步驟 :
1. 變量的聲明
2. 變量的賦值
3. 變量的使用
package main import ( "fmt" ) func main() { // 變量的聲明 var A int // 變量的賦值 A = 18 // 變量的使用 fmt.Println("A = ", A) } // var 可以自己判斷變量類型 var B = 18 // 省略var 用:= C := "Hello World"
每個(gè)類型有默認(rèn)值,如果不對(duì)變量進(jìn)行賦值,變量的值為默認(rèn)值
數(shù)據(jù)類型
在Go語(yǔ)言中,有幾種基本的數(shù)據(jù)類型可以用來(lái)存儲(chǔ)不同種類的數(shù)據(jù)。下面是常見(jiàn)的基本數(shù)據(jù)類型:
- 整數(shù)類型(int):用于表示整數(shù)值,包括有符號(hào)和無(wú)符號(hào)的整數(shù)類型。例如:
int
、int8
、int16
、int32
、int64
、uint
、uint8
、uint16
、uint32
、uint64
等。 - 浮點(diǎn)數(shù)類型(float):用于表示小數(shù)值,有兩種精度的浮點(diǎn)數(shù)類型:
float32
和float64
。 - 布爾類型(bool):用于表示邏輯值,只有兩個(gè)取值:
true
和false
。 - 字符串類型(string):用于表示文本,使用雙引號(hào)或反引號(hào)將文本括起來(lái)。例如:“Hello, Go!”。
- 字符類型:用于表示單個(gè)字符,使用單引號(hào)將字符括起來(lái)。例如:‘A’。
- 指針類型:用于存儲(chǔ)變量的內(nèi)存地址,指向變量所在的內(nèi)存空間。
- 數(shù)組類型:用于存儲(chǔ)固定長(zhǎng)度的相同類型元素的集合。
- 切片類型:用于存儲(chǔ)可變長(zhǎng)度的相同類型元素的序列。
- 映射類型:用于存儲(chǔ)鍵值對(duì)集合,類似于字典。
- 結(jié)構(gòu)體類型:用于定義自定義的復(fù)合數(shù)據(jù)類型,可以包含不同類型的字段。
指針類型
//聲明 var 指針變量名 *數(shù)據(jù)類型 //賦值 指針變量名 = & 變量名 //通過(guò)指針改變變量值 *指針變量名 = 新值
指針變量名
是你給指針變量起的名字
數(shù)據(jù)類型
是指針?biāo)赶蜃兞康臄?shù)據(jù)類型。指針變量名前面的*
表示該變量是一個(gè)指針變量。
指針在Go語(yǔ)言中常用于以下情況:
- 傳遞大的數(shù)據(jù)結(jié)構(gòu),避免復(fù)制整個(gè)數(shù)據(jù)結(jié)構(gòu)造成性能損失;
- 通過(guò)指針修改實(shí)際參數(shù)的值;
- 動(dòng)態(tài)分配內(nèi)存。
需要注意的是,在使用指針之前,需要先確保指針不為 nil
(空指針),否則會(huì)引發(fā)運(yùn)行時(shí)錯(cuò)誤。
分支結(jié)構(gòu) (if語(yǔ)句 、switch語(yǔ)句)
- 單分支
if
if 條件表達(dá)式 { 邏輯代碼 }
- 雙分支
if-else
if 條件表達(dá)式 { 邏輯代碼 } else{ 邏輯代碼 }
- 多分支
_if
if 條件表達(dá)式 { 邏輯代碼 } else if 條件表達(dá)式 { 邏輯代碼 } ...... else{ 邏輯代碼 }
switch
語(yǔ)句
switch 表達(dá)式 { case 值1,值2, ...: 語(yǔ)句塊1 case 值1,值2, ...: 語(yǔ)句塊2 .... default: }
循環(huán)結(jié)構(gòu) for循環(huán)
- 基本的for循環(huán):在循環(huán)開(kāi)始之前初始化一個(gè)計(jì)數(shù)器,然后在每次循環(huán)迭代之后更新計(jì)數(shù)器,直到計(jì)數(shù)器達(dá)到預(yù)定的值。
for 初始化; 條件; 更新 { // 循環(huán)執(zhí)行的代碼塊 }
例如,下面的代碼會(huì)打印從0到4的整數(shù):
for i := 0; i < 5; i++ { fmt.Println(i) }
- 省略初始化和更新:如果不需要初始化和更新步驟,可以省略它們。
for 條件 { // 循環(huán)執(zhí)行的代碼塊 }
例如,下面的代碼會(huì)不斷地打印當(dāng)前的秒數(shù),直到到達(dá)10秒:
for time.Now().Second() < 10 { fmt.Println(time.Now().Second()) }
- 無(wú)限循環(huán):如果條件部分被省略,則會(huì)無(wú)限循環(huán)執(zhí)行代碼塊,除非使用
break
或return
語(yǔ)句終止循環(huán)。
for { // 循環(huán)執(zhí)行的代碼塊 }
for range
在Go語(yǔ)言中,for range
是一種特殊的 for
循環(huán)形式,用于遍歷數(shù)組、切片、字符串、映射和通道等數(shù)據(jù)結(jié)構(gòu)。
for range
的語(yǔ)法如下:
for 索引, 值 := range 表達(dá)式 { // 循環(huán)執(zhí)行的代碼塊 }
其中,
索引
是當(dāng)前元素的索引或鍵,值
是當(dāng)前元素的值,表達(dá)式
是要迭代的數(shù)據(jù)結(jié)構(gòu)。
使用 for range
循環(huán)可以方便地獲取每個(gè)元素的索引和值,適用于遍歷整個(gè)數(shù)據(jù)結(jié)構(gòu)。在每次迭代中,索引
和 值
會(huì)被重新賦值為下一個(gè)元素的索引和值,直到遍歷完整個(gè)數(shù)據(jù)結(jié)構(gòu)。
以下是一些示例:
遍歷數(shù)組或切片:
numbers := []int{1, 2, 3, 4, 5} for index, value := range numbers { fmt.Println(index, value) }
這個(gè)示例會(huì)輸出數(shù)組/切片中每個(gè)元素的索引和值。
遍歷字符串:
text := "Hello, Go!" for index, value := range text { fmt.Println(index, value) }
這個(gè)示例會(huì)輸出字符串中每個(gè)字符的索引和對(duì)應(yīng)的Unicode碼點(diǎn)值。
遍歷映射:
person := map[string]interface{}{ "name": "Alice", "age": 25, "gender": "female", } for key, value := range person { fmt.Println(key, value) }
這個(gè)示例會(huì)輸出映射中每個(gè)鍵值對(duì)的鍵和值。
遍歷通道:
data := make(chan int) go func() { data <- 1 data <- 2 close(data) }() for value := range data { fmt.Println(value) }
這個(gè)示例會(huì)從通道中依次接收值,并打印出來(lái)。
需要注意的是,對(duì)于字符串和映射,索引
實(shí)際上是每個(gè)元素的鍵或鍵的字節(jié)索引。
for range
循環(huán)使用得非常廣泛,特別是在需要迭代遍歷數(shù)據(jù)結(jié)構(gòu)的情況下。
函數(shù)
提高代碼的復(fù)用性和維護(hù)性,減少代碼冗余
//函數(shù)的聲明 func 函數(shù)名 (形參列表)(返回值類型列表){ 執(zhí)行語(yǔ)句 return + 返回值列表 } //函數(shù)的調(diào)用 函數(shù)名 + (形參1,形參2,...)
注意
函數(shù)名 首字母大寫(xiě),可以在本包文件和其它包文件訪問(wèn)(類似public)
函數(shù)名 首字母小寫(xiě),只能被本包文件訪問(wèn)(類似private)
Go語(yǔ)言函數(shù)可以有多個(gè)返回值
Go語(yǔ)言函數(shù)是一種數(shù)據(jù)類型賦值給變量,也可以當(dāng)成其它函數(shù)是形參和返回
Go語(yǔ)言中函數(shù)不支持重載,但支持可變參數(shù)
package main // 定義一個(gè)函數(shù),函數(shù)參數(shù)為: 可變參數(shù)名 + ... + 參數(shù)類型 func test (num...int){ //函數(shù)內(nèi)部將可變參數(shù)當(dāng)作切片處理 } func main(){ test() test(1) test(2,28,30) test(2,...,100) }
以上就是Go語(yǔ)言入門之基礎(chǔ)語(yǔ)法和常用特性解析的詳細(xì)內(nèi)容,更多關(guān)于Go語(yǔ)法和特性的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang使用lua腳本實(shí)現(xiàn)redis原子操作
這篇文章主要介紹了Golang使用lua腳本實(shí)現(xiàn)redis原子操作,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03一文帶你了解Golang中reflect反射的常見(jiàn)錯(cuò)誤
go?反射的錯(cuò)誤大多數(shù)都來(lái)自于調(diào)用了一個(gè)不適合當(dāng)前類型的方法,?而且,這些錯(cuò)誤通常是在運(yùn)行時(shí)才會(huì)暴露出來(lái),而不是在編譯時(shí),如果我們傳遞的類型在反射代碼中沒(méi)有被覆蓋到那么很容易就會(huì)?panic。本文就介紹一下使用?go?反射時(shí)很大概率會(huì)出現(xiàn)的錯(cuò)誤,需要的可以參考一下2023-01-01go語(yǔ)言通過(guò)zlib壓縮數(shù)據(jù)的方法
這篇文章主要介紹了go語(yǔ)言通過(guò)zlib壓縮數(shù)據(jù)的方法,實(shí)例分析了Go語(yǔ)言中zlib的使用技巧,需要的朋友可以參考下2015-03-03VScode下配置Go語(yǔ)言開(kāi)發(fā)環(huán)境(2023最新)
在VSCode中配置Golang開(kāi)發(fā)環(huán)境是非常簡(jiǎn)單的,本文主要記錄了Go的安裝,以及給vscode配置Go的環(huán)境,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10