目錄(?)
[+]
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 就不...