1. 程式人生 > 其它 >指標 介面 與 nil 的判斷

指標 介面 與 nil 的判斷

技術標籤:gogo介面指標interfacegolang

在golang中,nil只能賦值給指標、channel、func、interface、map或slice型別的變數。如果未遵循這個規則,則會引發panic。

nil不能賦值給結構體,編譯時會報錯

package main
import "fmt"

type Man struct{
    Name string
}

var (
    man Man == nil
    man1 *Man
)

func main () {
    fmt.Println("man == nil is "
,man == nil) }

在這裡插入圖片描述
結構體不能與nil判斷,執行時會報錯

package main
import "fmt"

type Man struct{
    Name string
}
var (
    man Man
    man1 *Man
)
func main () {
    fmt.Println("man == nil is ",man == nil)
}

在這裡插入圖片描述

指標與nil判斷

package main
import "fmt"
type Man struct{
    Name string
}
var (
man Man man1 *Man ) func main () { fmt.Println("man1 == nil is ",man1 == nil) }

在這裡插入圖片描述
注意:當指標是nil的時候不能呼叫結構體屬性,會報空指標異常

介面nil的判斷

package main
import 
    ("fmt"
    "reflect"
    )

type Person interface {
    Sex()   	
}

type Man struct{
    Name string
}

func
(*Man) Sex(){fmt.Println("不知道")} func GetNilPerson() Person{ var man *Man = nil return man } func GetPerson() Person{ var man *Man = &Man{} return man } var ( man Man man1 *Man per Person per1 = GetNilPerson() per2 = GetPerson() ) func main () { fmt.Println("per == nil is",nil == per) fmt.Println("per1 == nil is",nil == per1) fmt.Println("per2 == nil is",nil == per2) }

在這裡插入圖片描述

官方對interface的定義
官方在常見問題中,對interface判斷nil進行了描述:

  • interface的內部實現,其實有兩個很核心的元素,那就是type與value。
  • interface == nil,僅當type、value均為nil,即(nil,nil)。很多時候,type有值,而value==nil。
  • 實際開發中,不應存在type==nil,value!=nil的情況。

在面對型別時,可以利用反射包(reflect)的TypeOf獲取的Type,再呼叫Kind來了解基礎結構類別

package main
import 
    ("fmt"
    "reflect"
    )

type Person interface {
    Sex()   	
}

type Man struct{
    Name string
}

func (*Man) Sex(){fmt.Println("不知道")}

func GetNilPerson() Person{
    var man *Man = nil
    return man
}

func GetPerson() Person{
    var man *Man = &Man{}
    return man
}

var (
    man Man
    man1 *Man
    per Person
    per1 = GetNilPerson()
    per2 = GetPerson()
)

func main () {
    fmt.Println("per == nil is",nil == per)
    fmt.Println("per1 == nil is",nil == per1)
    fmt.Println("per2 == nil is",nil == per2)  
    fmt.Printf("per information: nil?:%5v, type=%15v, value=%5v  \n", per == nil, reflect.TypeOf(per), reflect.ValueOf(per))                                                //介面變數,type、value都是nil,所以cat1==nil
    fmt.Printf("per1 information: nil?:%5v, type=%5v, type.kind=%5v, value=%5v  \n", per1 == nil, reflect.TypeOf(per1), reflect.TypeOf(per1).Kind(), reflect.ValueOf(per1))   //介面變數,type!=nil,所以cat2!==nil
    fmt.Printf("per2 information: nil?:%5v, type=%5v, type.kind=%5v, value=%5v  \n", per2 == nil, reflect.TypeOf(per2), reflect.TypeOf(per2).Kind(), reflect.ValueOf(per2))   //介面變數,type!=nil, 所以cat3!=nil
}

在這裡插入圖片描述
當型別和值都為空的時候接口才與nil相等

參考:https://blog.csdn.net/qq_26981997/article/details/52608081