使用 URL Shortener API 时,runtime error: invalid memory address or nil pointer dereference

1、参考网址:https://github.com/unknwon/the-way-to-go_ZH_CN/blob/master/eBook/09.11.md 。通过浏览 http://localhost:8080/ 的页面来测试。在 Shorten this 中输入:http://www.destandaard.be ,点击:Give me the short URL。一直加载中,直至超时。如图1

图1

2、查看终端输出,报错:runtime error: invalid memory address or nil pointer dereference。如图2

图2

PS E:\wwwroot\go\the-way-to-go\package> go run urlshortener.go
2020/09/07 19:52:23 http: panic serving 127.0.0.1:55417: runtime error: invalid memory address or nil pointer dereference
goroutine 34 [running]:
net/http.(*conn).serve.func1(0xc000282000)
        c:/go/src/net/http/server.go:1767 +0x140
panic(0x957240, 0xe59f20)
        c:/go/src/runtime/panic.go:679 +0x1c0
main.short(0xac7dc0, 0xc0002ac1c0, 0xc00029a100)
        E:/wwwroot/go/the-way-to-go/package/urlshortener.go:42 +0x18d
net/http.HandlerFunc.ServeHTTP(0xa2e470, 0xac7dc0, 0xc0002ac1c0, 0xc00029a100)
        c:/go/src/net/http/server.go:2007 +0x4b
net/http.(*ServeMux).ServeHTTP(0xe6f740, 0xac7dc0, 0xc0002ac1c0, 0xc00029a100)
        c:/go/src/net/http/server.go:2387 +0x1c4
net/http.serverHandler.ServeHTTP(0xc000264000, 0xac7dc0, 0xc0002ac1c0, 0xc00029a100)
        c:/go/src/net/http/server.go:2802 +0xab
net/http.(*conn).serve(0xc000282000, 0xac8b00, 0xc00025c080)
        c:/go/src/net/http/server.go:1890 +0x87c
created by net/http.(*Server).Serve
        c:/go/src/net/http/server.go:2927 +0x395
2020/09/07 19:52:29 http: panic serving 127.0.0.1:55418: runtime error: invalid memory address or nil pointer dereference
goroutine 20 [running]:
net/http.(*conn).serve.func1(0xc0002b4000)
        c:/go/src/net/http/server.go:1767 +0x140
panic(0x957240, 0xe59f20)
        c:/go/src/runtime/panic.go:679 +0x1c0
main.short(0xac7dc0, 0xc00030c000, 0xc0002b0100)
        E:/wwwroot/go/the-way-to-go/package/urlshortener.go:42 +0x18d
net/http.HandlerFunc.ServeHTTP(0xa2e470, 0xac7dc0, 0xc00030c000, 0xc0002b0100)
        c:/go/src/net/http/server.go:2007 +0x4b
net/http.(*ServeMux).ServeHTTP(0xe6f740, 0xac7dc0, 0xc00030c000, 0xc0002b0100)
        c:/go/src/net/http/server.go:2387 +0x1c4
net/http.serverHandler.ServeHTTP(0xc000264000, 0xac7dc0, 0xc00030c000, 0xc0002b0100)
        c:/go/src/net/http/server.go:2802 +0xab
net/http.(*conn).serve(0xc0002b4000, 0xac8b00, 0xc000266080)
        c:/go/src/net/http/server.go:1890 +0x87c
created by net/http.(*Server).Serve
        c:/go/src/net/http/server.go:2927 +0x395
2020/09/07 19:52:40 http: panic serving 127.0.0.1:55438: runtime error: invalid memory address or nil pointer dereference
goroutine 14 [running]:
net/http.(*conn).serve.func1(0xc00011a820)
        c:/go/src/net/http/server.go:1767 +0x140
panic(0x957240, 0xe59f20)
        c:/go/src/runtime/panic.go:679 +0x1c0
main.short(0xac7dc0, 0xc0002640e0, 0xc000244200)
        E:/wwwroot/go/the-way-to-go/package/urlshortener.go:42 +0x18d
net/http.HandlerFunc.ServeHTTP(0xa2e470, 0xac7dc0, 0xc0002640e0, 0xc000244200)
        c:/go/src/net/http/server.go:2007 +0x4b
net/http.(*ServeMux).ServeHTTP(0xe6f740, 0xac7dc0, 0xc0002640e0, 0xc000244200)
        c:/go/src/net/http/server.go:2387 +0x1c4
net/http.serverHandler.ServeHTTP(0xc000264000, 0xac7dc0, 0xc0002640e0, 0xc000244200)
        c:/go/src/net/http/server.go:2802 +0xab
net/http.(*conn).serve(0xc00011a820, 0xac8b00, 0xc00004d280)
        c:/go/src/net/http/server.go:1890 +0x87c
created by net/http.(*Server).Serve
        c:/go/src/net/http/server.go:2927 +0x395
exit status 2
PS E:\wwwroot\go\the-way-to-go\package>

3、查看 Go 文件,urlshortener.go。为了代码的简洁我们并没有检测返回的错误状态,但是在真实的生产环境的应用中一定要做检测。打开网址:http://goo.gl ,发现到 2019年3月30日,URL Shortener API 已经停止支持。如图3

图3

package main

import (
  "fmt"
  "net/http"
  "text/template"

  "google.golang.org/api/urlshortener/v1"
)
func main() {
  http.HandleFunc("/", root)
  http.HandleFunc("/short", short)
  http.HandleFunc("/long", long)

  http.ListenAndServe("localhost:8080", nil)
}
// the template used to show the forms and the results web page to the user
var rootHtmlTmpl = template.Must(template.New("rootHtml").Parse(`
<html><body>
<h1>URL SHORTENER</h1>
{{if .}}{{.}}<br /><br />{{end}}
<form action="/short" type="POST">
Shorten this: <input type="text" name="longUrl" />
<input type="submit" value="Give me the short URL" />
</form>
<br />
<form action="/long" type="POST">
Expand this: http://goo.gl/<input type="text" name="shortUrl" />
<input type="submit" value="Give me the long URL" />
</form>
</body></html>
`))
func root(w http.ResponseWriter, r *http.Request) {
 rootHtmlTmpl.Execute(w, nil)
}
func short(w http.ResponseWriter, r *http.Request) {
  longUrl := r.FormValue("longUrl")
  urlshortenerSvc, _ := urlshortener.New(http.DefaultClient)
  url, _ := urlshortenerSvc.Url.Insert(&urlshortener.Url{LongUrl:
  longUrl,}).Do()
  rootHtmlTmpl.Execute(w, fmt.Sprintf("Shortened version of %s is : %s",
  longUrl, url.Id))
}

func long(w http.ResponseWriter, r *http.Request) {
  shortUrl := "http://goo.gl/" + r.FormValue("shortUrl")
  urlshortenerSvc, _ := urlshortener.New(http.DefaultClient)
  url, err := urlshortenerSvc.Url.Get(shortUrl).Do()
  if err != nil {
   fmt.Println("error: %v", err)
   return

  }
  rootHtmlTmpl.Execute(w, fmt.Sprintf("Longer version of %s is : %s",
  shortUrl, url.LongUrl))
}

4、对于希望迁移到 FDL 的开发人员,请参阅我们的迁移指南。点击链接:our migration guide。由使用 URL Shortener 改为使用 Firebase 动态链接。如图4

图4

永夜