应该怎么写
package main import "net/http" func main() { var httpClient http.Client if httpClient == nil { // 这一行报错 cannot convert nil to type http.Client } }
1 iamverylovely 2020-05-21 16:33:44 +08:00 到菜鸟教程去好吧 |
![]() | 2 caryqy 2020-05-21 16:42:41 +08:00 |
![]() | 3 silenzio 2020-05-21 16:42:57 +08:00 看 go 语言之旅 科学的地址 https://go-tour-zh.appspot.com/ 不科学的地址 http://tour.studygolang.com/welcome/1?tdsourcetag=s_pctim_aiomsg 看完这个看 Effective Go |
4 5bb864e1fc775087 OP @iamverylovely #1 提问前我就看了菜鸟教程, 菜鸟教程告诉我"没有初始化就为零值"。 我试了下面 4 种都报错 if httpClient == 0 if httpClient == “” if httpClient == false if httpClient == nil 当然菜鸟教程的文章我没全看 按我之前学的其他语言的习惯 if httpClient == nil 应该是可行的,结果不行,差别好大 |
![]() | 5 baiyi 2020-05-21 16:45:36 +08:00 var httpClient *http.Client |
6 5bb864e1fc775087 OP @caryqy #2 可以, 解决了我的问题 |
7 rtp 2020-05-21 16:46:20 +08:00 呃,这个东西是个结构体,所以才不能和 nil 比较啊,如果你定义个指针就没这个问题了…… |
![]() | 8 Trim21 2020-05-21 16:47:28 +08:00 ![]() httpClient 是指(*http.Client )的话零值是 nil 不是的话零值是 httpClient{} |
![]() | 10 Hanggi 2020-05-21 16:48:17 +08:00 zero value 了解下 |
11 forgottencoast 2020-05-21 17:05:30 +08:00 @rtp 理解了你说的话,但是不理解 httpClient 竟然是个结构体。 |
12 zarte 2020-05-21 17:10:19 +08:00 @forgottencoast var a int if a == nil 这个就会保错了。 |
![]() | 13 tikazyq 2020-05-21 17:10:37 +08:00 实践一下吧,没有必要这么写,这样判空的意义几乎为零,当然报错 |
![]() | 14 pmispig 2020-05-21 17:15:24 +08:00 golang 没办法直接判断一个结构是否初始化,只能通过通过结构的某个属性值来判断,比如 int 默认是 0,如果 httpClient 有个属性 id int, 判断 httpClient.Id = 0 ,有可能是没初始化,当然也不是 100%,得看实际应用 |
15 5bb864e1fc775087 OP @tikazyq #13 这只是我简化成这样 原本 httpClient 是一个全局变量 然后想在某个函数里 判断 httpClient 是否为空, 为空则给 httpClient 赋值, 然后把 httpClient 返回出来 |
![]() | 17 asAnotherJack 2020-05-21 18:11:58 +08:00 改成指针类型 |
![]() | 18 darksword21 PRO 有 zero value,不用太担心初始化方面 |
19 5bb864e1fc775087 OP @jworg #16 不是 ![]() |
![]() | 20 iRiven 2020-05-21 20:16:50 +08:00 via Android 切片 字典 指针 接口 这些类型可能为空,其他都不可能为空! |