Go速成無壓力【六】:指針,結構,數組(pointer, struct , array)

(一)指針 (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)
}

運行後,可見結果報錯,被設置了固定長度的數組無法改變其長度,否則會報錯
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章