面试题答案
一键面试以下是使用Go语言实现的代码示例及注释:
package main
import (
"fmt"
"time"
)
func main() {
// 创建只读Channel
readOnlyCh := make(chan int, 1)
// 创建只写Channel
writeOnlyCh := make(chan int, 1)
// 模拟向只写Channel写入数据
go func() {
time.Sleep(2 * time.Second) // 模拟一些延迟操作
writeOnlyCh <- 42
}()
// 使用select语句进行多路复用
select {
case data := <-readOnlyCh:
fmt.Printf("从只读Channel读取到数据: %d\n", data)
case writeOnlyCh <- 10:
fmt.Println("成功向只写Channel写入数据")
case <-time.After(3 * time.Second):
fmt.Println("操作超时,未从任何Channel获取到数据或写入成功")
// 这里可以进行资源释放相关操作,例如关闭一些临时文件描述符等
}
// 关闭Channel以释放资源
close(readOnlyCh)
close(writeOnlyCh)
}
代码解释
- 创建Channel:
readOnlyCh := make(chan int, 1)
创建了一个带缓冲的只读Channel,类型为int
,缓冲大小为1。writeOnlyCh := make(chan int, 1)
创建了一个带缓冲的只写Channel,类型为int
,缓冲大小为1。
- 模拟写入操作:
- 使用一个匿名goroutine模拟向
writeOnlyCh
写入数据,这里通过time.Sleep
模拟了一些延迟操作,2秒后向writeOnlyCh
写入数据42
。
- 使用一个匿名goroutine模拟向
- select语句多路复用:
select
语句可以同时监听多个Channel的操作。case data := <-readOnlyCh:
监听readOnlyCh
,如果有数据可读,则将数据赋值给data
并执行相应的打印语句。case writeOnlyCh <- 10:
监听writeOnlyCh
,如果writeOnlyCh
有空间写入数据,则写入10
并执行相应的打印语句。case <-time.After(3 * time.Second):
设置一个3秒的超时,如果在3秒内没有从任何Channel获取到数据或写入成功,则执行相应的打印语句,并可以在该分支内进行资源释放操作(这里仅为示例,实际中可根据具体资源进行释放)。
- 关闭Channel:
close(readOnlyCh)
和close(writeOnlyCh)
关闭创建的Channel,以释放相关资源。在Go语言中,关闭Channel不仅可以防止数据竞争,还能通知其他goroutine不再有数据发送或接收,从而进行相应的资源清理。