Golang Go语言中初学,怎么判断一个变量是否未初始化/是否为空

发布于 1周前 作者 zlyuanteng 来自 Go语言

Golang Go语言中初学,怎么判断一个变量是否未初始化/是否为空

应该怎么写

package main

import "net/http"

func main() {
	var httpClient http.Client

	if httpClient == nil { // 这一行报错 cannot convert nil to type http.Client

	}

}
22 回复

到菜鸟教程去好吧

更多关于Golang Go语言中初学,怎么判断一个变量是否未初始化/是否为空的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


看 go 语言之旅
科学的地址 https://go-tour-zh.appspot.com/
不科学的地址 http://tour.studygolang.com/welcome/1?tdsourcetag=s_pctim_aiomsg

看完这个看 Effective Go

#1 提问前我就看了菜鸟教程, 菜鸟教程告诉我"没有初始化就为零值"。
我试了下面 4 种都报错
if httpClient == 0
if httpClient == “”
if httpClient == false
if httpClient == nil
当然菜鸟教程的文章我没全看
按我之前学的其他语言的习惯 if httpClient == nil 应该是可行的,结果不行,差别好大

var httpClient *http.Client

#2 可以, 解决了我的问题

呃,这个东西是个结构体,所以才不能和 nil 比较啊,如果你定义个指针就没这个问题了……

httpClient 是指(*http.Client )的话零值是 nil
不是的话零值是 httpClient{}

#8 http.Client{}

zero value 了解下

理解了你说的话,但是不理解 httpClient 竟然是个结构体。

var a int if a == nil 这个就会保错了。

实践一下吧,没有必要这么写,这样判空的意义几乎为零,当然报错

golang 没办法直接判断一个结构是否初始化,只能通过通过结构的某个属性值来判断,比如 int 默认是 0,如果
httpClient 有个属性 id int,
判断 httpClient.Id = 0 ,有可能是没初始化,当然也不是 100%,得看实际应用

#13 这只是我简化成这样
原本 httpClient 是一个全局变量
然后想在某个函数里 判断 httpClient 是否为空, 为空则给 httpClient 赋值, 然后把 httpClient 返回出来

https://www.v2ex.com/t/661739 我甚至怀疑是不是同一个人的问题

改成指针类型

有 zero value,不用太担心初始化方面

切片 字典 指针 接口 这些类型可能为空,其他都不可能为空!

通道貌似也能为空

在Go语言中,所有变量在声明时都会被自动初始化为其类型的零值。这意味着,你不能直接检查一个变量是否“未初始化”,因为你总是可以得到一个确定的初始值。例如,整型变量的零值是0,字符串的零值是空字符串"",指针的零值是nil。

对于检查一个变量是否为“空”,这通常意味着检查变量是否为其类型的零值。对于某些类型,比如字符串和指针,这可以通过简单的比较来实现:

  • 字符串:str == ""
  • 指针:ptr == nil

然而,对于像切片(slice)、映射(map)和通道(channel)这样的引用类型,零值不是nil的行为方式可能与直觉不同。例如,一个切片的零值是一个长度为0的切片,而不是nil。要检查切片是否为空,应使用len(slice) == 0

对于映射和通道,零值也是非nil的,但同样可以通过长度来检查是否为空:

  • 映射:len(m) == 0
  • 通道:len(ch) == 0(注意,这只能告诉你通道中没有待处理的元素,但通道本身不是nil)

总之,在Go中,检查变量是否为“空”通常意味着检查它是否为其类型的零值,而这通常涉及比较或检查长度。由于Go的变量总是被初始化,因此不存在未初始化的变量。

回到顶部