go程式的基本結構
一個可以最簡單的可執行的go程式需要滿足下面兩個條件:
- 有一個main()函式
- main()函式在main包中
例如: 在go語言中的 hello world 程式如下:
// main.go
package main
func main() {
println("hello world");
}
程式中的 package
關鍵字,用來宣告檔案所屬的包(檔案所屬的包跟檔名是沒有關係的),每一個go檔案都需要有一個包宣告; 而 func 關鍵字用來定義函式, 這裡我們定義了一個main函式(main函式的形式是固定的)。println 函式是用來向標準輸出列印資料的,不過我們一般情況下是不使用它的。
go在編譯程式時,會自動在語句的結尾加上分號,所有這裡函式的第一的大括號,必須與()在同一行,否則返回就會加在()之後,就會出現錯誤,後面的一些流程控制語句也是如此
執行程式:
go build main.go // 編譯程式
./main // 執行程式
我們可以將兩步合成一步:
go run main.go // 不會生成中間檔案
在執行go程式時的入口就是 main 包下的 main 函式。
變數
go語言使用 var 宣告或者定義變數,它可以用在函式之外定義,此時就是全域性變數;而在函式內宣告時,就是區域性變數。
還有一種簡略的定義方式,使用 := 來定義,這種方式只能用在函式中,即定義區域性變數
且區域性變數宣告之後必須使用
package main
import "fmt"
var age int = 10 // 顯式的宣告變數的型別 int
var name = "Tom" // go也可以自動推斷處變數型別,這裡是 string
func main() {
var sex = "man"
hello := "hello" // 簡略宣告方式
fmt.Println(sex)
fmt.Println(hello + "world")
}
這裡我們定義了兩個全域性變數 name 和 age, 還定義了兩個區域性變數 sex 和 hello, 在 go 語言中,全域性變數可以宣告之後不是有,但是區域性變數一旦宣告必須使用,否則編譯器會報錯;
注意: 這裡我們使用 import 關鍵字引入了一個 fmt 的包,在go程式中我們一般都應該使用 fmt 包中的函式來列印資料,而不是前面的println
基本資料型別:
型別 | 含義 | 預設值 |
---|---|---|
bool | 布林值 | false |
byte | 位元組,uint8 | 0 |
rune | Unicode碼點,int32 | 0 |
int,uint | 與系統相關的有/無符號整數 | 0 |
int8,uint8 | 8位有/無符號整數 | 0 |
int16,uint16 | 16位有/無符號整數 | 0 |
int32,uint32 | 32位有/無符號整數 | 0 |
int64,uint64 | 64位有/無符號整數 | 0 |
float32 | 32位浮點數 | 0.0 |
float64 | 64位浮點數 | 0.0 |
complex64 | 64位複數 | 0+0i |
complex128 | 128位複數 | 0+0i |
string | 字串 | “” |
這些是比較基本的型別,還有一些型別,後面用到了再說
常量
常量的定義方式與變數型別,不過使用的是 const
關鍵字:
const PI float32 = 3.14159
const USERNAME = "root" // 自動型別推斷
常量必須在定義時,就初始化,並且一經定義便不可更改。
流程控制語句
if語句
package main
import "fmt"
func main() {
a := 10
if a > 5 {
fmt.Println("a 大於 5")
} else {
fmt.Println("a 小於 5")
}
}
同樣的這裡的 左大括號“{”必須與 if 或者 else 在同一行, 且這裡 else 必須與 if 的右大括號“}”在同一行。
go語言中沒有三元運算子
switch語句
switch (n){
case 1:
fmt.Println("n == 1")
case 2:
fmt.Println("n == 2")
default:
fmt.Println("n is default")
}
go中的 switch 是不需要 break 語句的,預設自動終止一個case; 如果需要繼續執行下一個,使用fallthrough,此時不會判斷條件
這裡switch語句還可以包含初始化語句,使用分號”;”分隔,且case的條件,不僅僅可以是常量值,還可以是比較表示式;
for迴圈
go語言支援三種迴圈方式:
// 1. 常見的for迴圈,類似於C語言的迴圈,不過條件可以不用括號
for i := 0; i < 10; i++ {
fmt.Println(i);
}
// 2. 類while語法
i := 10
for i > 0 {
fmt.Println(i)
i--
}
// 同樣的,無限迴圈是這樣,省略條件
for {
//...
}
// 3. for .. range,可以用來迴圈字串,陣列,map,channel等等
// range返回 (索引值, 值)或者(鍵, 值); 如果只有一個接收引數,則會忽略第二個返回值
s := "hello"
for i := range s { // 這裡迴圈的是string的索引
fmt.Println(s[i])
}
標籤,goto, break, continue
go還支援標籤(區分大小寫),可以使用goto跳轉到標籤,break 可⽤於 for、 switch、 select,⽽ continue 僅能⽤於 for 迴圈。