go面试练习题(1)

178 阅读1分钟

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]