go程式的基本結構 一個可以最簡單的可運行的go程式需要滿足下麵兩個條件: 有一個main()函數 main()函數在main包中 例如: 在go語言中的 hello world 程式如下: 程式中的 關鍵字,用來聲明文件所屬的包(文件所屬的包跟文件名是沒有關係的),每一個go文件都需要有一個包聲明 ...
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 迴圈。