文章目錄
(一)指針 (Pointer)
Go擁有自己的指針,一個指針保留了值的內存地址
比如:*P 是指向 P這個變量的值,如果一個指針定義聲明瞭但是沒有被賦值,沒有指向,則它的值可以寫爲 nil
(1)指針的定義
var p *int
(2)指針的地址
使用 & 操作符可以引出指針的值,如果指針被改變值,則該指針所綁定的值必然被改變,因爲所綁定的值和指針指向的是同一個地址
fmt.Printf(&p)
(3)指針的賦值
指針的賦值依靠 * 操作符 ,比如:
*p = 12
和c 語言不同, go語言沒有指針運算
(4)指針的操作——實戰演示
實戰1:
package main
import "fmt"
func main() {
// 使用變量地址給指針賦值
x := 12
p := &x
fmt.Println("指針p的值爲:", *p)
fmt.Println("指針p的地址爲:", &p)
// 定義指針並賦值
var t *int
t = &x
fmt.Println("指針t的值爲:", *t)
}
實戰2:
如果指針被改變值,則該指針所綁定的值必然被改變,因爲所綁定的值和指針指向的是同一個地址
package main
import "fmt"
func main() {
var p *int
var y int = 1024
p = &y
fmt.Println("指針p被改變前的值爲:", *p)
fmt.Println("指針p被改變前,y值爲:", y)
*p += 1024
fmt.Println("指針p被修改後的值爲:", *p)
fmt.Println("指針p被改變前,y值爲:", y)
}
(二)結構(struct)
結構是一個域的集合,這裏的域可以表示爲很多變量, 結構採用關鍵字struct表示
package main
import "fmt"
type Vertex struct {
x int
y int
}
func main(){
fmt.Println(Vertex{1,2})
}
(三)結構體的使用
使用結構體內的成員,需要用到符號 . ,先給結構體賦值,然後再使用 . 操作符
package main
import "fmt"
type zoo struct{
Monkey string
bird string
elephant string
}
func main(){
zoo {"金絲猴","火烈鳥","PHP"}
fmt.Println(zoo.Monkey , zoo.bird , zoo.elephant)
}
(四)指向結構體的指針
結構體的成員可以被指針指向
使用指針 p 調用結構體的成員x的寫法爲(*p).x
, 還可以寫爲 p.x
package main
import "fmt"
type Vertex struct {
x int
y int
}
func main() {
v := Vertex{1, 2}
p := &v
p.x = 1e12
fmt.Println("結構體v爲:", v)
fmt.Println("p指針爲:", p)
}
(五)結構體的各種賦值
結構體可以用 名字:變量 的方式進行賦值
package main
import "fmt"
type Vertex struct {
x, y int
}
func main() {
var (
v1 = Vertex{1, 10} //給Vertex結構體的全體成員賦值
v2 = Vertex{} //結構體成員全部被賦值爲0
v3 = Vertex{y: 10} //只給y賦值爲10,x默認爲0
p = &Vertex{99, 1} //賦值後被指針指向
)
fmt.Println(p, v1, v2, v3) //輸出結果
}
(六)數組(array)
數組的表達式爲:
var 數組名[數組數量] 類型
聲明一個類型爲整型,數組名爲a,數組長度爲10的數組
var a[10] int
(1)數組操作的演示
package main
import "fmt"
func main(){
var a[10] int
a[0] = 10
a[8] = 20
fmt.Println("輸出指定下標的數組>>> ",a[0],a[8]) //輸出指定下標的數組
fmt.Println("輸出整個數組>>> ",a) //輸出整個數組
for n :=0 ; n<10 ; n++ {
a[n] = n*11
}
fmt.Println("數組被遍歷賦值後,輸出整個數組>>> ",a) //數組被遍歷賦值後,輸出整個數組
}
數組的長度是其類型的一部分,所以數組的尺寸不能被重置,這使數組看起來似乎是有限的,但是不要擔心,Go提供了一個使用數組更快捷的方法
(2)未指定數組長度時的賦值操作
package main
import "fmt"
func main() {
//數組未設置具體長度時
b := []int{1, 3123, 123, 123, 12, 3}
fmt.Println(b)
//對上面未設置具體長度的數組b動態添加一位新的成員時
b = []int{45, 45, 45, 55, 45, 78, 99}
fmt.Println(b)
}
數組可以正常賦值,隨意改變數組數據與長度
(3)指定數組長度後的賦值操作
package main
import "fmt"
func main() {
a := [9]int{1, 2, 3, 45, 12, 32, 1, 32, 12}
fmt.Println(a)
a = [10]int{1, 2, 3, 45, 12, 32, 1, 32, 12, 999}
fmt.Println(a)
}
運行後,可見結果報錯,被設置了固定長度的數組無法改變其長度,否則會報錯