GO 函数返回值为interface{}注意避坑


上代码

type Person struct {
	Name string
}

func GetPerson() *Person {
	var p *Person
	return p
}

func GetPerson1() interface{} {
	var p *Person
	return p
}

func main() {
	p := GetPerson()
	fmt.Println(p == nil)  // true

	p1 := GetPerson1()
	fmt.Println(p1 == nil) // false

	p2, ok := p1.(*Person)
	fmt.Println(p2 == nil, ok) // true, true
}

代码分析

在go中,任何变量都有值和类型两个内容,== 是比较值和内容的,只有2者都相等了才会相等。

第一个是true,p是*Person类型,是可以和nil比较的,任何指针类型都可以和nil比较

第二个是false,因为p1的类型是interface{}*Persion,虽然值是nil,但是不等于nil,类型没有匹配上

第三个是2个true,p2的类型是*Person,值是nil,同p,和nil是相等的。

这个地方要注意,经常有类似于GetPerson1() interface{}写法,即函数的返回值是interface{}类型,这个时候就要注意每一个return的地方都只能返回nil,不能反正某个结构体的指针。当函数过长的时候容易发生这个问题。


文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
  目录