Go语言中nil判断出问题如何解决
Go语言中nil判断出问题如何解决
这篇文章主要介绍“Go语言中nil判断出问题如何解决”,在日常操作中,相信很多人在Go语言中nil判断出问题如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言中nil判断出问题如何解决”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
nil 是什么
在 Go 语言中,布尔类型的零值(初始值)为 false,数值类型的零值为 0,字符串类型的零值为空字符串"",而指针、切片、映射、通道、函数和接口的零值则是 nil。
nil 内置的一个变量,用来代表空值,且只有指针、channel、方法、接口、map 和切片可以被赋值为 nil。
有过其他编程语言开发经验的开发者也许会把 nil 看作其他语言中的 null(NULL),其实这并不是完全正确的,因为Go语言中的 nil 和其他语言中的 null 有很多不同点。
buildin/buildin.go:
// nil is a predeclared identifier representing the zero value for a
// pointer, channel, func, interface, map, or slice type.
var nil Type // Type must be a pointer, channel, func, interface, map, or slice type// Type is here for the purposes of documentation only. It is a stand-in
// for any Go type, but represents the same type for any given function
// invocation.
type Type int
问题代码
下面的代码是我对 http.Post 方法的封装
func(r*Request)Post(endpointstring,params*url.Values,bodyio.Reader,headersmap[string]string,cookiesmap[string]string)(resp*http.Response,errerror){url:=fmt.Sprintf("%s%s",r.BaseURL,endpoint)varreq*http.Requestreq,err=http.NewRequest(http.MethodPost,url,body)iferr!=nil{return}r.setRequest(req,params,headers,cookies)resp,err=r.Client.Do(req)return}
然后像下面这样使用的时候:
varbody*bytes.Readerbody=nilresp,err=req.Post(endpoint,nil,body,nil,nil)
这时会出现空指针的错误,最终经过漫长的排查发现是在 http.NewRequest 里出现的空指针错误:
错误分析
指针和接口的底层实现有两部分:data 和 type。当指针和接口被显式地赋值为 nil 时,data 和 type 同时为 nil,但是将一个 type 不为 nil 但 data 为 nil 的值赋值给指针或接口时,再与 nil 作比较的结果则是 false。
修改代码
使用 reflect.ValueOf(body).IsNil() 判断 body 是否为空:
func(r*Request)Post(endpointstring,params*url.Values,bodyio.Reader,headersmap[string]string,cookiesmap[string]string)(resp*http.Response,errerror){url:=fmt.Sprintf("%s%s",r.BaseURL,endpoint)varreq*http.Requestifreflect.ValueOf(body).IsNil(){req,err=http.NewRequest(http.MethodPost,url,nil)}else{req,err=http.NewRequest(http.MethodPost,url,body)}iferr!=nil{return}r.setRequest(req,params,headers,cookies)resp,err=r.Client.Do(req)return}
到此,关于“Go语言中nil判断出问题如何解决”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注恰卡编程网网站,小编会继续努力为大家带来更多实用的文章!
推荐阅读
-
Go语言中的Goroutine和channel怎么使用
Go语言中的Goroutine和channel怎么使用这篇“Go语...
-
go语言中协程与线程的区别有哪些
go语言中协程与线程的区别有哪些这篇文章主要介绍“go语言中协程与...
-
go语言有哪些好处
go语言有哪些好处这篇文章主要介绍“go语言有哪些好处”的相关知识...
-
Go语言中转义符怎么使用
-
go语言如何判断一个文件是否存在
-
go语言中不定参数指的是什么
-
go语言空白标识符怎么使用
go语言空白标识符怎么使用这篇文章主要介绍了go语言空白标识符怎么...
-
go语言预定义标识符怎么使用
go语言预定义标识符怎么使用本文小编为大家详细介绍“go语言预定义...
-
go语言中join方法怎么使用
go语言中join方法怎么使用这篇“go语言中join方法怎么使用...
-
go语言字符串如何将小写转为大写