package main import ( "net/http" "strings" "golang.org/x/net/html" ) var cache = make(map[string]string) func findTitle(n *html.Node) (s string) { if n.Type == html.ElementNode && n.Data == "title" { for c := n.FirstChild; c != nil; c = c.NextSibling { s += c.Data } return strings.TrimSpace(s) } for c := n.FirstChild; c != nil; c = c.NextSibling { if t := findTitle(c); t != "" { return t } } return "" } func FetchTitle(url string) (string, error) { if title, ok := cache[url]; ok { return title, nil } resp, err := http.Get(url) if err != nil { return "", err } defer resp.Body.Close() doc, err := html.Parse(resp.Body) if err != nil { return "", err } title := findTitle(doc) cache[url] = title return title, nil }