ChatGPT解决这个技术问题 Extra ChatGPT

golang 中的 nil 是什么意思?

go

在 golang 中有很多使用 nil 的情况。例如:

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

但我们不能这样使用它:

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

golang 编译器会抛出 can't use nil as type string in assignment 错误。

看起来 nil 只能用于结构和接口的指针。如果是这样的话,那么是什么意思?当我们用它来和另一个对象进行比较的时候,他们是怎么比较的,也就是说,golang如何判断一个对象是什么?无

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

您必须了解 Go 类型以及每种类型的对象可能具有的不同值。所有关于哪些事物是 nil、可分配给 nil、可与 nil 比较等的详细信息都在 golang.org/ref/spec 中进行了解释,它足够短,可以一口气读完,也足够清晰,可以理解。
Go 中的空字符串是“”。要测试字符串是否有值,只需执行 str == ""

L
LemurFromTheId

在 Go 中,nil指针、接口、映射、切片、通道和函数类型的零值,表示 未初始化 值。

nil 并不意味着某些“未定义”状态,它本身就是一个适当的值。 Go 中的对象是 nil,当且仅当它的值是 nil,它只能是上述类型之一。

error 是一个接口,因此 nil 是一个有效值,与 string 不同。出于显而易见的原因,nil 错误表示没有错误


请参阅此处的规范:golang.org/ref/spec#Variables
E
Elwinar

Go 中的 nil 只是其他语言的 NULL 指针值。

您可以有效地使用它来代替任何指针或接口(接口在某种程度上是指针)。

您可以将其用作错误,因为 error type is an interface.

您不能将其用作字符串,因为在 Go 中,字符串就是一个值。

nil 在 Go 中是无类型的,这意味着您不能这样做:

var n = nil

因为这里缺少 n 的类型。但是,你可以做

var n *Foo = nil

请注意,nil 是指针和接口的零值,未初始化的指针和接口将是 nil


错误:nil 没有类型。它没有打字。你不能这样做:var n = nil 不是因为 nil 有类型,而是因为编译器无法推导出 n 的类型,它不能推迟类型,因为 nil 没有类型。
感谢您指出错字,在答案之后很久。编辑本来是一个提议。不过还是谢谢。
对,没问题。
附加示例:func getStuff() string { return nil } 不会与消息 cannot use nil as type string in return argument 一起编译。在 java public String getStuff() { return null; } 中工作得很好。不确定“字符串是一个值”是什么意思 - 字符串是一个字节片。
string 是与指针相反的值(或 error,它是一个接口,本质上是一个指针)。或许concrete type这个词会更准确一些,但我不认为它对初学者来说更容易理解。
a
ajaykumar mp

nil 也是一个值,但唯一的区别是 - 它是空的。

在 Javascript 中,未初始化的变量将是未定义的。以同样的方式,Golang 将 nil 作为所有未初始化数据类型的默认值。


p
pr-pal

对于切片和指针等数据类型“引用”其他类型,“nil”表示变量不引用实例(相当于其他语言中的空指针)

它是类型函数、映射、接口、通道和结构的变量的零值


I
Isaac Kiptanui

Go 中的 nil 表示指针、接口、映射、切片和通道的零值。这意味着该值未初始化


A
Alok Tripathi

nil 是 Go 中预先声明的标识符,表示 指针、接口、通道、映射、切片和函数类型的 零值 nil 是指针的零值和接口,未初始化的指针和接口将为零。

在 Go 中,字符串不能是 nil。字符串不符合分配 nil 的条件。

a := nil   // It will throw an error 'use of untyped nil'

var a *int = nil  //It will work

代码中的错字?请参阅play.golang.org/p/G3a2aqgjcnj
G
Gourav Jondhale

在 Go 中 nil 是预先声明的标识符,它不代表指针、接口、通道、映射、切片和函数类型。未初始化的指针和接口将是 nil。字符串不符合上述任何一种类型,因此不能分配 nil。如果您像这样通过速记 decleration 声明变量: variable:=nil 这将产生编译时错误,因为编译器不知道它必须分配给 variable 哪种类型。

在 Go map 中, slice 和 function 不支持比较,但可以与 nil 进行比较。如果将任意两个映射、切片或函数分配给 nil 并相互比较,则会引发运行时错误。但是,如果我们将 nil 分配给任意两个指针变量并将它们相互比较,则不会发生错误。

package main

import (
"fmt"
)

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

此代码工作正常并将输出打印为 equal


c
cakazies

在 Golang 中,数据类型可以使用 nil 是指针、接口、映射、切片、通道、函数类型和错误

在字符串值是“”

在 INT 值为零


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

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅