在學習 go 語言結構時,遇到這樣乙個問題:
對於此疑問,我做了如下實驗:
type person struct
// newperson 返回乙個結構體變數
func
newperson
(name string
,age int
) person
// 在建立結構體時,返回其記憶體位址
fmt.
printf
("%p\n"
,&ret)
return ret
}// newperson2 返回乙個結構體指標
func
newperson2
(name string
,age int
)*person
// 在建立結構體指標時,返回他儲存的結構體的位址
fmt.
printf
("%p\n"
,ret)
return ret
}func
main()
f:\go_project\my_go\student_manager>
go run struck_poniter.
go// 以下是呼叫建構函式newperson時,返回的結構體變數的位址
0xc000096460
// 以下是呼叫建構函式newperson時,建立的結構體例項的位址
0xc000096440
// 以下是呼叫建構函式newperson2時,返回的結構體指標的位址
0xc0000964a0
// 以下是呼叫建構函式newperson2時,建立的結構體指標的位址
0xc0000964a0
由此可得出結論
使用建構函式建立 結構例項時:
兩點:1.go
語言中函式的傳參是值的傳遞,2.go
語言中的結構體
是值型別的
如果建構函式返回的是乙個結構體變數,在建立結構體例項時,是將建構函式中生成的結構體變數的值傳給對應新建立的結構體變數,在上例字中對應的就是p1
,此時記憶體中就有值相同的兩份結構體
如果建構函式返回的是乙個結構體指標(newperson2
函式),建構函式最後是將該函式建立的結構體所對應的位址傳給了我們建立的例項p2
,注意,此時p2
是乙個結構體指標
,這種建立方式,記憶體中只有乙份結構體,對記憶體的消耗小
試想,如果我們的結構體中含有很多個成員,並且在我們的程式中,通過返回值是結構體變數的建構函式建立了很多個結構體,此時建構函式會生成對應的結構體,並分別將至複製給對乙個你的結構體例項,這樣會產生很多不必要的記憶體開銷,此時如果使用返回值是結構體指標的建構函式來進行結構體例項的建立,就會避免
以上就是我在學習go
時,對go 自建建構函式,返回值是結構體變數,或者結構體指標的原因的乙個理解
Go結構體指標
package main import fmt 結構體指標 資料型別 int float bool string array 引用型別 slice map function pointer 建立指標 new 不是nil,空指標 指向了新分配的型別的記憶體空間,裡面儲存的是零值.1.結構體是值傳遞 f...
go語言 結構體及結構體指標
結構體 struct 是由一系列具有相同型別或不同型別的資料構成的資料集合,也叫結構。可以理解為其他程式語言中的類 結構體既可以定義在函式內,也可以定義在函式外,函式外為全域性結構體可以跨包訪問 前提是結構體首字母大寫 結構體變數是值型別,可以使用fmt.printf p 結構體變數 來檢視其記憶體...
Go 結構體,結構體指標和方法
結構體 講乙個或多個變數組合到一起形成新的型別,這個型別就是結構體,結構體是值型別 定義結構體和賦值 learn go main.go package main import fmt type people struct func main fmt.printf p peo 0x110040f0 賦...