go中interface空指針不為nil判斷方法


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!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM