三 Go的高階型別 1

2022-07-11 02:18:07 字數 3535 閱讀 3714

指標

go 具有指標。指標儲存了變數的記憶體位址

型別 *t 是指向型別 t 的值的指標。其零值是 nil。

var p *int

& 符號會生成乙個指向其作用物件的指標。

i := 42

p = &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 = &my

fmt.println(pmy.name)

結構體文法表示通過結構體字段的值作為列表來新分配乙個結構體。

使用 name:語法可以僅列出部分字段。(欄位名的順序無關。)

特殊的字首 & 返回乙個指向結構體的指標。

陣列

型別 [n]t 是乙個有 n 個型別為 t 的值的陣列。

表示式

var a [10]int

定義變數 a 是乙個有十個整數的陣列。

陣列的長度是其型別的一部分,因此陣列不能改變大小。但可以用切片(slice)來代替。

slice

func 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) = 5

myslice = 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 " 的部分即可 

map

type my struct 

func 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型別進...