nil在golang中是什么意思?

nil在golang中是什么意思?

问题描述:

There are many cases using nil in golang. For example:

func (u *URL) Parse(ref string) (*URL, error) {
    refurl, err := Parse(ref)
    if err != nil {
        return nil, err
    }
    return u.ResolveReference(refurl), nil
}

but we can't use it like this:

var str string //or var str int
str = nil

the golang compiler will throw a can't use nil as type string in assignment error.

Looks like nil can only be used for a pointer of struct and interface. If that is the case, then what does it mean? and when we use it to compare to the other object, how do they compare, in other words, how does golang determine one object is nil?

EDIT:For example, if an interface is nil, its type and value must be nil at the same time. How does golang do this?

在golang中很多情况下使用 nil strong>。 例如: p>

  func(u * URL)Parse(ref string)(* URL,error){
 refurl,err:= Parse(ref)
 if err  != nil {
返回nil,err 
} 
返回u.ResolveReference(refurl),nil 
} 
  code>  pre> 
 
 

,但我们不能使用 像这样: p>

  var str字符串//或var str int 
str = nil 
  code>  pre> 
 
 

golang 编译器将抛出不能在分配中使用nil作为类型字符串 code>错误。 p>

看起来像 nil code>只能用于 结构和接口的指针。 如果是这样,那么这是什么意思? strong> 和当我们使用它与另一个对象进行比较时,它们如何比较,换句话说,golang如何确定一个对象 是nil strong>? p>

编辑:例如,如果接口为nil,则其类型和值必须同时为nil。 golang如何做到这一点? strong> p> div>

In Go, nil is the zero value for pointers, interfaces, maps, slices, channels and function types, representing an uninitialized value.

nil doesn't mean some "undefined" state, it's a proper value in itself. An object in Go is nil simply if and only if it's value is nil, which it can only be if it's of one of the aforementioned types.

An error is an interface, so nil is a valid value for one, unlike for a string. For obvious reasons a nil error represents no error.

nil in Go is simply the NULL pointer value of other languages.

You can effectively use it in place of any pointer or interface (interfaces are somewhat pointers).

You can use it as an error, because the error type is an interface.

You can't use it as a string because in Go, a string is a value.

nil is untyped in Go, meaning you can't do that:

var n = nil

Because here you lack a type for n. However, you can do

var n *Foo = nil

Note that nil being the zero value of pointers and interfaces, uninitialized pointers and interfaces will be nil.

  • For the data types like slice and pointers which "refer" to other types, "nil" indicates that the variable does not refer to an instance (equivalent of null pointer in other languages)
  • It is thee zero value of the variables of type functions, maps, interfaces, channels and structures