go面试练习题(1)
下面代码输出什么
func test1(x int) (func(), func()) {
return func() {
fmt.Println(x)
x += 10
}, func() {
fmt.Println(x)
}
}
func test2(x []int) (func(), func()) {
return func() {
fmt.Println(x)
x[0] = 0
}, func() {
fmt.Println(x)
}
}
func test3(x [3]int) (func(), func()) {
return func() {
fmt.Println(x)
x[0] = 0
}, func() {
fmt.Println(x)
}
}
func main() {
cc := 10
dd :=[]int{1,2,3}
a,b := test1(cc)
a()
b()
fmt.Println(c)
c,d := test2(dd)
c()
d()
fmt.Println(dd)
ee := [3]{4,5,6}
e,f := test3(ee)
e()
f()
fmt.Println(ee)
}
结果
a()==> 10
b()==> 20
cc ==>10
c() ==> [1 2 3]
d() ==> [0 2 3]
dd ==>[0 2 3]
e()==>[4 5 6]
f()==>[0 5 6]
ee ==>[4 5 6]
总结
数组和整型的是值类型,传参到函数中时,会将copy一份他们的副本进去,副本是新开辟的内存地址,在函数内部修改后,不会影响原来的值;而切片slice类型是引用类型,传参的是指针,所以函数内部改变后,原值也会发生改变
补充:与defer的结合考察
func test(x [3]int) (func(), func()) {
defer func() {x[2]=1}()
return func() {
fmt.Printf("%T,%v\n",x,x)
x[0] = 0
}, func() {
fmt.Printf("%T,%v\n",x,x)
}
}
func main() {
var c =[3]int{1,2,3}
a, b := test(c)
a()
b()
fmt.Printf("%T,%v\n",c,c)
}
输出
[3]int,[1 2 1]
[3]int,[0 2 1]
[3]int,[1 2 3]