meiyoumingzi6
2022-01-13 14:23:42 +08:00
0. 先解释 Golang 的值传递, 注意任何情况下都是值传递, 但是这个值可能是一个地址, 举个例子, 某东有卖螃蟹的, 但是很多是卖的螃蟹券, 我买了螃蟹券, 然后送了人, 那是不是可以说买了螃蟹送礼, 可以, 不过最终需要那个人自提而已
1. 有没有办法证明 Golang 是值传递,
```golang
package main
import "fmt"
type demo struct{}
func test(arg interface{}) {
fmt.Printf("in func test %p\n", &arg)
}
func main() {
d := demo{}
fmt.Printf("out of test %p\n", &d)
test(d)
fmt.Printf("out of test %p\n", &d)
test(&d)
s := []int{1,2,}
fmt.Printf("out of test %p\n", s)
test(s)
m := map[string]int{"1":1}
fmt.Printf("out of test %p\n", m)
test(m)
}
/*
out of test 0x116ce80
in func test 0xc000010230
out of test 0x116ce80
in func test 0xc000010240
out of test 0xc0000160c0
in func test 0xc000010250
out of test 0xc000074180
in func test 0xc000010260
*/
```
2. slice/map 是引用类型, 害, 你就把他当个螃蟹券
3. 题中两个区别
i). 开销不同, a 中值需要赋值一次地址, 开销很小, b 中需要复制一次结构体
ii). 虽然看起来效果一样, 但是 b 中的 a 跟已经跟外面的 a 不是一个东西了, 因为有一次拷贝, 完完全全就是两个东西