What does nil mean in 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?
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
nil
is a predeclared identifier in Go that represents zero values for pointers, interfaces, channels, maps, slices and function types.
nil
being the zero value of pointers and interfaces, uninitialized pointers and interfaces will be nil.
In Go, string can’t be nil
. A string doesn’t qualify to be assigned nil
.
a := nil // It will throw an error 'use of untyped nil'
var a *int = nil //It will work
nil is also a value but only difference is- it is empty.
In Javascript for the un-initialized variable will be undefined. In the same way Golang has nil as default value for all the un-initalized data types.