面试题答案
一键面试实现思路
- 内存管理:
- 使用Go语言的垃圾回收(GC)机制来自动回收不再使用的内存。尽量避免手动管理内存,让GC负责大部分的内存清理工作。
- 合理分配内存,避免在协程中无节制地创建大的对象。可以使用对象池(sync.Pool)来复用对象,减少内存分配和垃圾回收的压力。
- 文件句柄管理:
- 使用
defer
关键字在函数结束时关闭文件句柄,确保文件句柄被正确释放。 - 对于大量并发请求,要注意文件系统的限制,比如同时打开文件的最大数量。可以使用连接池来管理文件句柄,避免超过限制。
- 使用
代码示例
- 使用对象池管理内存:
package main
import (
"fmt"
"sync"
)
// 定义一个可复用的结构体
type MyStruct struct {
Data [1024]byte
}
var pool = sync.Pool{
New: func() interface{} {
return &MyStruct{}
},
}
func handleRequest(wg *sync.WaitGroup) {
defer wg.Done()
// 从对象池获取对象
obj := pool.Get().(*MyStruct)
defer pool.Put(obj)
// 使用obj进行处理
//...
}
func main() {
var wg sync.WaitGroup
numRequests := 100
for i := 0; i < numRequests; i++ {
wg.Add(1)
go handleRequest(&wg)
}
wg.Wait()
}
- 管理文件句柄:
package main
import (
"fmt"
"os"
"sync"
)
func readFile(wg *sync.WaitGroup, filename string) {
defer wg.Done()
file, err := os.Open(filename)
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
// 读取文件内容
//...
}
func main() {
var wg sync.WaitGroup
filenames := []string{"file1.txt", "file2.txt", "file3.txt"}
for _, filename := range filenames {
wg.Add(1)
go readFile(&wg, filename)
}
wg.Wait()
}
在上述代码中,第一个示例使用sync.Pool
来管理内存,第二个示例使用defer
关闭文件句柄,有效避免了资源泄漏。