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 回复
在访问响应之前,请检查错误是否为非空。
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)
}
}


