MST

星途 面试题库

面试题:Go语言中不同类型赋值对性能影响的场景分析

在Go语言中,有一个结构体 `type Person struct { Name string; Age int }`,现在有两种赋值方式:方式一,`p1 := Person{Name: "John", Age: 30}` 然后 `p2 := p1`;方式二,`p1 := &Person{Name: "John", Age: 30}` 然后 `p2 := p1`。请分析这两种方式在性能上可能存在的差异,并说明原因。
48.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 方式一
    • 赋值过程:首先创建了一个 Person 结构体实例 p1,然后通过值拷贝的方式将 p1 赋值给 p2
    • 性能分析:当结构体 Person 比较小(如当前只有 Name 字符串和 Age 整数)时,值拷贝的开销相对较小。因为只是简单地将内存中的数据从一处复制到另一处。但是,如果 Person 结构体变得复杂,比如包含大量的字段或者大的数组、切片等,值拷贝会导致较大的性能开销,因为需要复制整个结构体的所有数据。
  2. 方式二
    • 赋值过程:首先创建了一个指向 Person 结构体实例的指针 p1,然后将这个指针 p1 赋值给 p2
    • 性能分析:指针赋值只是复制一个指针(在64位系统上通常是8字节,在32位系统上通常是4字节),无论结构体 Person 本身有多大,指针赋值的开销基本固定且非常小。

总结

  • Person 结构体较小时,两种方式性能差异不大。
  • Person 结构体较大时,方式二(使用指针赋值)性能更优,因为避免了大量数据的拷贝。