interface空指針不為nil
當把一個空指針對象賦值給一個interface后,再判斷!= nil就不再成立了
代碼如下
package main
import "fmt"
type Person interface {
Name() string
}
type ChenQiongHe struct {
}
func (t *ChenQiongHe) Name() string {
return "雪山飛豬"
}
func main() {
var test *ChenQiongHe
if test == nil {
fmt.Println("test == nil")
} else {
fmt.Println("test != nil")
}
//將空指針賦值給接口
var person Person = test
if person == nil {
fmt.Print("person == nil")
} else {
fmt.Print("person != nil")
}
}
運行結果
test == nil
person != nil
test本來是nil,賦值給person后居然不能再用nil判斷了
解決方法
使用reflect包的IsNil判斷,封裝為一個能用方法
func IsNil(i interface{}) bool {
vi := reflect.ValueOf(i)
if vi.Kind() == reflect.Ptr {
return vi.IsNil()
}
return false
}
全部示例代碼
package main
import (
"fmt"
"reflect"
)
type Person interface {
Name() string
}
type ChenQiongHe struct {
}
func (t *ChenQiongHe) Name() string {
return "雪山飛豬"
}
func main() {
var test *ChenQiongHe
if test == nil {
fmt.Println("test == nil")
} else {
fmt.Println("test != nil")
}
//將空指針賦值給接口
var person Person = test
if IsNil(person) {
fmt.Print("person == nil")
} else {
fmt.Print("person != nil")
}
}
func IsNil(i interface{}) bool {
vi := reflect.ValueOf(i)
if vi.Kind() == reflect.Ptr {
return vi.IsNil()
}
return false
}
運行結果
test == nil
person == nil
完美解決,light weight baby!