golang: 详解interface和nil

package main

import (
	"fmt"
	"reflect"
)

type People interface {
	Show()
}

type Student struct{}

func (stu *Student) Show() {}

func live() People {
	var stu *Student
	return stu
}

func main() {
	i := live()
	fmt.Println(reflect.TypeOf(i))
	fmt.Println(i)

	if i == nil {
		fmt.Println("A")
	} else {
		fmt.Println("B")
	}
}

为什么nil不等于nil

因为在底层,interface作为两个成员来实现,一个类型和一个值,type用于存储变量的动态类型,data用于存储变量的具体数据,只有(nil,nil)是才是真正的nil

在上面代码中值为nil,但是类型不为nil,所有与nil不相等,输出B

package main

import (
	"fmt"
	"reflect"
)

type People interface {
	Show()
}

type Student struct{}

func (stu *Student) Show() {}

func live() People {
	//var stu *Student
	return nil
}

func main() {
	i := live()
	fmt.Println(reflect.TypeOf(i))
	fmt.Println(i)

	if i == nil {
		fmt.Println("A")
	} else {
		fmt.Println("B")
	}
}

在上面的代码中,可以看出当类型和值都为nil时,是与nil相等的,输出A

package main

import (
	"fmt"
	"reflect"
)

type People interface {
	Show()
}

type Student struct{}

func (stu *Student) Show() {}

func live() *Student {
	var stu *Student
	return stu
}

func main() {
	i := live()
	fmt.Println(reflect.TypeOf(i))
	fmt.Println(i)

	if i == nil {
		fmt.Println("A")
	} else {
		fmt.Println("B")
	}
}

将live()函数的返回值改为*Student后,与nil相比较是相等的,输出A

可以得知,只有接口类型底层是保存类型和值得,其他只保存值,比较时也只比较值是不是nil

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值