指標 介面 與 nil 的判斷
阿新 • • 發佈:2020-12-21
在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