面试题答案
一键面试优化思路
- 预分配内存:根据数据结构的预期大小,提前使用
make
函数分配足够的内存,避免多次动态内存分配。因为Go语言切片底层是数组,动态扩容会导致内存的重新分配和数据的复制。 - 减少嵌套层级:过多的嵌套层级会增加内存管理的复杂性和额外的开销。尽量简化数据结构,减少不必要的嵌套。
- 及时释放内存:对于不再使用的切片,将其设置为
nil
,使垃圾回收器能够及时回收内存。
具体场景及代码示例
假设我们有一个多层嵌套的切片结构,用来表示一个公司的部门和员工信息。
package main
import (
"fmt"
)
// 员工结构体
type Employee struct {
Name string
Age int
}
// 部门结构体
type Department struct {
Name string
Employees []Employee
}
func main() {
// 预分配足够的部门数量
departments := make([]Department, 0, 10)
// 模拟添加部门
for i := 0; i < 5; i++ {
// 预分配每个部门的员工数量
employees := make([]Employee, 0, 50)
for j := 0; j < 20; j++ {
employee := Employee{
Name: fmt.Sprintf("Employee%d-%d", i, j),
Age: 20 + j,
}
employees = append(employees, employee)
}
department := Department{
Name: fmt.Sprintf("Department%d", i),
Employees: employees,
}
departments = append(departments, department)
}
// 使用完后及时释放内存
departments = nil
}
在上述代码中:
- 首先对最外层的
departments
切片进行预分配,预计会有10个部门。 - 对于每个部门的
Employees
切片也进行预分配,预计每个部门有50个员工。这样可以避免在append
操作时频繁的内存重新分配。 - 使用完数据后,将
departments
设置为nil
,让垃圾回收器回收相关内存。