MST

星途 面试题库

面试题:Go select语句与超时机制及默认分支的协同应用

在Go语言中,结合select语句实现一个带有超时机制的网络请求模拟。要求使用`time.After`函数设置超时时间,并且使用select语句的默认分支处理请求过程中可能出现的其他情况(如通道关闭等异常)。请详细说明实现思路,并给出具体代码。
20.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 使用http.Get发起网络请求,该操作会返回一个Response和可能的错误。
  2. 使用time.After函数创建一个定时器通道,在指定的超时时间后发送一个值。
  3. 使用select语句监听三个通道:
    • 网络请求完成的通道,用于接收网络请求的结果。
    • 定时器通道,用于处理超时情况。
    • 默认分支,用于处理其他异常情况,如通道关闭等。

代码示例

package main

import (
    "fmt"
    "net/http"
    "time"
)

func main() {
    url := "http://example.com"
    var result *http.Response
    var err error

    // 创建一个用于接收网络请求结果的通道
    responseCh := make(chan *http.Response, 1)
    errorCh := make(chan error, 1)

    // 发起网络请求,并将结果发送到相应的通道
    go func() {
        result, err = http.Get(url)
        if err != nil {
            errorCh <- err
        } else {
            responseCh <- result
        }
    }()

    // 设置超时时间为5秒
    timeout := time.After(5 * time.Second)

    select {
    case result = <-responseCh:
        defer result.Body.Close()
        fmt.Println("请求成功:", result.StatusCode)
    case err = <-errorCh:
        fmt.Println("请求出错:", err)
    case <-timeout:
        fmt.Println("请求超时")
    default:
        fmt.Println("处理其他异常情况(如通道关闭等)")
    }
}