2 回答

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個(gè)贊
慣用的方法是做一個(gè)簡(jiǎn)單的賦值,讓編譯器copy在執(zhí)行逃逸分析后在堆上分配:
original := Data{...}
copy := original
return © // Or call some function with © as a parameter
在注意到它c(diǎn)opy被引用使用并且超過(guò)堆棧時(shí),Go 將自動(dòng)在堆上而不是在堆棧上分配它(當(dāng)然,復(fù)制仍然正確完成)
我們實(shí)際上不再關(guān)心堆,而是讓編譯器根據(jù)逃逸分析在需要時(shí)分配它。我們唯一關(guān)心的是副本本身。
您可以在godbolt上看到一個(gè)示例:
給出以下簡(jiǎn)單代碼:
func main() {
type Data struct{
foo string
}
original := Data{"hi"}
copy := original
copyPtr := ©
fmt.Println(copyPtr)
}
Go 會(huì)自動(dòng)copy在堆上分配:
call runtime.newobject(SB)
我們還可以通過(guò)在編譯時(shí)傳遞額外的標(biāo)志來(lái)顯示轉(zhuǎn)義和內(nèi)聯(lián)決策,從而看到這一點(diǎn):
$ go build -gcflags '-m' .
...
./main.go:11:2: moved to heap: copy
...
注意:復(fù)制是一個(gè)內(nèi)置函數(shù)。避免重復(fù)使用名稱(chēng)可能是個(gè)好主意(它工作得很好,但這不是很好的做法)。

TA貢獻(xiàn)1788條經(jīng)驗(yàn) 獲得超4個(gè)贊
Golang 中的結(jié)構(gòu)變量可以簡(jiǎn)單地通過(guò)賦值語(yǔ)句復(fù)制到另一個(gè):
https://play.golang.org/p/4Zcbxhy5UoB
package main
import (
"fmt"
)
type User struct {
name string
}
func main() {
u1 := User{name: "foo"}
u2 := u1
u2.name = "bar"
fmt.Println("u1: ", u1)
fmt.Println("u2: ", u2)
}
輸出:
u1: {foo}
u2: {bar}
- 2 回答
- 0 關(guān)注
- 128 瀏覽
添加回答
舉報(bào)