记录golang接口赋值nil的坑
@ sasaba | 星期三,八月 16 日,2023 年 | 1 分钟阅读 | 更新于 星期三,八月 16 日,2023 年

记录golang接口赋值nil的坑。

代码

package main

import "fmt"

type Interface interface {
	MethodCall()
}

type Struct struct {
}

func (s *Struct) MethodCall() {

}

func NewStruct() *Struct {
	return nil
}

func main() {
	var f1, f2 Interface

	// 不判断nil
	s1 := NewStruct()
	f1 = s1

	// 判断nil
	s2 := NewStruct()
	if s2 != nil {
		f2 = s2
	}

	if f1 == nil {
		fmt.Println("f1 is nil")
	} else {
		fmt.Println("f1 is not nil")
	}

	if f2 == nil {
		fmt.Println("f2 is nil")
	} else {
		fmt.Println("f2 is not nil")
	}
}

// f1 is not nil
// f2 is nil

当把一个指针类型赋值给接口时,如果直接复制就会出现判断==nil时不为空的情况,这是因为f1虽然是nil但是它是有类型的,最好的方法就是遇到这种情况判断下再赋值如f2。

func NewStruct() Interface {
	return nil
}

但是把NewStruct的返回值改成接口类型就不会有这种情况。这个写法上就仁者见仁智者见智了,但是这个坑还是要避免的。