更新时间:

#golang interface 小题 接口初始化问题

package main

import (
	"fmt"
)

type People interface {
	Show()
}

type Student struct{}

func (stu *Student) Show() {

}

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

func main() {
	if live() == nil {
		fmt.Println("AAAAAAA")
	} else {
		fmt.Println("BBBBBBB") // this is the answer 
	}
}

这两种interface类型分别用两种struct表示,空接口为eface, 非空接口为iface.

stu是一个指向nil的空指针,但是最后return stu 会触发匿名变量 People = stu值拷贝动作,所以最后live()返回给上层的是一个People insterface{}类型,也就是一个iface struct{}类型。 stu为nil,只是iface中的data 为nil而已。 但是iface struct{}本身并不为nil.

func Foo(x interface{}) { // 空接口 
	if x == nil {
		fmt.Println("empty interface")
		return
	}
	fmt.Println("non-empty interface")
}
func main() {
	var p *int = nil
	Foo(p)
}

Foo()的形参x interface{}是一个空接口类型eface struct{}。所以 x 结构体本身不为nil,而是data指针指向的p为nil。

出自 https://www.yuque.com/aceld/golang/ssesoe