V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
5bb864e1fc775087
V2EX  ›  Go 编程语言

初学 GO,怎么判断一个变量是否未初始化/是否为空

  •  1
     
  •   5bb864e1fc775087 · 2020-05-21 16:22:45 +08:00 · 8101 次点击
    这是一个创建于 1680 天前的主题,其中的信息可能已经有所发展或是发生改变。

    应该怎么写

    package main
    
    import "net/http"
    
    func main() {
    	var httpClient http.Client
    
    	if httpClient == nil { // 这一行报错 cannot convert nil to type http.Client
    
    	}
    
    }
    
    21 条回复    2020-05-21 20:18:11 +08:00
    iamverylovely
        1
    iamverylovely  
       2020-05-21 16:33:44 +08:00
    到菜鸟教程去好吧
    caryqy
        2
    caryqy  
       2020-05-21 16:42:41 +08:00
    silenzio
        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
    5bb864e1fc775087
        4
    5bb864e1fc775087  
    OP
       2020-05-21 16:43:09 +08:00
    @iamverylovely #1 提问前我就看了菜鸟教程, 菜鸟教程告诉我"没有初始化就为零值"。
    我试了下面 4 种都报错
    if httpClient == 0
    if httpClient == “”
    if httpClient == false
    if httpClient == nil
    当然菜鸟教程的文章我没全看
    按我之前学的其他语言的习惯 if httpClient == nil 应该是可行的,结果不行,差别好大
    baiyi
        5
    baiyi  
       2020-05-21 16:45:36 +08:00
    var httpClient *http.Client
    5bb864e1fc775087
        6
    5bb864e1fc775087  
    OP
       2020-05-21 16:46:07 +08:00
    @caryqy #2 可以, 解决了我的问题
    rtp
        7
    rtp  
       2020-05-21 16:46:20 +08:00
    呃,这个东西是个结构体,所以才不能和 nil 比较啊,如果你定义个指针就没这个问题了……
    Trim21
        8
    Trim21  
       2020-05-21 16:47:28 +08:00   ❤️ 1
    httpClient 是指(*http.Client )的话零值是 nil
    不是的话零值是 httpClient{}
    Trim21
        9
    Trim21  
       2020-05-21 16:47:41 +08:00
    @Trim21 #8 http.Client{}
    Hanggi
        10
    Hanggi  
       2020-05-21 16:48:17 +08:00
    zero value 了解下
    forgottencoast
        11
    forgottencoast  
       2020-05-21 17:05:30 +08:00
    @rtp 理解了你说的话,但是不理解 httpClient 竟然是个结构体。
    zarte
        12
    zarte  
       2020-05-21 17:10:19 +08:00
    @forgottencoast var a int if a == nil 这个就会保错了。
    tikazyq
        13
    tikazyq  
       2020-05-21 17:10:37 +08:00
    实践一下吧,没有必要这么写,这样判空的意义几乎为零,当然报错
    pmispig
        14
    pmispig  
       2020-05-21 17:15:24 +08:00
    golang 没办法直接判断一个结构是否初始化,只能通过通过结构的某个属性值来判断,比如 int 默认是 0,如果
    httpClient 有个属性 id int,
    判断 httpClient.Id = 0 ,有可能是没初始化,当然也不是 100%,得看实际应用
    5bb864e1fc775087
        15
    5bb864e1fc775087  
    OP
       2020-05-21 17:20:19 +08:00
    @tikazyq #13 这只是我简化成这样
    原本 httpClient 是一个全局变量
    然后想在某个函数里 判断 httpClient 是否为空, 为空则给 httpClient 赋值, 然后把 httpClient 返回出来
    jworg
        16
    jworg  
       2020-05-21 17:45:02 +08:00 via iPhone
    https://www.v2ex.com/t/661739 我甚至怀疑是不是同一个人的问题
    asAnotherJack
        17
    asAnotherJack  
       2020-05-21 18:11:58 +08:00
    改成指针类型
    darksword21
        18
    darksword21  
       2020-05-21 18:16:39 +08:00
    有 zero value,不用太担心初始化方面
    5bb864e1fc775087
        19
    5bb864e1fc775087  
    OP
       2020-05-21 19:20:29 +08:00
    @jworg #16 不是
    iRiven
        20
    iRiven  
       2020-05-21 20:16:50 +08:00 via Android
    切片 字典 指针 接口 这些类型可能为空,其他都不可能为空!
    iRiven
        21
    iRiven  
       2020-05-21 20:18:11 +08:00 via Android
    @iRiven 通道貌似也能为空
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5340 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 09:12 · PVG 17:12 · LAX 01:12 · JFK 04:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.