golang 是值传递
在 Golang 中所有函数参数传递都是值拷贝,传指针只是拷贝了一份指针副本,同时指向原对象。
一般情况下,需要改变原始对象值、传递大的结构体,传指针是最合适的,因为传一个内存地址的开销很小。反之,如果变量不可变更、map 或 slice 应该选择传值方式。
package main
import (
"encoding/json"
"fmt"
)
type Girl struct {
Name string `json:"name"`
DressColor string `json:"dress_color"`
}
func (g *Girl) SetColor(color string) {
fmt.Printf("g1: %p\n", &g) // 取指针的地址
g.DressColor = color
}
func (g *Girl) GetJson() string {
data, _ := json.Marshal(&g)
return string(data)
}
func main() {
g := &Girl{Name: "yueyue"}
fmt.Printf("g0: %p\n", &g) // 取指针的地址
g.SetColor("white")
fmt.Println(g.GetJson())
}
g0: 0xc42000c028\
g1: 0xc42000c038\
{"name":"yueyue","dress_color":"white"}
我们还可以看下实际上传递的依然是值拷贝,只不过是指针拷贝了一份副本,两个指针指向相同的 g 对象而已