面试题答案
一键面试-
数组作为参数传递给函数时的情况: 在Go语言中,数组作为参数传递给函数时,传递的是数组的副本,即整个数组会被复制一份传递给函数。这意味着如果数组很大,会有较大的性能损耗,因为复制大量数据需要消耗时间和内存。
示例代码:
package main import "fmt" func modifyArray(arr [3]int) { arr[0] = 100 } func main() { original := [3]int{1, 2, 3} modifyArray(original) fmt.Println(original) }
在上述代码中,
modifyArray
函数接收一个数组参数,在函数内部对数组的修改不会影响到原始数组,因为传递的是副本。 -
避免性能损耗的方法:
- 使用切片:切片是对数组的一个引用,它本身只包含一个指向底层数组的指针、长度和容量信息。当切片作为参数传递时,传递的只是这些少量信息,而不是整个底层数组,从而避免了大量数据的复制。
示例代码:
package main import "fmt" func modifySlice(slice []int) { slice[0] = 100 } func main() { original := []int{1, 2, 3} modifySlice(original) fmt.Println(original) }
在这个例子中,
modifySlice
函数接收一个切片参数,对切片的修改会影响到原始切片,因为它们指向同一个底层数组,并且切片作为参数传递时不会复制大量数据,适用于处理大数组的情况。- 使用指针:也可以传递数组指针,这样函数内部操作的是原始数组,而不是副本。
示例代码:
package main import "fmt" func modifyArrayPtr(arr *[3]int) { (*arr)[0] = 100 } func main() { original := [3]int{1, 2, 3} modifyArrayPtr(&original) fmt.Println(original) }
这里
modifyArrayPtr
函数接收一个数组指针,通过指针可以直接修改原始数组,避免了数组副本的创建,减少了内存复制开销。