golang 接口与nil的判等

nil赋值

在golang中,nil只能赋值给指针、channel、func、interface、map或slice类型的变量。如果未遵循这个规则,则会引发panic。

nil不能赋值给结构体,编译时会报错

package main
import "fmt"

type Man struct{
    Name string
}

var (
    man Man == nil
    man1 *Man
)

func main () {
    fmt.Println("man == nil is ",man == nil)
}

在这里插入图片描述
结构体不能与nil判断,运行时会报错

package main
import "fmt"

type Man struct{
    Name string
}
var (
    man Man
    man1 *Man
)
func main () {
    fmt.Println("man == nil is ",man == nil)
}

在这里插入图片描述

指针与nil判断

package main
import "fmt"
type Man struct{
    Name string
}
var (
    man Man
    man1 *Man
)

func main () {
    fmt.Println("man1 == nil is ",man1 == nil)
}

在这里插入图片描述
注意:当指针是nil的时候不能调用结构体属性,会报空指针异常

接口nil的判断

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)  
}

在这里插入图片描述

官方对interface的定义
官方在常见问题中,对interface判断nil进行了描述:

  • interface的内部实现,其实有两个很核心的元素,那就是type与value。
  • interface == nil,仅当type、value均为nil,即(nil,nil)。很多时候,type有值,而value==nil。
  • 实际开发中,不应存在type==nil,value!=nil的情况。

在面对类型时,可以利用反射包(reflect)的TypeOf获取的Type,再调用Kind来了解基础结构类别

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
}

在这里插入图片描述
当类型和值都为空的时候接口才与nil相等

参考:https://blog.csdn.net/qq_26981997/article/details/52608081

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值