MST

星途 面试题库

面试题:Go中如何实现异步网络请求并处理响应

在Go语言中,假设你需要同时发起多个网络请求(例如HTTP请求),并且在所有请求完成后处理它们的响应结果。请编写代码示例展示如何利用Go的特性实现这一过程,包括使用`goroutine`和`channel`。
17.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "net/http"
)

func fetchURL(url string, resultChan chan string) {
    resp, err := http.Get(url)
    if err != nil {
        resultChan <- fmt.Sprintf("Error fetching %s: %v", url, err)
        return
    }
    defer resp.Body.Close()

    resultChan <- fmt.Sprintf("Successfully fetched %s", url)
}

func main() {
    urls := []string{
        "http://example.com",
        "http://google.com",
        "http://github.com",
    }

    resultChan := make(chan string)
    defer close(resultChan)

    for _, url := range urls {
        go fetchURL(url, resultChan)
    }

    results := make([]string, len(urls))
    for i := 0; i < len(urls); i++ {
        results[i] = <-resultChan
    }

    for _, result := range results {
        fmt.Println(result)
    }
}
  1. fetchURL 函数
    • 该函数接收一个URL和一个 resultChan
    • 它使用 http.Get 发起HTTP GET请求。如果请求出错,将错误信息发送到 resultChan
    • 如果请求成功,将成功信息发送到 resultChan
  2. main 函数
    • 定义一个URL切片。
    • 创建一个 resultChan 用于接收请求结果。
    • 使用 go 关键字启动多个 goroutine 来并发执行 fetchURL 函数,每个 goroutine 处理一个URL。
    • 使用一个循环从 resultChan 中接收结果,并存储到 results 切片中。
    • 最后,遍历 results 切片并打印每个结果。