在golang中,nil只能赋值给指针、channel、func、interface、map或slice类型的变量。如果未遵循这个规则,则会引发panic。
**nil不能赋值给结构体,编译时会报错**
```go
package main
import "fmt"
type Man struct{
Name string
}
var (
man Man == nil
man1 *Man
)
func main () {
fmt.Println("man == nil is ",man == nil)
}
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201218160042547.png)
**结构体不能与nil判断,运行时会报错**
```go
package main
import "fmt"
type Man struct{
Name string
}
var (
man Man
man1 *Man
)
func main () {
fmt.Println("man == nil is ",man == nil)
}
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201218162258373.png)
## 指针与nil判断
```go
package main
import "fmt"
type Man struct{
Name string
}
var (
man Man
man1 *Man
)
func main () {
fmt.Println("man1 == nil is ",man1 == nil)
}
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020121816394665.png)
**注意**:当指针是nil的时候不能调用结构体属性,会报空指针异常
## 接口nil的判断
```go
package main
import
("fmt"
"reflect"
)
type Person interface {
Sex()
}
type Man struct{
Name string
}
func (*Man) Sex(){fmt.Println("不知道")}
func GetNilPerson() Person{
var man *Man = nil
return man
}
func GetPerson() Person{
var man *Man = &Man{}
return man
}
var (
man Man
man1 *Man
per Person
per1 = GetNilPerson()
per2 = GetPerson()
)
func main () {
fmt.Println("per == nil is",nil == per)
fmt.Println("per1 == nil is",nil == per1)
fmt.Println("per2 == nil is",nil == per2)
}
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201218165908392.png)
**官方对interface的定义**
*官方在常见问题中,对interface判断nil进行了描述:*
- interface的内部实现,其实有两个很核心的元素,那就是type与value。
- interface == nil,仅当type、value均为nil,即(nil,nil)。很多时候,type有值,而value==nil。
- 实际开发中,不应存在type==nil,value!=nil的情况。
**在面对类型时,可以利用反射包(reflect)的TypeOf获取的Type,再调用Kind来了解基础结构类别**
```go
package main
import
("fmt"
"reflect"
)
type Person interface {
Sex()
}
type Man struct{
Name string
}
func (*Man) Sex(){fmt.Println("不知道")}
func GetNilPerson() Person{
var man *Man = nil
return man
}
func GetPerson() Person{
var man *Man = &Man{}
return man
}
var (
man Man
man1 *Man
per Person
per1 = GetNilPerson()
per2 = GetPerson()
)
func main () {
fmt.Println("per == nil is",nil == per)
fmt.Println("per1 == nil is",nil == per1)
fmt.Println("per2 == nil is",nil == per2)
fmt.Printf("per information: nil?:%5v, type=%15v, value=%5v \n", per == nil, reflect.TypeOf(per), reflect.ValueOf(per)) //接口变量,type、value都是nil,所以cat1==nil
fmt.Printf("per1 information: nil?:%5v, type=%5v, type.kind=%5v, value=%5v \n", per1 == nil, reflect.TypeOf(per1), reflect.TypeOf(per1).Kind(), reflect.ValueOf(per1)) //接口变量,type!=nil,所以cat2!==nil
fmt.Printf("per2 information: nil?:%5v, type=%5v, type.kind=%5v, value=%5v \n", per2 == nil, reflect.TypeOf(per2), reflect.TypeOf(per2).Kind(), reflect.ValueOf(per2)) //接口变量,type!=nil, 所以cat3!=nil
}
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201218171026325.png)
当类型和值都为空的时候接口才与nil相等
> 转载:[*https://blog.csdn.net/weixin_45161636/article/details/111374074*]
有疑问加站长微信联系(非本文作者)