精华内容
下载资源
问答
  • 无(以前为 nullObj) PHP 中一个非常棒且合理的空对象实现。
  • Golang之nil

    千次阅读 2019-02-11 20:53:35
    golang中的**nil,很多人都误以为与Java、PHP等编程语言中的null一样。但是实际上Golang的niu复杂得多了,如果不信,那我们继续往下阅读。 nil 为预声明的标示符,定义在builtin/builtin.go** // nil is a ...

    Golang之nil

    golang中的nil,很多人都误以为与Java、PHP等编程语言中的null一样。但是实际上Golang的niu复杂得多了,如果不信,那我们继续往下阅读。
    nil为预声明的标示符,定义在builtin/builtin.go

    // nil is a predeclared identifier representing the zero value for a
    // pointer, channel, func, interface, map, or slice type.
    // Type must be a pointer, channel, func, interface, map, or slice type
    var nil Type 
    
    // Type is here for the purposes of documentation only. It is a stand-in
    // for any Go type, but represents the same type for any given function
    // invocation.
    type Type int
    

    nil的零值

    按照Go语言规范,任何类型在未初始化时都对应一个零值:布尔类型是false,整型是0,字符串是"",而指针、函数、interface、slice、channel和map的零值都是nil。
    PS:这里没有说结构体struct的零值为nil,因为struct的零值与其属性有关
    nil没有默认的类型,尽管它是多个类型的零值,必须显式或隐式指定每个nil用法的明确类型。

    package main
    
    func main() {
    
        // 明确.
        _ = (*struct{})(nil)
        _ = []int(nil)
        _ = map[int]bool(nil)
        _ = chan string(nil)
        _ = (func())(nil)
        _ = interface{}(nil)
    
        // 隐式.
        var _ *struct{} = nil
        var _ []int = nil
        var _ map[int]bool = nil
        var _ chan string = nil
        var _ func() = nil
        var _ interface{} = nil
    }
    

    如果关注过golang关键字的同学就会发现,里面并没有**nil,也就是说nil并不是关键字,那么就可以在代码中定义nil,那么nil**就会被隐藏。

    package main
    
    import "fmt"
    
    func main() {
        nil := 123
        fmt.Println(nil) // 123
        var _ map[string]int = nil //cannot use nil (type int) as type map[string]int in assignment
    }
    

    nil类型的地址和值大小

    **nil**类型的所有值的内存布局始终相同,换一句话说就是:不同类型nil的内存地址是一样的。

    package main
    import (
        "fmt"
    )
    func main() {
        var m map[int]string
        var ptr *int
        var sl []int
        fmt.Printf("%p\n", m)       //0x0
        fmt.Printf("%p\n", ptr )    //0x0
        fmt.Printf("%p\n", sl )     //0x0
    }
    

    业务中一般将nil值表示为异常。nil值的大小始终与其类型与nil值相同的non-nil值大小相同。因此, 表示不同零值的nil标识符可能具有不同的大小。

    package main
    
    import (
        "fmt"
        "unsafe"
    )
    
    func main() {
        var p *struct{} = nil
        fmt.Println( unsafe.Sizeof( p ) ) // 8
    
        var s []int = nil
        fmt.Println( unsafe.Sizeof( s ) ) // 24
    
        var m map[int]bool = nil
        fmt.Println( unsafe.Sizeof( m ) ) // 8
    
        var c chan string = nil
        fmt.Println( unsafe.Sizeof( c ) ) // 8
    
        var f func() = nil
        fmt.Println( unsafe.Sizeof( f ) ) // 8
    
        var i interface{} = nil
        fmt.Println( unsafe.Sizeof( i ) ) // 16
    }
    

    大小是编译器和体系结构所依赖的。以上打印结果为64位体系结构和正式 Go 编译器。对于32位体系结构, 打印的大小将是一半。

    对于正式 Go 编译器, 同一种类的不同类型的两个nil值的大小始终相同。例如, 两个不同的切片类型 ( []int和[]string) 的两个nil值始终相同。

    nil值比较

    1. 不同类型的nil是不能比较的。
    package main
    import (
        "fmt"
    )
    func main() {
        var m map[int]string
        var ptr *int
        fmt.Printf(m == ptr) //invalid operation: m == ptr (mismatched types map[int]string and *int)
    }
    

    在 Go 中, 两个不同可比较类型的两个值只能在一个值可以隐式转换为另一种类型的情况下进行比较。具体来说, 有两个案例两个不同的值可以比较:
    * 两个值之一的类型是另一个的基础类型。
    * 两个值之一的类型实现了另一个值的类型 (必须是接口类型)。

    nil 值比较并没有脱离上述规则。

    package main
    import (
      "fmt"
    )
    func main() {
      type IntPtr *int
      fmt.Println(IntPtr(nil) == (*int)(nil))            //true
      fmt.Println((interface{})(nil) == (*int)(nil))    //false
    }
    
    1. 同一类型的两个nil值可能无法比较 因为golang中存在map、slice和函数类型是不可比较类型,它们有一个别称为不可比拟的类型,所以比较它们的nil亦是非法的。
    package main
    import (
        "fmt"
    )
    func main() {
        var v1 []int = nil
        var v2 []int = nil
        fmt.Println(v1 == v2)
        fmt.Println((map[string]int)(nil) == (map[string]int)(nil))
        fmt.Println((func())(nil) == (func())(nil))
    }
    

    **不可比拟的类型**的值缺是可以与“纯nil”进行比较。

    package main
    import (
        "fmt"
    )
    func main() {
        fmt.Println((map[string]int)(nil) == nil)  //true
        fmt.Println((func())(nil) == nil)           //true
    }
    
    1. nil值可能不相等
      如果两个比较的nil值之一是一个接口值, 而另一个不是, 假设它们是可比较的, 则比较结果总是 false。原因是在进行比较之前, 接口值将转换为接口值的类型。转换后的接口值具有具体的动态类型, 但其他接口值没有。这就是为什么比较结果总是错误的。
    package main
    import (
        "fmt"
    )
    func main() {
        fmt.Println( (interface{})(nil) == (*int)(nil) ) // false
    }
    

    常见问题

    1. 函数返回
    func nilReturn() (string,error)  {
    
        return nil,nil  //cannot use nil as type string in return argument
    }
    

    因为error是接口类型所以error类型没有报错。
    2. map的nil key map的key为指针、函数、interface、slice、channel和map,则key可以为nil。

    package main
    import (
        "fmt"
    )
    func main() {
        mmap := make(map[*string]int,4)
        a:="a"
        mmap[&a] = 1
        mmap[nil] = 99
        fmt.Println(mmap)   //map[0xc042008220:1 <nil>:99]
    }
    

    总结

    nil之所以比较难以理解因为我们经常混淆了nil值和nil类型,希望各位同学细细品味其中区别。

    展开全文
  • <p>In Objective-C, I can have a ...<p>I can pass as many object as I like, until I pass a <code>nil</code> in the last argument. <p>In php, can I have this ability also...? Thank you... </div>
  • nilNil和NULL的判断

    2017-05-09 14:41:07
    开发过程中,我们通过http请求,后台返回json数据,而有时数据里某一字段的值为null~,然后我们把此值赋值给NSArray,...if(dict == nil)或是if(dict == Nil)或是if(dict == NULL)再或是if(dict isEqual nil)

    开发过程中,我们通过http请求,后台返回json数据,而有时数据里某一字段的值为null~,然后我们把此值赋值给NSArray,NSdictionary,或是NSString,然后我们会判断此值为null时,所做的处理,而通常惯性思维判断时我们都会写:if(dict == nil)或是if(dict == Nil)或是if(dict == NULL)再或是if(dict isEqual nil),我们发现,都不好用,根本没有起到判断的作用~后来我才发现,原来不能这样来判断。

    简单点说,就是当字典,数组为null时,后台打印的输出结果是这样:

    (1)控制台打印:str=(null) 代表着 字符串或数组或字典是一个空指针,(而非空字符串)判断的时候,直接用:

    if(str == nil)就可以了。

    (2)控制台打印:str =  <null>,代表着这是一个空字符串,赋值为空,指针是存在的,只是内容为空,这种判断需要使用:

    if(str is equal [NSNull null ]) ,因为在ios上,内容为空不能简单的判断str==null(null 在ios上得用[NSNull null])

    展开全文
  • <p>I'm using Zend XML-RPC Client library to send XML requests to another non-PHP XML RPC server.(it's a java JBoss install, but I don't have control to change it/patch it/hack it). One request I'm ...
  • golang 中的 nil

    2020-05-06 15:39:11
    golang 中的 nil 官方文档: 下列 6 大类型家族的零值为 nil, 其它类型值都不可能为 nil pointer 指针类型 slice 切片类型 map 字典类型 channel 数据通道类型 function 函数类型 interface 接口类型 nil 为未...

    golang 中的 nil

    • 官方文档: 下列 6 大类型家族的零值为 nil, 其它类型值都不可能为 nil

      • pointer 指针类型
      • slice 切片类型
      • map 字典类型
      • channel 数据通道类型
      • function 函数类型
      • interface 接口类型
    • nil 为未确定类型值, 它有很多可能类型, 但是它没有默认类型

      • v := nil // 编译错误
      p := (*struct{})(nil)
      s := []int(nil)
      m := map[int]bool(nil)
      c := chan string(nil)
      f := (func())(nil)
      i := interface{}(nil)
      
    • nil 是占内存的, php js 中 null 是不占内存的

    • nil != nil, nil 指向的数据类型是不同的

    展开全文
  • ruby niltrue, false, and nil are special built-in data types in Ruby. Each of these keywords evaluates to an object that is the sole instance of its respective class. true , false和nil是Ruby中的特殊...

    ruby nil

    true, false, and nil are special built-in data types in Ruby. Each of these keywords evaluates to an object that is the sole instance of its respective class.

    truefalsenil是Ruby中的特殊内置数据类型。 这些关键字中的每一个都求值为一个对象,该对象是其各自类的唯一实例。

    true.class
     => TrueClass
    false.class
     => FalseClass
    nil.class
     => NilClass

    true and false are Ruby’s native boolean values. A boolean value is a value that can only be one of two possible values: true or not true. The object true represents truth, while false represents the opposite. You can assign variables to true / false, pass them to methods, and generally use them as you would other objects (such as numbers, Strings, Arrays, Hashes).

    truefalse是Ruby的本地布尔值。 布尔值是只能是两个可能值之一的值:true或not true。 对象true代表真相,而false代表相反。 您可以将变量分配给true / false ,将它们传递给方法,并通常像使用其他对象(例如数字,字符串,数组,哈希)一样使用它们。

    nil is a special value that indicates the absence of a value – it is Ruby’s way of referring to “nothing”. An example of when you will encounter the nil object is when you ask for something that doesn’t exist or cannot be found:

    nil是一个特殊的值,它指示不存在值–这是Ruby引用“ nothing”的方式。 当您遇到不存在或找不到的东西时,便是遇到nil对象的一个​​示例:

    hats = ["beret", "sombrero", "beanie", "fez", "flatcap"]
    
    hats[0]
     => "beret" # the hat at index 0
    hats[2]
     => "beanie" # the hat at index 2
    hats[4]
     => "flatcap" # the hat at index 4
    hats[5]
     => nil # there is no hat at index 5, index 5 holds nothing (nil)

    Zero is not nothing (it’s a number, which is something). Likewise, empty strings, arrays, and hashes are not nothing (they are objects, which happen to be empty). You can call the method nil? to check whether an object is nil.

    零不是什么(它是一个数字,是个数字)。 同样,空字符串,数组和哈希也不是什么(它们是对象,碰巧是空的)。 您可以调用方法nil? 检查对象是否为零。

    0.nil?
     => false
    "".nil?
     => false
    [].nil?
     => false
    {}.nil?
     => false
    nil.nil?
     => true
     # from the example above
    hats[5].nil?
     => true

    Every object in Ruby has a boolean value, meaning it is considered either true or false in a boolean context. Those considered true in this context are “truthy” and those considered false are “falsey.” In Ruby, only false and nil are “falsey,” everything else is “truthy.”

    Ruby中的每个对象都有一个布尔值,这意味着在布尔上下文中它被视为true或false。 在这种情况下,被认为是正确的是“真实的”,被认为是错误的是“假的”。 在Ruby中, 只有 falsenil是“ falsey”,其他所有东西都是“ true”。

    更多信息: (More Information:)

    翻译自: https://www.freecodecamp.org/news/data-types-in-ruby-true-false-and-nil-explained-with-examples/

    ruby nil

    展开全文
  • Go语言 nil和interface详解

    千次阅读 2014-04-20 09:48:54
    golang的nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。nil是预先说明的标识符,也即通常意义上的关键字。在golang中,nil只能赋值给指针、channel、func、interface、map或slice类型的变量...
  • 一、NULL 声明位置在stddef.h文件 对于普通的iOS开发者来说,通常NULL的定义就是: # define NULL ((void*)0) 因此,NULL本质上是:(void*)0 NULL表示C指针为空 ...charchar *string = NULL;...# define nil
  • URLWithString return nil

    2012-10-12 16:38:47
    http://www.cocoachina.com/bbs/read.php?tid-4938.html 碰到个小问题,搞定了,传上来,谢谢同事指点。 mac 10.5,5 xcode 3.1.1 iphone sdk 2,2,1 code: NSString *urlString=@...
  • func printDynamicType(any interface{}){ fmt.Printf("%T\n",any) }
  • 那么,如果把redis查询为空的结果设置为nil,就无法把"查询为空”和“未定义”区分开来了,例如在一个table中,一个key对应一个value,如果将该value设置为nil,则相当让key凭空消失,这显然是不合理的。所以必须用...
  • http://www.cocoachina.com/bbs/read.php?tid=270980 http://blog.csdn.net/smking/article/details/8590547
  • golang的nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。nil是预先说明的标识符,也即通常意义上的关键字。在golang中,nil只能赋值给指针、channel、func、interface、map或slice类型的变量...
  • Anil-E-comm-源码

    2021-02-12 03:19:06
    Laracasts包含1500多个视频教程,涉及各种主题,包括Laravel,现代PHP,单元测试和JavaScript。 深入我们全面的视频库,提高您的技能。 Laravel赞助商 我们要感谢以下赞助Laravel开发的赞助商。 如果您有兴趣成为...
  • nil是什么 相信写过Golang的程序员对下面一段代码是非常非常熟悉的了: if err != nil { // do something.... } 当出现不等于nil的时候,说明出现某些错误了,需要我们对这个错误进行一些处理,而如果等于nil...
  • golang中的nil,很多人都误以为与Java、PHP等编程语言中的null一样。但是实际上Golang的niu复杂得多了,如果不信,那我们继续往下阅读。 nil 为预声明的标示符,定义在builtin/builtin.go, // nil is a ...
  • NSArray *array = [NSNull null];
  • var v *T var i interface{} i = v
  • golang中的nil,很多人都误以为与Java、PHP等编程语言中的null一样。但是实际上Golang的nil复杂得多了。 nil 为预声明的标示符,定义在builtin/builtin.go: // nil is a predeclared identifier representing ...
  • golang 的 nil 在概念上和其它语言的 null、None、nil、NULL一样,都指代零值或空值。nil 是预先说明的标识符,也即通常意义上的关键字。在 golang 中,nil 只能赋值给 指针、channel、func、interface、map 或 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,365
精华内容 6,546
关键字:

nilphp