二、Go基礎(chǔ)語(yǔ)法
1.Go語(yǔ)言結(jié)構(gòu)
package main
import "fmt"
func main() {
/* 這是我的第一個(gè)簡(jiǎn)單的程序 */
fmt.Println("Hello, World!")
}
僅聲明與其他編程語(yǔ)言不同的點(diǎn)。
第一行代碼 package main 定義了包名。必須在源文件中非注釋的第一行指明這個(gè)文件屬于哪個(gè)包,如:package main。package main表示一個(gè)可獨(dú)立執(zhí)行的程序,每個(gè) Go 應(yīng)用程序都包含一個(gè)名為 main 的包。
當(dāng)標(biāo)識(shí)符(包括常量、變量、類型、函數(shù)名、結(jié)構(gòu)字段等等)以一個(gè)大寫字母開(kāi)頭,如:Group1,那么使用這種形式的標(biāo)識(shí)符的對(duì)象就可以被外部包的代碼所使用(客戶端程序需要先導(dǎo)入這個(gè)包),這被稱為導(dǎo)出(像面向?qū)ο笳Z(yǔ)言中的 public);標(biāo)識(shí)符如果以小寫字母開(kāi)頭,則對(duì)包外是不可見(jiàn)的,但是他們?cè)谡麄€(gè)包的內(nèi)部是可見(jiàn)并且可用的(像面向?qū)ο笳Z(yǔ)言中的 protected )。
{不能單獨(dú)放在一行,否則會(huì)報(bào)錯(cuò)。
2.Go數(shù)據(jù)類型和基礎(chǔ)語(yǔ)法
與其他編程語(yǔ)言幾乎一樣,不展開(kāi)。
3.Go語(yǔ)言變量和常量
變量
共有三種聲明變量的方法。
-
指定變量類型,聲明后若不賦值,使用默認(rèn)值。
var v_name v_type v_name = value -
根據(jù)值自行判定變量類型
var v_name = value -
省略var, 注意 :=左側(cè)的變量不應(yīng)該是已經(jīng)聲明過(guò)的,否則會(huì)導(dǎo)致編譯錯(cuò)誤。該命名方法只能用在方法內(nèi)。
func main(){ a := 10 }
常量
使用const聲明常量。
- 顯式類型定義:
const b string = "abc" - 隱式類型定義:
const b = "abc"
iota
iota,特殊常量,可以認(rèn)為是一個(gè)可以被編譯器修改的常量。
iota 在 const關(guān)鍵字出現(xiàn)時(shí)將被重置為 0(const 內(nèi)部的第一行之前),const 中每新增一行常量聲明將使 iota 計(jì)數(shù)一次(iota 可理解為 const 語(yǔ)句塊中的行索引)。
iota 可以被用作枚舉值:
package main
import "fmt"
func main() {
const (
a = iota //0
b //1
c //2
d = "ha" //獨(dú)立值,iota += 1
e //"ha" iota += 1
f = 100 //iota +=1
g //100 iota +=1
h = iota //7,恢復(fù)計(jì)數(shù)?
i //8
)
fmt.Println(a,b,c,d,e,f,g,h,i)
}
//輸出結(jié)果為:0 1 2 ha ha 100 100 7 8
4.Go 條件判斷
if語(yǔ)句
與java的條件判斷語(yǔ)句基本相同,但是條件表達(dá)式不需要用 ()。
if 布爾表達(dá)式 {
/* 在布爾表達(dá)式為 true 時(shí)執(zhí)行 */
}
if 布爾表達(dá)式 {
/* 在布爾表達(dá)式為 true 時(shí)執(zhí)行 */
} else {
/* 在布爾表達(dá)式為 false 時(shí)執(zhí)行 */
}
if 布爾表達(dá)式 1 {
/* 在布爾表達(dá)式 1 為 true 時(shí)執(zhí)行 */
if 布爾表達(dá)式 2 {
/* 在布爾表達(dá)式 2 為 true 時(shí)執(zhí)行 */
}
}
switch
switch 語(yǔ)句用于基于不同條件執(zhí)行不同動(dòng)作,每一個(gè) case 分支都是唯一的,從上直下逐一測(cè)試,直到匹配為止。
一個(gè)case 后面可以跟兩個(gè)條件,用,分割。
switch 語(yǔ)句執(zhí)行的過(guò)程從上至下,直到找到匹配項(xiàng),匹配項(xiàng)后面也不需要再加break。
switch var1 {
case val1:
...
case val2:
...
default:
...
}
Type switch
switch 語(yǔ)句還可以被用于 type-switch 來(lái)判斷某個(gè) interface 變量中實(shí)際存儲(chǔ)的變量類型。
package main
import "fmt"
func main() {
var x interface{}
switch i := x.(type) {
case nil:
fmt.Printf(" x 的類型 :%T",i)
case int:
fmt.Printf("x 是 int 型")
case float64:
fmt.Printf("x 是 float64 型")
case func(int) float64:
fmt.Printf("x 是 func(int) 型")
case bool, string:
fmt.Printf("x 是 bool 或 string 型" )
default:
fmt.Printf("未知型")
}
}
select
select是Go中的一個(gè)控制結(jié)構(gòu),類似于用于通信的switch語(yǔ)句。每個(gè)case必須是一個(gè)通信操作,要么是發(fā)送要么是接收。
select隨機(jī)執(zhí)行一個(gè)可運(yùn)行的case。如果沒(méi)有case可運(yùn)行,它將阻塞,直到有case可運(yùn)行。一個(gè)默認(rèn)的子句應(yīng)該總是可運(yùn)行的。
select {
case communication clause :
statement(s);
case communication clause :
statement(s);
/* 你可以定義任意數(shù)量的 case */
default : /* 可選 */
statement(s);
}
每個(gè)case都必須是一個(gè)通信
所有channel表達(dá)式都會(huì)被求值
所有被發(fā)送的表達(dá)式都會(huì)被求值
如果任意某個(gè)通信可以進(jìn)行,它就執(zhí)行;其他被忽略。
-
如果有多個(gè)case都可以運(yùn)行,Select會(huì)隨機(jī)公平地選出一個(gè)執(zhí)行。其他不會(huì)執(zhí)行。
否則:
- 如果有default子句,則執(zhí)行該語(yǔ)句。
- 如果沒(méi)有default字句,select將阻塞,直到某個(gè)通信可以運(yùn)行;Go不會(huì)重新對(duì)channel或值進(jìn)行求值。
5.Go語(yǔ)言循環(huán)
for循環(huán)
主要有3種用法
1.與C語(yǔ)言的for循序一樣:
for init; condition; post { }
for a = 1; a < 100 ; a++{
//dosomething
}
2.與C語(yǔ)言的while一樣:
for condition { }
for true{
//dosomething
}
3.和 C 的 for(;;) 一樣:
for {
//dosomething
}
//跟for true其實(shí)一樣
嵌套循環(huán)的用法與其他語(yǔ)音一樣。
for [condition | ( init; condition; increment ) | Range]
{
for [condition | ( init; condition; increment ) | Range]
{
statement(s);
}
statement(s);
}
range的用法
類似于Python。
循序控制語(yǔ)句
break
用于循環(huán)語(yǔ)句中跳出循環(huán),并開(kāi)始執(zhí)行循環(huán)之后的語(yǔ)句。
continue
跳過(guò)當(dāng)前循環(huán)執(zhí)行下一次循環(huán)語(yǔ)句。
Go 語(yǔ)言的 goto 語(yǔ)句可以無(wú)條件地轉(zhuǎn)移到過(guò)程中指定的行。
goto語(yǔ)句通常與條件語(yǔ)句配合使用。可用來(lái)實(shí)現(xiàn)條件轉(zhuǎn)移, 構(gòu)成循環(huán),跳出循環(huán)體等功能。
但是,在結(jié)構(gòu)化程序設(shè)計(jì)中一般不主張使用goto語(yǔ)句, 以免造成程序流程的混亂,使理解和調(diào)試程序都產(chǎn)生困難。
package main
import "fmt"
func main() {
/* 定義局部變量 */
var a int = 10
/* 循環(huán) */
LOOP: for a < 20 {
if a == 15 {
/* 跳過(guò)迭代 */
a = a + 1
goto LOOP
}
fmt.Printf("a的值為 : %d\n", a)
a++
}
}