ChatGPT解决这个技术问题 Extra ChatGPT

What does nil mean in golang?

go

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?

You'll have to understand Go types and the different values an object of each type may have. All details about which things are nil, assignable to nil, comparable to nil and so an are explained in golang.org/ref/spec which is short enough to read in one go and clear enough to understand it.
Empty string in Go is "". To test if a string has value, simply do str == ""

L
LemurFromTheId

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.


E
Elwinar

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.


Wrong: nil has no type. It isn't typed. You can't do: var n = nil not because nil has a type, it's because, the compiler can't derive what will be the type of n, it can't defer the type, because, nil has no type.
Thanks for pointing out the typo, so long after the answer. An edit would have been more a propos. But thanks nonetheless.
Right, no problem.
Additional example: func getStuff() string { return nil } won't compile with message cannot use nil as type string in return argument. In java public String getStuff() { return null; } works perfectly fine. Not sure what you meant by "string is a value" - string is a slice of bytes.
A string is a value by opposition to a pointer (or an error which is an interface, essentially a pointer). Maybe the term concrete type would be more precise, but I don't think it would be more understandable for a beginner.
a
ajaykumar mp

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.


p
pr-pal

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


I
Isaac Kiptanui

nil in Go means a zero value for pointers, interfaces, maps, slices, and channels. It means the value is uninitialized


A
Alok Tripathi

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

Typo in your code? See play.golang.org/p/G3a2aqgjcnj.
G
Gourav Jondhale

In Go nil is predeclared identifier that represents nothing for pointers, interfaces, channels, maps, slices and function types. Uninitialized pointers and interfaces will be nil. A string doesn’t qualify to be either of the above-mentioned types and hence can’t be assigned nil. If you declare a variable by shorthand decleration like this: variable:=nil this will give compile time error because compiler has no idea which type it has to assign to variable .

In Go map, slice and function doesn't support comparison but can be compared with nil. If any two map, slice or function are assigned to nil and compared with each other then it will raise runtime error. But if we assign nil to any two pointer variables and compare them with each other then no error will occur.

package main

import (
"fmt"
)

 func main() {
    var i *int =nil
    var j *int =nil
    if i==j {
      fmt.Println("equal")
    } else {
      fmt.Println("no")
    }
}

This code works fine and prints output as equal.


c
cakazies

In Golang, datatype can use nil is pointers, interfaces, maps, slices, channels, function types and errors

in String value is ""

in INT value is ZERO


关注公众号,不定期副业成功案例分享
Follow WeChat

Success story sharing

Want to stay one step ahead of the latest teleworks?

Subscribe Now