Golang实现URL列表检查的方法与技巧

Golang实现URL列表检查的方法与技巧 你好,

我是Go语言和编程的新手,但我正在尝试编写一个小程序来检查URL是否有效。我的代码在遇到没有响应的URL时会生成错误并停止。请问有人可以建议如何打印错误并继续执行吗?

我遇到的错误是:

异常发生:panic “运行时错误:无效的内存地址或空指针解引用” 堆栈: 4 0x00000000011298bd 位于 main.checkUrl 位于 c:/Users/graha/Golang/url_tester/url.go:1228 5 0x000000000112996e 位于 main.main 位于 c:/Users/graha/Golang/url_tester/url.go:1244

import (
	"fmt"
	"net/http"
)

var url = []string{
	"https://www.example.com",
	"https://www.thisurldoesnotexist23432.com",
}

func checkUrl(url []string) {
	for _, s := range url {
		resp, err := http.Get(s)
		fmt.Println(resp)
		if err != nil {
			fmt.Println(err)
		}
		resp.Body.Close()
	}

}

func main() {
	checkUrl(url)
}

更多关于Golang实现URL列表检查的方法与技巧的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

感谢您的帮助。

更多关于Golang实现URL列表检查的方法与技巧的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在访问响应之前,请检查错误是否为非空。

package main

import (
	"fmt"
	"net/http"
)

var url = []string{
	"https://www.example.com",
	"https://www.thisurldoesnotexist23432.com",
}

func checkUrl(url []string) {
	for _, s := range url {
		resp, err := http.Get(s)
		if err != nil {
			fmt.Println(err)
		} else {
			fmt.Println(resp)
			resp.Body.Close()
		}
	}
}

func main() {
	checkUrl(url)
}
import (
    "fmt"
    "net/http"
    "time"
)

var url = []string{
    "https://www.example.com",
    "https://www.thisurldoesnotexist23432.com",
}

func checkUrl(urls []string) {
    client := &http.Client{
        Timeout: 10 * time.Second, // 设置超时避免长时间等待
    }
    
    for _, s := range urls {
        resp, err := client.Get(s)
        if err != nil {
            fmt.Printf("URL: %s, Error: %v\n", s, err)
            continue // 继续下一个URL
        }
        
        defer resp.Body.Close()
        fmt.Printf("URL: %s, Status: %s\n", s, resp.Status)
    }
}

func main() {
    checkUrl(url)
}
// 使用goroutine并发检查多个URL
func checkUrlConcurrent(urls []string) {
    client := &http.Client{
        Timeout: 10 * time.Second,
    }
    
    for _, s := range urls {
        go func(url string) {
            resp, err := client.Get(url)
            if err != nil {
                fmt.Printf("URL: %s, Error: %v\n", url, err)
                return
            }
            
            defer resp.Body.Close()
            fmt.Printf("URL: %s, Status: %s\n", url, resp.Status)
        }(s)
    }
    
    time.Sleep(11 * time.Second) // 等待所有goroutine完成
}
// 使用带缓冲的channel控制并发数
func checkUrlWithWorkerPool(urls []string, maxWorkers int) {
    client := &http.Client{
        Timeout: 10 * time.Second,
    }
    
    urlsChan := make(chan string, len(urls))
    results := make(chan string, len(urls))
    
    // 启动worker
    for i := 0; i < maxWorkers; i++ {
        go func() {
            for url := range urlsChan {
                resp, err := client.Get(url)
                if err != nil {
                    results <- fmt.Sprintf("URL: %s, Error: %v", url, err)
                    continue
                }
                
                resp.Body.Close()
                results <- fmt.Sprintf("URL: %s, Status: %s", url, resp.Status)
            }
        }()
    }
    
    // 发送URL到channel
    for _, url := range urls {
        urlsChan <- url
    }
    close(urlsChan)
    
    // 收集结果
    for i := 0; i < len(urls); i++ {
        fmt.Println(<-results)
    }
}
回到顶部