面试题答案
一键面试1. 接口定义
type Reader interface {
Read() ([]byte, error)
}
2. 实现 Reader
接口(以文件读取为例)
package main
import (
"fmt"
"os"
)
type FileReader struct {
filePath string
}
func (fr FileReader) Read() ([]byte, error) {
data, err := os.ReadFile(fr.filePath)
if err != nil {
return nil, err
}
return data, nil
}
3. 边界控制 - 错误处理
在调用 Read
方法时,需要对返回的错误进行适当处理:
func main() {
fr := FileReader{filePath: "nonexistentfile.txt"}
data, err := fr.Read()
if err != nil {
if os.IsNotExist(err) {
fmt.Println("文件不存在")
} else {
fmt.Printf("读取文件时发生其他错误: %v\n", err)
}
return
}
fmt.Printf("读取到的数据: %s\n", data)
}
4. 边界控制 - 资源管理
如果是网络连接等需要手动管理资源的数据源,在 Read
方法中需要确保资源正确关闭。例如,使用 net.Conn
进行网络读取:
package main
import (
"fmt"
"net"
)
type NetworkReader struct {
addr string
}
func (nr NetworkReader) Read() ([]byte, error) {
conn, err := net.Dial("tcp", nr.addr)
if err != nil {
return nil, err
}
defer conn.Close()
buffer := make([]byte, 1024)
n, err := conn.Read(buffer)
if err != nil {
return nil, err
}
return buffer[:n], nil
}
在调用这个 NetworkReader
的 Read
方法时,conn.Close()
会在函数返回前确保连接关闭,避免资源泄漏。
总结来说,在实现 Read
方法时,要考虑到各种可能的错误情况,并在调用 Read
方法时,对错误进行恰当的分类处理,同时对于需要管理的资源,使用 defer
语句确保资源在函数结束时正确释放,以此来保证程序的健壮性。