Go 基礎語言學習筆記
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
相關文章
- Go語言核心36講(Go語言基礎知識五)--學習筆記Go筆記
- Go語言核心36講(Go語言基礎知識四)--學習筆記Go筆記
- Go語言核心36講(Go語言基礎知識三)--學習筆記Go筆記
- Go語言核心36講(Go語言基礎知識六)--學習筆記Go筆記
- Go語言核心36講(Go語言基礎知識一)--學習筆記Go筆記
- Go語言核心36講(Go語言基礎知識二)--學習筆記Go筆記
- Go 學習筆記 - Go 基礎語法(2)Go筆記
- Go學習筆記 - Go 基礎語法(1)Go筆記
- c語言程式基礎學習筆記C語言筆記
- go 學習筆記之初識 go 語言Go筆記
- go語言學習-基礎知識Go
- 【Go】Go語言學習筆記-3-包Go筆記
- GO語言學習筆記之mac環境go語言配置Go筆記Mac
- Go語言學習筆記(七)之方法Go筆記
- 【Go】Go語言學習筆記-2-函式Go筆記函式
- go 學習記錄--基礎語法Go
- go 學習筆記之學習函數語言程式設計前不要忘了函式基礎Go筆記函數程式設計函式
- Go語言學習筆記 - PART9 - 介面Go筆記
- 飛機的 PHP 學習筆記之語言基礎篇PHP筆記
- Go語言核心36講(Go語言進階技術四)--學習筆記Go筆記
- Go語言核心36講(Go語言進階技術三)--學習筆記Go筆記
- Go語言核心36講(Go語言進階技術二)--學習筆記Go筆記
- Go語言核心36講(Go語言進階技術九)--學習筆記Go筆記
- Go語言核心36講(Go語言進階技術十三)--學習筆記Go筆記
- Go語言核心36講(Go語言進階技術十二)--學習筆記Go筆記
- Go語言核心36講(Go語言進階技術八)--學習筆記Go筆記
- Go語言核心36講(Go語言進階技術十六)--學習筆記Go筆記
- Go語言核心36講(Go語言進階技術十五)--學習筆記Go筆記
- Go語言核心36講(Go語言進階技術十四)--學習筆記Go筆記
- Go語言核心36講(Go語言進階技術一)--學習筆記Go筆記
- Go語言核心36講(Go語言進階技術十)--學習筆記Go筆記
- Go語言核心36講(Go語言進階技術十一)--學習筆記Go筆記
- Go語言核心36講(Go語言進階技術五)--學習筆記Go筆記
- GO語言學習筆記-反射篇 Study for Go ! Chapter nine - ReflectGo筆記反射APT
- 組合語言零基礎入門學習筆記(一)組合語言筆記
- go語言學習筆記(一):*和&的區別Go筆記
- Go 語言學習筆記之陣列與切片Go筆記陣列
- Go語言核心36講(新年彩蛋)--學習筆記Go筆記
- Go語言核心36講(導讀)--學習筆記Go筆記