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判断出问题如何解决”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注恰卡编程网网站,小编会继续努力为大家带来更多实用的文章!

展开全文
内容来源于互联网和用户投稿,文章中一旦含有亚博电竞手机版的联系方式务必识别真假,本站仅做信息展示不承担任何相关责任,如有侵权或涉及法律问题请联系亚博电竞手机版删除

最新文章

网站地图