Go中一切都經過值傳遞,也就是說,一個函數老是獲得值傳遞的副本,老是會分配一個值的副本給函數參數。例如git
驗證github
package main
import (
"fmt"
)
type carListType map[string]string
var carList = make(carListType)
func main() {
age := 10
fmt.Printf("addr is:%p\n", &age) //addr is:0xc000018088
sayAge(age)
setAge(&age)
fmt.Printf("after setAge, age is:%d\n", age) // after setAge, age is:30
carList["honda"] = "civic"
carList["bmw"] = "320li"
fmt.Printf("carList is:%v\n", carList) // carList is:map[bmw:320li honda:civic]
fmt.Printf("carList value is:%p\n", carList) // carList value is:0xc000098000
fmt.Printf("carList addr is:%p\n", &carList) // carList addr is:0x1173648
setCar(carList) // setCar carList addr is:0xc00008e000
fmt.Printf("after setCar carList is:%v\n", carList) // after setCar carList is:map[bmw:520li honda:civic]
}
func sayAge(age int) {
fmt.Printf("addr is:%p\n", &age) //addr is:0xc000018098
fmt.Printf("my age is:%d\n", age) // after setAge, age is:30
}
func setAge(age *int) {
*age = 30
fmt.Printf("age point value is:%p\n", age) //age point value is:0xc000018088
fmt.Printf("age point addr is:%p\n", &age) //age point addr is:0xc00008a020
}
func setCar(carList carListType) {
fmt.Printf("setCar carList value is:%p\n", carList) // setCar carList value is:0xc000094000
fmt.Printf("setCar carList addr is:%p\n", &carList) // setCar carList addr is:0xc00008e020
carList["bmw"] = "520li"
}
複製代碼
pointer 和 value 類型做爲 receiver 有什麼區別?主要在於你是否須要修改receiver,有以下幾個注意事項:golang
package main
import "fmt"
type man struct {
name string
age int
}
type carList map[string]string
func main() {
kangkang := man{"kangkang", 10}
fmt.Printf("name:%s, age:%d\n", kangkang.name, kangkang.age)
// name:kangkang, age:10
kangkang.setName()
kangkang.setAge()
fmt.Printf("name:%s, age:%d\n", kangkang.name, kangkang.age)
// name:kitty, age:10
myCar :=carList{"honda":"red","bmw":"white"}
myCar.addCar("benz","blue")
fmt.Printf("carList: %v\n",myCar)
// carList: map[benz:blue bmw:white honda:red]
// 雖然是value receiver ,依然添加成功了,符合預期
}
// method on pointer
func (m *man) setName() {
m.name = "kitty"
}
// method on value
func (m man) setAge() {
m.age = 30
}
func(m carList) addCar(brand string ,color string) {
m[brand]=color
}
複製代碼