2 回答

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

TA貢獻1788條經驗 獲得超4個贊
Golang 中的結構變量可以簡單地通過賦值語句復制到另一個:
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 關注
- 122 瀏覽
添加回答
舉報