go并发模式 错误处理

复制代码
package main

import (
    "fmt"
    "net/http"
)

type Results struct {
    Error    error
    Response *http.Response
}

func main() {
    checkStatus := func(done <-chan interface{}, urls ...string) <-chan Results {
        results := make(chan Results)
        go func() {
            defer close(results)
            for _, url := range urls {
                resp, err := http.Get(url)
                result := Results{err, resp}
                select {
                case <-done:
                    return
                case results <- result:
                }
            }
        }()
        return results
    }

    urls := []string{"http://www.google.com", "http://www.bing.com", "http://www.amazon.com", "http://qq.com", "http://facebook.com"}
    done := make(chan interface{})
    defer close(done)
    errorCount := 0
    for res := range checkStatus(done, urls...) {
        if res.Error != nil {
            errorCount++
            if errorCount >= 2 {
                fmt.Println("too many errors,breaking!")
                break
            }
            fmt.Printf("error:%v\n", res.Error)
            continue
        }
        fmt.Printf("response status:%v\n", res.Response.Status)
    }
}
复制代码

 【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/facetwitter/p/18293856

posted @   saneim  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示