go語言 結構體及結構體指標

2021-10-22 23:54:27 字數 2873 閱讀 7168

結構體(struct),是由一系列具有相同型別或不同型別的資料構成的資料集合,也叫結構。(可以理解為其他程式語言中的類)

結構體既可以定義在函式內,也可以定義在函式外,函式外為全域性結構體可以跨包訪問(前提是結構體首字母大寫)

結構體變數是值型別,可以使用fmt.printf("%p", &結構體變數)來檢視其記憶體位址;由於結構體是值型別,在方法傳遞時,希望傳遞的是結構體位址,這時就可以使用結構體指標來完成,可以結合new(t)函式建立結構體指標;

雙等於號比較時候,看兩側是什麼型別,如果是值型別,就看內容是否相同,即使位址不同,也為true,如果兩側是指標型別,就會比較記憶體位址是否相同;

package main

import

("fmt"

)// 宣告結構體,可以理解為建立乙個類

type people struct

func

main()

初始值為對應型別的預設值; string型別預設值為空字串;int型別預設為0;

// 宣告的同時賦值, 位置引數

p2 := people

fmt.

println

(p2)

// // 宣告的同時賦值, 關鍵字引數

p3 := people

fmt.

println

(p3)

// // 獲取結構體變數對應的值:

fmt.

println

(p1.name, p1.age)

// 0

fmt.

println

(p2.name, p2.age)

// 張三 24

fmt.

println

(p3.name, p3.age)

// 李四 22

//在結構體中,用"=="判斷的是結構體中的內容是否相同,如果位址不同,但是內容相同,返回值就為true

// 再宣告乙個結構體變數p4, 明顯這個結構體變數與p2不同,如果給p4賦值和p2一樣

var p4 people

p4.age =

24 p4.name =

"張三"

// 利用雙等於號"=="來判斷

fmt.

printf

("p2: %p, p4: %p \n"

,&p2,

&p4)

// p2: 0xc0000044e0, p4: 0xc000004540

fmt.

println

("p2==p4? "

, p2 == p4)

// p2==p4? true

// 結構體指標

p5 :=

new(people)

// 結構體是值型別,所以建立結構體指標時已經開闢了記憶體空間

fmt.

println

(p5)

// &

fmt.

println

(p5 ==

nil)

// false

// 由於結構體中的值不是指標型別,所以可以直接呼叫

p5.name =

"王五"

fmt.

println

(p5)

// &

// 由於p5是使用new()函式建立出來的,所以p5是指標

p6 := p5

fmt.

println

(p5, p6)

// & &

fmt.

printf

("p5: %p, p6: %p \n"

, p5, p6)

// p5: 0xc000096500, p6: 0xc000096500 引用型別不用&取位址

// 從上面的位址可以看到,p5和p6指向的是同乙個記憶體位址,所以,修改其中乙個,就會影響另外乙個

p5.age =

23 p6.name =

"趙六"

fmt.

println

(p5, p6)

// & &

// 雙等於號比較時候,看兩側是什麼型別,如果是值型別,就看內容是否相同,即使位址不同,也為true,如果兩側是指標型別,就會比較記憶體位址是否相同;

p7 :=

&people

p8 :=

&people

fmt.

printf

("p7: %t, p8: %t \n"

, p7, p8)

// p7: *main.people, p8: *main.people

fmt.

printf

("p7: %p, p8: %p \n"

, p7, p8)

// p7: 0xc000004640, p8: 0xc000004660

fmt.

println

("p7 == p8 ?"

, p7 == p8)

// p7 == p8 ? false

// 值型別與指標型別比較時的轉換: *指標型別, &值型別

p9 := people

fmt.

println

("p8==&p9?"

, p8==

&p9)

// p8==p9? false 使用&p9取到p9的位址,這時候兩邊都是指標型別,需要判斷記憶體位址是否相同

fmt.

println

("*p8==p9?"

,*p8==p9)

// p8==p9? true 使用*p8取到指標p8裡面的值,這時候兩邊都是值型別,只需判斷內容是否相同

}

Go結構體指標

package main import fmt 結構體指標 資料型別 int float bool string array 引用型別 slice map function pointer 建立指標 new 不是nil,空指標 指向了新分配的型別的記憶體空間,裡面儲存的是零值.1.結構體是值傳遞 f...

Go 結構體,結構體指標和方法

結構體 講乙個或多個變數組合到一起形成新的型別,這個型別就是結構體,結構體是值型別 定義結構體和賦值 learn go main.go package main import fmt type people struct func main fmt.printf p peo 0x110040f0 賦...

go語言結構體

go語言陣列可以儲存同一型別的資料 但在結構體中我們可以為不同項定義不同的資料型別 結構體是由一系列具有相同的型別或者不同型別的資料構成的資料集合 1.定義結構體 結構體定義需要使用type和struct語句。struct語句定義乙個新的資料型別,結構體中有乙個或者多個成員。type語句設定了結構體...