在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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/237128.html
標籤:區塊鏈
下一篇:Linux常用環境變數
