Runtime Error: Invalid memory address or nil pointer dereference when using the URL shortener API

查看终端输出,报错:runtime error: invalid memory address or nil pointer dereference。
1. Reference URL: https://github.com/unknwon/the-way-to-go_zh_en/blob/master/ebook/09.11.md . Test by browsing the page of http://localhost:8080/. Enter: http://www.destandaard.be in shorten this, and click: Give me the short URL. Loading until timeout. as shown in Figure 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。一直加载中,直至超时。
Figure 1
2. Check the terminal output and report an error: Runtime Error: Invalid memory address or nil pointer dereference. as shown in Figure 2
查看终端输出,报错:runtime error: invalid memory address or nil pointer dereference。
Figure 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. Check the Go file, urlshortener.go. For the simplicity of the code, we do not detect the returned error status, but we must do the detection in the application of the real production environment. Open the URL: http://goo.gl and find that by March 30, 2019, the URL shortener API has stopped supporting. as shown in Figure 3
查看 Go 文件,urlshortener.go。为了代码的简洁我们并没有检测返回的错误状态,但是在真实的生产环境的应用中一定要做检测。打开网址:http://goo.gl ,发现到 2019年3月30日,URL Shortener API 已经停止支持。
Figure 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. For developers who want to migrate to FDL, please refer to our migration guide. Click the link: Our Migration Guide. Change to use Firebase dynamic links instead of using URL shortener. as shown in Figure 4
对于希望迁移到 FDL 的开发人员,请参阅我们的迁移指南。点击链接:our migration guide。由使用 URL Shortener 改为使用 Firebase 动态链接。
Figure 4

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.