MST

星途 面试题库

面试题:Go实参到形参传递的性能考量

假设你有一个大型的结构体,在Go语言函数调用时将其作为参数传递。从性能角度分析,使用值传递和使用指针传递这个结构体各有什么优缺点?如果结构体中有一个字段是大切片,在传递时又该如何选择传递方式以优化性能?
25.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

值传递

  • 优点
    • 代码更清晰直观,因为函数接收的是结构体的副本,对副本的操作不会影响原结构体,在一定程度上增强了程序的可维护性和安全性。
    • 无需担心空指针异常,因为传递的是值,而不是指针。
  • 缺点
    • 性能开销大,当结构体较大时,会占用较多内存空间来复制结构体,传递和复制的过程也会消耗时间,尤其是在频繁调用函数的场景下,性能影响更为明显。

指针传递

  • 优点
    • 性能好,因为传递的只是一个指针(在64位系统上通常是8字节),相比传递整个大型结构体,内存占用和传递时间都大大减少,在处理大型结构体时效率更高。
    • 可以在函数内部修改原结构体的值,适用于需要对传入的结构体进行修改的场景。
  • 缺点
    • 增加了代码的复杂性,需要注意指针的合法性,例如避免空指针引用,否则可能导致程序崩溃。
    • 由于函数可以修改原结构体,可能会带来一些不可预期的副作用,降低了代码的可维护性和可预测性。

结构体中有大切片的情况

应选择指针传递。因为切片本身虽然是一个轻量级的数据结构(包含指向底层数组的指针、长度和容量),但它所指向的底层数组可能非常大。如果使用值传递结构体,会复制整个切片(包括底层数组的指针、长度和容量),即使切片本身复制开销不大,但底层大数组可能占用大量内存,复制开销巨大。而使用指针传递结构体,就避免了大数组的复制,只传递一个指针,能显著提升性能。