1. 避免不必要的复制
- 原理:Go语言中,结构体赋值是值传递,若结构体较大,复制会消耗较多资源。使用指针传递可避免这种大规模复制。
- 代码示例:
package main
import "fmt"
type BigStruct struct {
Data [1000]int
// 其他字段
}
func PassByValue(s BigStruct) {
// 操作s,这里s是原结构体的副本
}
func PassByPointer(s *BigStruct) {
// 操作*s,直接操作原结构体
}
func main() {
var big BigStruct
PassByPointer(&big)
}
2. 提前分配内存
- 原理:在使用切片等动态数据结构时,提前预估所需容量,可减少内存重新分配的次数,提升性能。
- 代码示例:
package main
import "fmt"
func main() {
// 不提前分配内存
var s1 []int
for i := 0; i < 1000; i++ {
s1 = append(s1, i)
}
// 提前分配内存
s2 := make([]int, 0, 1000)
for i := 0; i < 1000; i++ {
s2 = append(s2, i)
}
}
3. 减少嵌套结构体的深度
- 原理:嵌套结构体深度越深,访问和赋值时需要的层次越多,开销越大。尽量扁平化结构体可提升性能。
- 代码示例:
package main
import "fmt"
// 深度嵌套结构体
type Inner struct {
Value int
}
type Middle struct {
Inner Inner
}
type Outer struct {
Middle Middle
}
// 扁平化结构体
type Flat struct {
Value int
}
func main() {
var outer Outer
outer.Middle.Inner.Value = 10
var flat Flat
flat.Value = 10
}
4. 使用对象池
- 原理:对于频繁创建和销毁的结构体对象,使用对象池可避免重复的内存分配和垃圾回收开销。
- 代码示例:
package main
import (
"fmt"
"sync"
)
type Reusable struct {
// 结构体字段
}
var pool = sync.Pool{
New: func() interface{} {
return &Reusable{}
},
}
func main() {
// 从对象池获取对象
obj := pool.Get().(*Reusable)
// 使用obj
// 使用完放回对象池
pool.Put(obj)
}