一、變數
變數宣告:
使用var關鍵字進行變數的宣告,形式為:var 變數名 型別。示例如下:
var v1 int // int型變數v1
var v2 *int // 指向int型的指標
var v3 [10]int // 儲存有10個int型元素的陣列v3
var v4 int // int型切片
var v5 struct // 結構
var v6 map[string] int // map, key為string型別,value為int型別。
var v7 func(a int) int // 函式
變數初始化的三種方式:
var v1 int = 10
var v1 = 10 // go是靜態型別語言,但可以推斷出變數所屬型別。
v1 := 10 // 注意:v1必須是之前未宣告的。
變數賦值:
go語言支援多重賦值。i, j = j, i // 實現了交換變數i和j的值。
匿名變數:"_",一般用於多返回值。
二、常量
定義:在編譯期間就已知,且不可改變的值。
字面常量:
如:-12,3.14, "hello"
字面常量沒有具體型別。如:-12,可以是int, int32, int64等。這一點與c語言不同。
常量定義:
定義:通過const關鍵字,為字面常量起乙個友好的名字。
示例:const pi = 3.14 // 既可以為常量指定型別,也可以不知道型別。
注意:常量定義中,等號右側表示式的值,必須在編譯期間能夠確定。
預定義常量:
go語言預定義了true, false, iota三個常量。
iota:
可以認為是乙個可被編譯器修改的常量。
初始值為0。
在每個const出現時,iota被重置為0。
在下乙個const出現前,每出現乙個iota,其所代表的值自增1。
列舉:go不支援enum關鍵字,使用const()定義列舉。
三、型別
布林型別:布林型別不支援自動或強制型別轉換。如:var v bool = bool (1),會產生編譯錯誤。
整形:包括:
取值範圍固定:int8, uint8, int16, uint16, int32, uint32, int64, uint64
取值範圍與平台相關:int, uint, uintptr
go語言不支援自動型別轉換:
體現在賦值時:
var v1 int = 10
var v2 uint = v1 // 會產生編譯錯誤。
體現在算術或比較運算時。
浮點型:
支援: float32(類似於c中的float)和float64(類似於c中的double)。
注意:v := 1.1 // v被自動設為float64型別。
浮點數是非精確值,不能用==來判斷兩個浮點數書否相等。解決方式如下:
import "math"
func isequal(v1, v2, p float64) bool // 依次輸出:228 184 150 231 149 140
rune:代表單個unicode字元。
str := "世界"
for _, ch := range str // 依次輸出:19990 30028
陣列型別:
len()函式能夠獲取陣列的元素個數。
陣列長度在編譯時已確定。
與c語言不同,go中的陣列是值型別。將陣列作為引數傳入函式時,進行了陣列內容的完整拷貝。
陣列切片:
陣列切片的資料型別可抽象成如下3個變數:
指向陣列的指標。
陣列切片中的元素個數。
陣列切片已分配的儲存空間。
建立切片的兩種方式:
基於陣列建立切片: s1 := arr[first:last]
first需小於等於last。
first可不填寫,預設為陣列索引0。
last可不填寫,預設為陣列元素個數值。
first和last需在[0, len(arr)]之間。
通過make()函式直接建立陣列切片:
s1 := make(int, 5)
s2 := make(int, 5, 10)
s3 := int
動態增減元素:
cap()函式返回切片的空間大小;len()函式返回切片中已有的元素個數。
示例1:
s1 := int
示例2:
s1 := int
s2 := int
基於陣列切片建立陣列切片:
arr := [10]int
s1 := arr[:5] // len(s1) == 5, cap(s1) == len(arr) == 10
s2 := s1[:7] // 合法!只要last索引不超過s1的cap(s1)值就行。
s3 := s1[:] // s3 == [1 2 3 4 5]
內容複製:copy(s1, s2)函式,以s1、s2中的較小長度為準。
map特徵:未排序。
變數宣告:var mapname map[key-type]value-type
建立:mapname = make(map[key-type]name-type)
元素賦值:mapname[key] = value
元素刪除:delete(mapname, key)
元素查詢:value, ok := mapname[key]
四、流程控制
go語言的流程控制語句:
條件語句:if、else、else if
選擇語句:switch、case、select
迴圈語句:for、range
跳轉語句:goto
特殊關鍵字:break、continue、fallthrough
條件語句:
有返回值的函式,return語句不能放在if...else...語句塊中。
選擇語句:
條件表示式不限制為常量或整數,可以是字串等其他型別;
條件表示式可以不存在,此時執行case表示式為true的語句塊;但是此時case表示式的值只能是true或false;
case中可以有多個選項,用逗號隔開;
與c相反,case語句塊中不需要break;當需要繼續判斷下乙個case時,需要在本case語句塊中新增fallthrough關鍵字;
迴圈語句:
僅支援for乙個迴圈語句。
for語句的三種形式:
for statement1; statement2; statement3 {}
類似於c語言中for的用法。但是在statement1中不支援使用逗號進行多個變數的初始化,相反支援多重賦值。
for {}
類似於c語言中的for(;;) {}
for key, value range *** {}
break和continue可以配置標籤使用,用來退出外層迴圈。
跳轉語句:goto
五、函式
函式基本組成:func關鍵字 函式名(引數列表)(返回值列表)
函式定義:
函式呼叫:
不定引數:
定義:func add(args ...int) int {} // ...int表示args是int型的不定引數。
不定引數的傳遞:func2(args...) // 將本函式的不定引數args,傳遞給另乙個被呼叫函式的不定引數。
任意型別的不定引數:
定義:func add(args ...inte***ce{}) int {} // ...inte***ce{}表示args是任意型別的不定引數。
多返回值:
匿名函式與閉包:
匿名函式:
由乙個不帶函式名的函式宣告和函式體組成。
可以直接賦值給乙個變數或直接執行。
可以像普通變數一樣被傳遞和使用。
閉包:基本概念:?
價值:?
go語言中的閉包:
六、錯誤處理:
error介面:
defer:
乙個函式中,可以存在多個defer語句;defer被執行的順序與defer註冊的順序相反。
panic()和recover()
panic()被呼叫時,會將異常逐級向上層函式傳遞,直至所屬goroutine中所有被執行的函式終止,該過程稱為異常處理流程;
原型:func panic(inte***ce{}) // panic()函式可接收任意型別的引數。
recover():終止由panic()引發的異常處理流程;一般用在defer中。
七、完整示例
go專案目錄結構組織,參考:
go標準庫中的包:
flag包:解析命令列引數
os、io、bufio、strconv包:
參考: go語言標準庫文件中文版
第二章 順序程式設計
轉義字元 轉義字元 字元值輸出結果 乙個單撇號 輸出單撇號字元 乙個雙撇號 輸出雙撇號字元 乙個問號 輸出問號字元 乙個反斜線 輸出反斜線字元 a警告 alert 產生聲音或視覺訊號 b退格 backspace 將游標當前位置後退乙個字元 f換頁 form feed n換行 將游標當前位置移到下一行...
第二章 順序表
線性表是具有相同特性的資料元素的乙個有限序列。靜態順序表。define list init size 100 線性儲存空間的初始分配量。typedef structsqlist 動態線性表。typedef structsqlist 線性表宣告 sqlist l l.data elemtype mal...
第二章 順序結構
c語言沒有輸入輸出語句,通過函式庫完成,只需要用工具取出來。輸入輸出函式庫名稱為stdio。如何取出函式?1.明確函式在什麼庫中,如輸入輸出函式存在於stdio.h函式庫中。2.使用預編譯指令調入函式庫 include 如果是自定義的標頭檔案作為函式庫,採用雙引號包含庫名。輸出函式 printf 字...