面试题答案
一键面试设计思路
- 使用
goroutine
和channel
:利用goroutine
实现异步执行process
函数,通过channel
来传递结果和错误信息。 - 资源管理:在
process
函数内部使用defer
关键字来确保资源在函数结束时(无论正常结束还是发生错误)被释放。 - 异步回调处理:在
goroutine
外部通过监听channel
来获取结果或错误,并进行相应处理。
代码示例
package main
import (
"fmt"
"io"
"os"
)
// process 模拟一个可能返回错误并申请资源的函数
func process() (string, error) {
// 打开文件模拟申请资源
file, err := os.Open("example.txt")
if err != nil {
return "", err
}
defer file.Close() // 使用defer确保文件在函数结束时关闭
data, err := io.ReadAll(file)
if err != nil {
return "", err
}
return string(data), nil
}
func main() {
resultCh := make(chan string, 1)
errCh := make(chan error, 1)
go func() {
result, err := process()
if err != nil {
errCh <- err
return
}
resultCh <- result
}()
select {
case result := <-resultCh:
fmt.Println("处理结果:", result)
case err := <-errCh:
fmt.Println("发生错误:", err)
}
}
在上述代码中:
process
函数打开一个文件并读取其内容,使用defer
确保文件在函数结束时关闭。main
函数创建两个channel
,resultCh
用于传递处理结果,errCh
用于传递错误。- 通过
goroutine
异步执行process
函数,根据执行结果向不同的channel
发送数据。 main
函数通过select
语句监听这两个channel
,以优雅地处理结果和错误。