• Go 大坑 nil


    问题

    package  main
    
    import (
    	"fmt"
    	"reflect"
    )
    
    func main(){
    
    	a := (*interface{})(nil)
    	fmt.Println(reflect.TypeOf(a), reflect.ValueOf(a))
    
    	var b interface{} = (*interface{})(nil)
    	fmt.Println(reflect.TypeOf(b), reflect.ValueOf(b))
    
    	fmt.Println(nil==a, nil==b, a == b)
    }
    

    输出

    *interface {}   <nil>
    *interface {}   <nil>
    true false true
    

    分析

    func main(){
    
    	a := (*interface{})(nil)  // 此句等于 var a *interface{} = (*interface{})(nil) a 是指向nil 的指针 ,a == nil,a (Type= *interface{}, Value=nil)
    	fmt.Println(reflect.TypeOf(a), reflect.ValueOf(a)) 
    
    	var b interface{} = (*interface{})(nil) // b (Type= *interface{}, Value=nil)  != nil
    	fmt.Println(reflect.TypeOf(b), reflect.ValueOf(b)) 
    
    	fmt.Println(nil==a, nil==b, a == b)
            
    }
     
    

    结果

    1. nil是一个预先声明的标识符,表示指针、通道、函数、接口、映射或切片类型。nil只能表示指针、通道、函数、接口、映射或切片 // interface{} 默认值 nil
    2. (*interface{})(nil) 把 nil 转换为 有*interface{}类型的nil(nil本身没有类型)。 // var a *interface{} 指向空接口的指针 值为nil a 等于 nil
    3. 在Go语言中,一个interface{}类型的变量包含了2个指针,一个指针指向值的在编译时确定的类型,另外一个指针指向实际的值。当我们将一个具体类型的值赋值给一个interface{}类型的变量的时候,就同时把类型和值都赋值给了interface{}里的两个指针。如果这个具体类型的值是nil的话,interface{}变量依然会存储对应的类型指针和值指针。只有当type和data都是nil时, 空接口才是nil 。//所以 b 不等于 nil
    4. 当interface与一个值或者interface做比较的时候,会同时比较type和value,都相等的时候,才会认为相等 。// 所以 a 等于b
    
    社会之所以进步,是因为有足够的人留下痕迹。
  • 相关阅读:
    VIJOS-P1340 拯救ice-cream(广搜+优先级队列)
    uva 11754 Code Feat
    uva11426 GCD Extreme(II)
    uvalive 4119 Always an Interger
    POJ 1442 Black Box 优先队列
    2014上海网络赛 HDU 5053 the Sum of Cube
    uvalive 4795 Paperweight
    uvalive 4589 Asteroids
    uvalive 4973 Ardenia
    DP——数字游戏
  • 原文地址:https://www.cnblogs.com/lph970417/p/15724625.html
Copyright © 2020-2023  润新知