Go 基礎語言學習筆記

衣舞晨風發表於2017-08-03

1、Go檔案執行

開啟命令列,並進入程式檔案儲存的目錄中。
輸入命令 go run hello.go 並按回車執行程式碼。

2、宣告全域性變數

// 這種因式分解關鍵字的寫法一般用於宣告全域性變數
var (
    vname1 v_type1
    vname2 v_type2
)

3、指標

你可以通過 &i 來獲取變數 i 的記憶體地址,例如:0xf840000040(每次的地址都可能不一樣)。值型別的變數的值儲存在棧中。

一個引用型別的變數 r1 儲存的是 r1 的值所在的記憶體地址(數字),或記憶體地址中第一個字所在的位置。

4、簡短形式,使用 := 賦值操作符

我們知道可以在變數的初始化時省略變數的型別而由系統自動推斷,宣告語句寫上 var 關鍵字其實是顯得有些多餘了,因此我們可以將它們簡寫為 a := 50 或 b := false。
a 和 b 的型別(int 和 bool)將由編譯器自動推斷。
這是使用變數的首選形式,但是它只能被用在函式體內,而不可以用於全域性變數的宣告與賦值。使用操作符 := 可以高效地建立一個新的變數,稱之為初始化宣告。

5、變數交換與賦值

如果你想要交換兩個變數的值,則可以簡單地使用 a, b = b, a。
空白識別符號 _ 也被用於拋棄值,如值 5 在:_, b = 5, 7 中被拋棄。
_ 實際上是一個只寫變數,你不能得到它的值。這樣做是因為 Go 語言中你必須使用所有被宣告的變數,但有時你並不需要使用從一個函式得到的所有返回值。

並行賦值也被用於當一個函式返回多個返回值時,比如這裡的 val 和錯誤 err 是通過呼叫 Func1 函式同時得到:val, err = Func1(var1)。

6、常量

iota,特殊常量,可以認為是一個可以被編譯器修改的常量。
在每一個const關鍵字出現時,被重置為0,然後再下一個const出現之前,每出現一次iota,其所代表的數字會自動增加1。

eg:第一個 iota 等於 0,每當 iota 在新的一行被使用時,它的值都會自動加 1;所以 a=0, b=1, c=2 可以簡寫為如下形式:

const (
    a = iota
    b
    c
)

7、運算子

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

8、地址與指標

變數是一種使用方便的佔位符,用於引用計算機記憶體地址。
Go 語言的取地址符是 &,放到一個變數前使用就會返回相應變數的記憶體地址。

一個指標變數可以指向任何一個值的記憶體地址它指向那個值的記憶體地址。

在指標型別前面加上 * 號(字首)來獲取指標所指向的內容。

如果一個指標變數存放的又是另一個指標變數的地址,則稱這個指標變數為指向指標的指標變數。
當定義一個指向指標的指標變數時,第一個指標存放第二個指標的地址,第二個指標存放變數的地址:
這裡寫圖片描述

//指向指標的指標變數宣告格式如下:
var ptr **int;

9、語言切片(Slice)

  • 其本身並不是陣列,它指向底層的陣列
  • 作為變長陣列的替代方案,可以關聯底層陣列的區域性或全部
  • 為引用型別
  • 可以直接建立或從底層陣列獲取生成
  • 使用len()獲取元素個數,cap()獲取容量
  • 一般使用make()建立
  • 如果多個slice指向相同底層陣列,其中一個的值改變會影響全部
//其中cap可以省略,則和len的值相同
//len表示存數的元素個數,cap表示容量
make([]T, len, cap)
var slice1 []type = make([]type, len)
//也可以簡寫為
slice1 := make([]type, len)

切片擷取(新陣列與舊陣列都是指向同一個記憶體地址,即一個陣列元素修改了,另一個的陣列元素也就跟著邊了)

10、異常

package main

import (
    "fmt"
)

// 定義一個 DivideError 結構
type DivideError struct {
    dividee int
    divider int
}

// 實現   `error` 介面
func (de *DivideError) Error() string {
    strFormat := `
    Cannot proceed, the divider is zero.
    dividee: %d
    divider: 0
`
    return fmt.Sprintf(strFormat, de.dividee)
}

// 定義 `int` 型別除法運算的函式
func Divide(varDividee int, varDivider int) (result int, errorMsg string) {
    if varDivider == 0 {
        dData := DivideError{
            dividee: varDividee,
            divider: varDivider,
        }
        errorMsg = dData.Error()
        return
    } else {
        return varDividee / varDivider, ""
    }

}

func main() {

    // 正常情況
    if result, errorMsg := Divide(100, 10); errorMsg == "" {
        fmt.Println("100/10 = ", result)
    }
    // 當被除數為零的時候會返回錯誤資訊
    if _, errorMsg := Divide(100, 0); errorMsg != "" {
        fmt.Println("errorMsg is: ", errorMsg)
    }

}

輸出結果:
這裡寫圖片描述

整理自:http://www.runoob.com/go/go-tutorial.html

個人微信公眾號:
這裡寫圖片描述

作者:jiankunking 出處:http://blog.csdn.net/jiankunking

相關文章