go語言學習-基礎知識

gxyz發表於2018-03-25

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 迴圈。

相關文章