Golang 通關初級(2)

2021-07-26 23:04:55 字數 3845 閱讀 6623

目錄(?)

[+]

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

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

var p *int
& 操作符會生成乙個指向其運算元的指標。

i := 42

p = &i

fmt.println(*p) // 通過指標 p 讀取 i

*p = 21

// 通過指標 p 設定 i

這也就是通常所說的「間接引用」或「重定向」。

與 c 不同,go 沒有指標運算。

package main

import (

"fmt"

)func main()

輸出:

p = 0xc082004258, *p = 12

p = 0xc082004258, *p = 24

p = 0xc082004280, *p = 33

乙個結構體( struct )就是乙個欄位的集合。

(而 type 宣告就是定義型別的。)

package main

import (

"fmt"

)type people struct

func main() )

}

輸出:

結構體欄位

結構體欄位使用點號來訪問。

package main

import (

"fmt"

)type people struct

func main()

fmt.printf("name = %v, age = %v\n", me.name, me.age)

}

輸出:

name =afra, age = 22
結構體指標

結構體欄位可以通過結構體指標來訪問。

如果我們有乙個指向結構體的指標 p ,那麼可以通過 (*p).x 來訪問其欄位 x 。 不過這麼寫太囉嗦了,所以語言也允許我們使用隱式間接引用,直接寫 p.x 就可以。

package main

import (

"fmt"

)type people struct

func main()

p := &me

fmt.printf("name = %v, age = %v\n", p.name, p.age)

}

輸出:

name =afra, age = 22
結構體文法

結構體文法通過直接列出欄位的值來新分配乙個結構體。

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

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

package main

import (

"fmt"

)type people struct

var (

a = people

b = people

c = people

d = people{}

e = &people

)func main()

輸出:

&

型別 [n]t 表示擁有 n 個 t 型別的值的陣列。

表示式var a [10]int 

會將變數 a 宣告為擁有有 10 個整數的陣列。

陣列的長度是其型別的一部分,因此陣列不能改變大小。 這看起來是個限制,不過沒關係, go 提供了更加便利的方式來使用陣列。

package main

import (

"fmt"

)func main()

fmt.println(b)

}

輸出:

afra55

victor

[afra55 victor]

[1 2 4 5 6 6]

每個陣列的大小都是固定的。 而切片則為陣列元素提供動態大小的、靈活的視角。 在實踐中,切片比陣列更常用。

型別 t 表示乙個元素型別為 t 的切片。

以下表示式為陣列 a 的前五個元素建立了乙個切片。

a

[0:5]

package main

import (

"fmt"

)func main()

var s int = source[2

:6] fmt.println(s)

}

輸出:

[354

0]

切片就像陣列的引用

切片並不儲存任何資料, 它只是描述了底層陣列中的一段。

更改切片的元素會修改其底層陣列中對應的元素。

與它共享底層陣列的切片都會觀測到這些修改。

package main

import (

"fmt"

)func main()

var s int = source[2:6]

fmt.println(s)

source[5] = 7

fmt.println(s)

s[0] = 88

fmt.println(source)

}

輸出:

[354

0][354

7][1288

547]

切片文法

切片文法類似於沒有長度的陣列文法。

這是乙個陣列文法:

[3]bool
下面這樣則會建立乙個和上面相同的陣列,然後構建乙個引用了它的切片:

bool
package main

import (

"fmt"

)func main()

fmt.println(a)

// b 是個切片

b := struct , , ,

}fmt.println(b)

}

輸出:

[1253

686][

]

切片的預設行為

在進行切片時,你可以利用它的預設行為來忽略上下界。

切片下界的預設值為 0 ,上界則是該切片的長度。

對於陣列:

var a [10]int
來說,以下切片是等價的:

a

[0:10]

a[:10]

a[0:]

a[:]

package main

import (

"fmt"

)func main()

a = a[1:6]

fmt.println(a)

a = a[:3]

fmt.println(a)

a = a[2:]

fmt.println(a)

}

Golang 通關初級(1)

錄 原文hello 世界包匯入 匯出名函式 多值返回 命名返回值 變數變數的初始化 短變數宣告 基本型別 零值型別轉換 型別推導 常量數值常量 forif switch defer package main import fmt func main 輸出 hello,世界每個 go 程式都是由包構成...

checkio通關遊戲2

問題 給你乙個其中包含不同的英文本母和標點符號的文字,你要找到其中出現最多的字母,返回的字母必須是小寫形式,當檢查最想要的字母時,不區分大小寫,所以在你的搜尋中 a a 請確保你不計算標點符號,數字和空格,只計算字母。如果你找到兩個或兩個以上的具有相同的頻率的字母,返回那個先出現在字母表中的字母。例...

Sqli LABS通關筆錄 2

在這個關卡學習到了 1.程式的錯誤不是學校收費亂來的,單引號的錯誤和減號的錯誤要明白 單引號報錯。用第一關的payload嘗試了下。來看看原始碼 那麼我們構造的sql也就變成了 sql select from users where id 1 or 1 1 limit 0,1 如此一來id 1 就不...