指標
go 具有指標。指標儲存了變數的記憶體位址結構體型別 *t 是指向型別 t 的值的指標。其零值是 nil。
var p *int& 符號會生成乙個指向其作用物件的指標。
i := 42p = &i
* 符號表示指標指向的位址上的值。
fmt.println(*p) //通過指標 p 讀取 i*p = 21 //通過指標 p 設定 i
這也就是通常所說的 "間接引用" 或 "非直接引用"。
與 c 不同,go 沒有指標運算。
陣列type my struct乙個結構體(struct)就是乙個欄位的結合。
(而 type 的 含義跟其字面意思相符。)
結構體欄位使用點號來訪問。
結構體指標
var pmy *my = &my{}pmy.name = "questionmark"
結構體欄位可以通過結構體指標來訪問。
通過指標簡潔的訪問是透明的。
結構體文法
pmy = &myfmt.println(pmy.name)
結構體文法表示通過結構體字段的值作為列表來新分配乙個結構體。
使用 name:語法可以僅列出部分字段。(欄位名的順序無關。)
特殊的字首 & 返回乙個指向結構體的指標。
型別 [n]t 是乙個有 n 個型別為 t 的值的陣列。slice表示式
var a [10]int定義變數 a 是乙個有十個整數的陣列。
陣列的長度是其型別的一部分,因此陣列不能改變大小。但可以用切片(slice)來代替。
mapfunc main()func printslice(slicename string, slice int)
slice 只能由 make 建立
乙個 slice 會指向乙個序列的值,並且包含了長度資訊。
t 是乙個元素型別為 t 的 slice。
len(s) 返回 slice s 的長度。
cap(s) 返回 slice s 的容量。
slice 可以包含任意的型別,包括它自身
slice 切片操作
func main()myslice = myslice[:5]
myslice = myslice[1:]
myslice = myslice[0:0]
myslice = myslice[0:1]
}
slice 可以重新切片,建立乙個新的 slice 值指向相同的陣列。
表示式s[ lo : hi ] 表示從 lo 到 hi - 1 的 slice 元素,包括前端資料,不包括後端資料。因此
s[ lo : lo ] 是空的,而
s[ lo : lo + 1] 有乙個元素
構造 slice
前面說過 slice 是必須由 make 建立。這會分配乙個全是零值的陣列並且返回乙個 slice 指向這個陣列:
myslice := make( int, 5 ) // len(myslice) = 5為了指定容量,可傳遞第三個引數到 make :
myslice := make( int, 0, 5 ) // len(myslice) = 0 cap(myslice) = 5myslice = myslice[ : cap(myslice) ] // len(myslice) = 5 cap(myslice) = 5
myslice = myslice[ 1 : ] // len(myslice) = 4, cap(myslice) = 4
nil slice
slice 的零值是 nil。
乙個 nil 的 slice 的長度和容量是 0。
向 slice 新增元素
如果 slice 的底層陣列
太小,而不能容納所有值時,會分配乙個更大的陣列。返回的 slice 會指向這個新分配的陣列。
eg:
func main()//執行結果
//myslice : len = 2 cap = 2
range
for 迴圈的 range 格式可以對 slice 或者 map 進行迭代迴圈
但使用 for 迴圈遍歷乙個 slice 時,每次迭代 range 將返回兩個值。
第乙個是當前下標(序號)。
第二個是該下標所對應 slice 元素的乙個 拷貝。
func main()return
}
可以通過賦值給 _ 來忽略序號的值。
如果只需要索引值,去掉 " ,v " 的部分即可
函式值type my structfunc main()
fmt.println(mymap)
return
}
map 對映建到值。
map 在使用之前必須用 make 來建立;值為 nil 的 map 是空的,並且不能對其賦值。
map 的文法跟結構體文法相似,不過必須有鍵名。
若頂級型別只是乙個型別名,你可以在文法的元素中省略他。
在 map m 中
插入或修改乙個元素:
m[key] = elem獲得元素:
elem = m[key]刪除元素:
delete(m, key)通過雙賦值檢測是否重複鍵
elem,ok = m[key] // 也可以用 "_" 代替 elem 只取鍵是否存在如果 key 在 m 中, ok 為 true。否則, ok 為 false,並且 elem 是 map 的元素型別的零值。
同樣的,當從 map 中讀取某個不存在的鍵時,結果是 map 的元素型別的零值。
func test(fun func())func main()
test(hellofun)
return
}
函式也是值。他們也和其他值一樣可以傳遞,比如,函式值可以作為函式
go函式可以是乙個閉包。閉包是乙個函式值。它應用了函式體之外的變數。
這個函式可以對這個應用的變數進行訪問和賦值;也就是這個函式被繫結(bind)在這個變數上。
Go 語言程式設計 高階資料型別 陣列
向函式傳遞陣列 指標陣列 陣列是具有相同資料型別的一組已編號且長度固定的資料項序列,可以是任意的原始資料型別也可以是自定義的資料型別。陣列元素可以通過索引 位置 來讀取 或者修改 索引從 0 開始,第乙個元素索引為 0,第二個索引為 1,以此類推。golang 陣列宣告需要指定元素型別及元素個數,使...
Go 語言程式設計 高階資料型別 指標
乙個指標變數指向了乙個值的記憶體位址。類似於變數和常量,在使用指標前需要宣告 定義乙個指標變數。宣告乙個指標變數,格式 var var name type示例 var ip int 宣告整型指標變數 var fp float32 宣告浮點型指標變數 指標使用流程 宣告指標變數。為指標變數賦值。訪問指...
介紹Go的三種基本高階函式
函式式程式語言將函式作為第一等公民,也就是說,函式可以作為引數,也可以作為返回值。將函式作為引數,或者返回值的特殊函式,就叫做高階函式。下面介紹三個最基本的高階函式。分別是map,filter,reduce。由於golang不支援范型,使用inte ce 反射又顯得複雜,下面的例子只使用int型別進...