Check if a URL is reachable using Golang

If you only want see if a URL is reachable you could use net.DialTimeout. Like this:

timeout := 1 * time.Second
conn, err := net.DialTimeout("tcp","mysyte:myport", timeout)
if err != nil {
    log.Println("Site unreachable, error: ", err)
}

If you want to check if a Web server answers on a certain URL, you can invoke an HTTP GET request using net/http. You will get a timeout if the server doesn't response at all. You might also check the response status.

resp, err := http.Get("http://google.com/")
if err != nil {
    print(err.Error())
} else {
    print(string(resp.StatusCode) + resp.Status)
}

You can change the default timeout by initializing a http.Client.

timeout := time.Duration(1 * time.Second)
client := http.Client{
    Timeout: timeout,
}
resp, err := client.Get("http://google.com")

Bonus: Go generally does not rely on exceptions and the built in libraries generally do not panic, but return an error as a second value. See Why does Go not have exceptions?. You can assume that something very bad happened if your call to a native function panics.


You can make a HEAD request:

package main
import "net/http"

func head(s string) bool {
   r, e := http.Head(s)
   return e == nil && r.StatusCode == 200
}

func main() {
   b := head("https://stackoverflow.com")
   println(b)
}

https://golang.org/pkg/net/http#Head


If you don't mind the port, use http.Get(web):

package main

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

func main() {
    web := os.Args[1]
    fmt.Println(webIsReachable(web))
}

func webIsReachable(web string) bool {
    response, errors := http.Get(web)

    if errors != nil {
        _, netErrors := http.Get("https://www.google.com")

        if netErrors != nil {
            fmt.Fprintf(os.Stderr, "no internet\n")
            os.Exit(1)
        }

        return false
    }

    if response.StatusCode == 200 {
        return true
    }

    return false
}