為企業(yè)做網(wǎng)站還有前途嗎app拉新
概述
????????在上一節(jié)的內(nèi)容中,我們介紹了第一個Go程序,包括:安裝Go環(huán)境、編寫第一個Go程序、編譯并運(yùn)行程序等。在本節(jié)中,我們將介紹Go的基礎(chǔ)語法。Go是一門簡潔和優(yōu)雅的語言,有自己特殊的一些語法規(guī)則。因此,在介紹Go編程的有關(guān)知識之前,先熟悉下Go的基礎(chǔ)語法,是非常有必要的。
????????截止到2023年10月,Go的最新版本為1.21,本專欄將使用Go 1.21的語法介紹相關(guān)知識。
標(biāo)識符
????????在Go語言中,標(biāo)識符是用于命名變量、函數(shù)、結(jié)構(gòu)體、接口等程序元素的名稱。以下是Go語言對標(biāo)識符的一些要求。
????????1、標(biāo)識符必須以字母(a-z或A-Z)或下劃線(_)開頭。
????????2、標(biāo)識符的后面可以跟字母、數(shù)字(0-9)或下劃線。
????????3、標(biāo)識符是區(qū)分大小寫的,這意味著變量x和變量X被視為兩個不同的標(biāo)識符。
????????4、不能使用Go語言的關(guān)鍵字作為標(biāo)識符,比如:break、case、const、continue等。
????????5、標(biāo)識符的命名應(yīng)具有描述性,能夠清晰地表達(dá)其用途和含義;良好的命名可以提高代碼的可讀性和可維護(hù)性。
????????6、盡量避免使用單個字符作為標(biāo)識符,特別是變量名;單個字符的變量名可能會導(dǎo)致代碼的可讀性降低。
????????7、在不同的作用域內(nèi),盡量避免使用相同名稱的標(biāo)識符,以確保代碼的一致性和準(zhǔn)確性。
????????以下是一些無效的標(biāo)識符:1name(以數(shù)字開頭)、case(Go語言的關(guān)鍵字)、i+j(+是不允許的字符)。
關(guān)鍵字
????????Go語言的關(guān)鍵字(Keywords)是預(yù)定義的特殊標(biāo)識符,用于表示程序中的特定概念或語法結(jié)構(gòu)。一共有25個關(guān)鍵字,分別為:break、default、func、interface、select、case、defer、go、map、struct、chan、else、goto、package、switch、const、fallthrough、if、range、type、continue、for、import、return、var。
行分隔符
????????在Go語言中,行分隔符通常通過換行符來表示,而不是分號。Go語言與其他一些編程語言(比如:C/C++、Java等)不同,它不需要在每行代碼末尾使用分號來表示語句的結(jié)束。每個語句的結(jié)束是通過自然換行符來識別的,也就是說,當(dāng)你在代碼中輸入一個換行符時,Go編譯器會認(rèn)為該語句已經(jīng)結(jié)束。
????????在下面的示例代碼中,fmt.Println語句沒有使用分號來分隔,而是通過自然換行符來分隔不同的語句。
package mainimport "fmt"func main() {fmt.Println("Hello")fmt.Println("CSDN")
}
????????當(dāng)然,如果需要將多個語句寫在同一行,則必須使用分號來人為區(qū)分。但在實際開發(fā)中,我們并不鼓勵這種做法。
package mainimport "fmt"func main() {fmt.Println("Hello");fmt.Println("CSDN")
}
var關(guān)鍵字
????????在Go語言中,var是一個關(guān)鍵字,用于聲明一個或多個變量。使用var關(guān)鍵字可以聲明不同類型的變量,并可以指定變量的初始值。
????????以下是使用var聲明變量的基本語法:
??????????????????var 變量名 類型
????????在下面的示例代碼中,我們聲明了一個整數(shù)類型的變量。
package mainimport "fmt"func main() {var a int
}
????????可以在聲明的同時初始化變量,如果給變量指定了初始值,可以省去類型,由編譯器根據(jù)初始值自動推斷變量的類型。當(dāng)然,也可以一次聲明多個變量,用逗號分隔它們即可。
package mainimport "fmt"func main() {var a int = 66var b = 88var c, d stringc = "Hello"d = "CSDN"// 輸出:66 88 Hello CSDNfmt.Println(a, b, c, d)
}
????????注意:如果聲明的變量和import的包未被使用, 將會導(dǎo)致編譯錯誤,這有助于提高代碼的清潔度和可讀性。
:=運(yùn)算符
????????在Go語言中,:=是一個特殊的運(yùn)算符,用于聲明變量并初始化它們的值,它被稱為短變量聲明運(yùn)算符。使用 :=運(yùn)算符可以同時完成變量的聲明和初始化,它將根據(jù)右側(cè)的表達(dá)式推斷變量的類型,并將該類型的值賦給變量。
????????在下面的示例代碼中,變量a被聲明為整數(shù)類型,并將其初始化為66。
package mainimport "fmt"func main() {a := 66fmt.Println(a);
}
????????需要注意的是,:=運(yùn)算符只能用于函數(shù)內(nèi)部的局部變量,不能用于全局變量。在函數(shù)外部,應(yīng)該使用普通的變量聲明語法,即使用var關(guān)鍵字進(jìn)行聲明。另外,出現(xiàn)在:=運(yùn)算符左側(cè)的變量不應(yīng)該是已經(jīng)被聲明過的,否則會導(dǎo)致編譯錯誤。
空格
????????在Go語言中,空格通常用于分隔標(biāo)識符、關(guān)鍵字、運(yùn)算符等,用于提高代碼的可讀性。
????????Go語言使用空格進(jìn)行代碼塊的縮進(jìn),通常使用4個空格作為一個縮進(jìn)級別。這是Go語言中代碼格式化的重要組成部分,以區(qū)分不同的代碼塊。
package mainimport "fmt"func main() {a := 6if a > 0 {fmt.Println("positive")} else {fmt.Println("zero or negative")}
}
????????在變量與運(yùn)算符間、運(yùn)算符兩側(cè)、函數(shù)參數(shù)間等場景下使用空格,可以大大增加代碼的可讀性。
package mainimport "fmt"func add(a, b int) int {return a + b
}func main() {a := 66b := 99c := add(a, b)fmt.Println(c)
}
????????注意:使用空格可以提高代碼的可讀性和清晰度,但過度使用空格可能會使代碼看起來過于分散。因此,在使用空格時應(yīng)該保持適度,遵循良好的編碼風(fēng)格和規(guī)范。
注釋
????????在Go語言中,注釋是一種向代碼中添加說明和解釋的方式,不會影響程序的執(zhí)行。Go語言支持兩種類型的注釋:單行注釋和多行注釋。
????????單行注釋以雙斜線(//)開頭,可以在其后添加注釋內(nèi)容。單行注釋可以獨(dú)立占用一行,也可以出現(xiàn)在代碼行的末尾。
// 這是注釋1
a := 66
b := 99 // 這是注釋2
????????多行注釋以/*開頭,以*/結(jié)尾,可以包含多行文本,通常用于說明函數(shù)、結(jié)構(gòu)體等代碼塊的用途和行為。
/*第一行多行注釋第二行多行注釋
*/
a := 66
package
????????在Go語言中,package用于組織代碼、提供命名空間。一個package可以包含多個Go源文件,并且可以是自定義的或標(biāo)準(zhǔn)庫中的。通過使用package關(guān)鍵字,可以將相關(guān)的代碼文件組合在一起,形成一個獨(dú)立的模塊。每個Go源文件都必須屬于一個package,并且每個package都可以包含一個或多個Go源文件。
????????在下面的示例代碼中,我們聲明了test.go文件屬于main package。在main package中,我們導(dǎo)入了fmt package,并使用fmt.Println函數(shù)打印了一條消息。
// test.go
package mainimport "fmt"func main() {fmt.Println("Hello, CSDN")
}
????????通過將相關(guān)的代碼文件組織在同一個package中,可以確保它們之間的命名沖突最小化,并且可以輕松地在其他地方引用和使用這些文件。
import
????????在Go語言中,import關(guān)鍵字用于引入外部依賴包,以便在程序中使用它們提供的函數(shù)、類型和變量等。要使用import導(dǎo)入包,需要指定包的完整名稱,并使用符號.來指定導(dǎo)入的包所在的目錄。比如:要導(dǎo)入標(biāo)準(zhǔn)庫中的fmt包,可以使用以下語句:import "fmt"。這將在程序中引入fmt包,并使其中的函數(shù)和類型可用。
????????還可以使用別名來為導(dǎo)入的包指定一個自定義名稱,指定別名后,可以使用別名來調(diào)用包中的函數(shù)。比如:要將fmt包導(dǎo)入為my_fmt,可以參考下面的示例代碼。
package mainimport my_fmt "fmt"func main() {my_fmt.Println("Hello, CSDN")
}
輸入輸出
????????在Go語言中,輸入輸出是通過標(biāo)準(zhǔn)庫中的fmt包來處理的,fmt包提供了許多用于格式化輸入和輸出的函數(shù)。要實現(xiàn)輸入輸出,可以使用fmt.Scan或fmt.Scanln函數(shù)從標(biāo)準(zhǔn)輸入(通常是鍵盤)讀取輸入,并使用fmt.Print或fmt.Println函數(shù)將輸出寫入到標(biāo)準(zhǔn)輸出(通常是屏幕)。
????????在下面的示例代碼中,我們首先聲明了兩個變量name和age,分別用于保存用戶輸入的名字和年齡。然后,使用fmt.Print函數(shù)提示用戶輸入名字和年齡,并使用fmt.Scanln函數(shù)讀取用戶的輸入。最后,使用fmt.Printf函數(shù)將用戶的輸入信息格式化并輸出到標(biāo)準(zhǔn)輸出。
package mainimport "fmt"func main() {var name stringfmt.Print("請輸入您的名字:")// 從標(biāo)準(zhǔn)輸入讀取名字fmt.Scanln(&name)var age intfmt.Print("請輸入您的年齡:")// 從標(biāo)準(zhǔn)輸入讀取年齡fmt.Scanln(&age)// 輸出信息到標(biāo)準(zhǔn)輸出fmt.Printf("歡迎%s, 您今年%d歲。\n", name, age)
}
????????注意:在上面的示例代碼中,我們使用了&符號將變量的地址傳遞給了Scanln函數(shù)。這是因為,Scanln函數(shù)需要訪問變量的內(nèi)存地址來更新變量的值。
運(yùn)算符
????????Go語言支持以下的運(yùn)算符。
????????算術(shù)運(yùn)算符:+(加法)、-(減法)、*(乘法)、/(除法)、%(取模)。
????????賦值運(yùn)算符:=(賦值)、+=(加等于)、-=(減等于)、*=(乘等于)、/=(除等于)、%=(模等于)。
????????比較運(yùn)算符:==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。
????????邏輯運(yùn)算符:&&(邏輯與)、||(邏輯或)、!(邏輯非)。
????????位運(yùn)算符:&(按位與)、|(按位或)、^(按位異或)、~(按位取反)、<<(左移位)、>>(右移位)。
????????指針運(yùn)算符:&(取變量地址,返回變量的指針)、*(解引用指針)。
????????括號運(yùn)算符:()(括號運(yùn)算符,用于改變運(yùn)算順序)。
????????類型運(yùn)算符:typeOf(類型查詢運(yùn)算符),sizeof(大小查詢運(yùn)算符)。
????????空值運(yùn)算符:nil(空值運(yùn)算符,用于判斷變量是否為空)。
????????錯誤運(yùn)算符:error(錯誤運(yùn)算符,用于判斷變量是否為錯誤值)。
????????接收運(yùn)算符:<-(接收運(yùn)算符,用于通道操作)。
????????索引運(yùn)算符:[](索引運(yùn)算符,用于訪問數(shù)組、切片、映射等類型的元素)。
????????斷言運(yùn)算符:類型.(值)(斷言運(yùn)算符,用于將一個接口類型的值轉(zhuǎn)換為具體的類型)。
????????類型轉(zhuǎn)換運(yùn)算符:類型(值)(類型轉(zhuǎn)換運(yùn)算符,用于將一個類型的值轉(zhuǎn)換為另一個類型)。
條件控制
????????在Go語言中,可以使用if、else if、else進(jìn)行條件判斷與執(zhí)行控制。
package mainimport "fmt"func main() {a := 66if a >= 88 {fmt.Println("Hello")} else if a > 50 && a < 88 {fmt.Println("CSDN")} else {fmt.Println("Other")}
}
????????還可以使用switch語句根據(jù)不同的條件執(zhí)行不同的代碼塊,其基本語法如下。其中,condition是一個布爾表達(dá)式,value1、value2等是要比較的值。如果condition的值等于某個值,就會執(zhí)行相應(yīng)的代碼塊。如果沒有匹配的值,可以選擇使用default代碼塊來執(zhí)行默認(rèn)操作。
switch condition {
case value1:// 執(zhí)行條件為value1時的代碼塊
case value2:// 執(zhí)行條件為value2時的代碼塊
...
default:// 執(zhí)行條件不滿足時的默認(rèn)代碼塊(可選)
}
????????在下面的示例代碼中,我們使用switch語句來輸出某個月的天數(shù)。
package mainimport "fmt"func main() {month := 3switch month {case 1, 3, 5, 7, 8, 10:fmt.Println("31 days")case 4, 6, 9, 11:fmt.Println("30 days")case 2:fmt.Println("28 days or 29 days")default:fmt.Println("invalid month")}
}
????????注意:單個case后面可以傳多個值,用逗號進(jìn)行分隔;當(dāng)匹配多個值中的任何一個值時,就會執(zhí)行后面的語句。
循環(huán)
????????在Go語言中,使用for語句來進(jìn)行循環(huán)控制。注意:與C/C++、Java等語言不同,Go語言中沒有while循環(huán)。
????????for循環(huán)有三種形式:第一種是基本的for循環(huán),第二種是簡化的for循環(huán),最后一種是無限循環(huán)。
????????基本的for循環(huán)語法如下。其中,initialization是循環(huán)開始前的初始化語句;condition是循環(huán)條件,滿足條件時繼續(xù)執(zhí)行循環(huán);post是每次循環(huán)執(zhí)行完畢后的后處理語句。
for initialization; condition; post {// 循環(huán)體
}
????????在下面的示例代碼中,我們使用基本的for循環(huán)計算1到100相加的總和。
package mainimport "fmt"func main() {sum := 0for i := 1; i <= 100; i++ {sum += i}fmt.Println(sum)
}
????????簡化的for循環(huán)只有循環(huán)條件,沒有初始化語句和后處理語句。在下面的示例代碼中,我們使用簡化的for循環(huán)計算1到100相加的總和。
package mainimport "fmt"func main() {sum := 0i := 1for i <= 100 {sum += ii += 1}fmt.Println(sum)
}
????????無限循環(huán)直接使用for關(guān)鍵字即可,后面不需要帶其他語句。在下面的示例代碼中,我們使用無限循環(huán)計算1到100相加的總和。
package mainimport "fmt"func main() {sum := 0i := 1for {sum += ii += 1if i > 100 {break}}fmt.Println(sum)
}