什么意思在golang中意味着什么?

时间:2016-03-14 08:56:10

标签: 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只能用于struct和interface的指针。如果是这种情况,那么是什么意思?当我们用它来比较另一个对象时,他们如何比较,换句话说,golang如何确定一个对象为零

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

8 个答案:

答案 0 :(得分:65)

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

nil并不意味着某种“未定义”状态,它本身就是一个合适的值。 Go中的一个对象是nil,当且仅当它的值为nil时,它只能是前面提到的类型之一。

error是一个界面,因此nil是一个有效值,与string不同。出于显而易见的原因,nil错误代表无错误

答案 1 :(得分:5)

Go中的

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

您可以有效地使用它来代替任何指针或接口(接口有点指针)。

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

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

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

var n = nil

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

var n *Foo = nil

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

答案 2 :(得分:2)

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

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

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

var a *int = nil  //It will work

答案 3 :(得分:1)

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

Go map 中 slice 和 function 不支持比较,但可以用 nil 进行比较。 如果将任意两个 map、slice 或 function 分配给 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

答案 4 :(得分:0)

  • 对于像切片和指针这样的数据类型,它们“引用”其他类型,“ nil”表示变量不引用实例(在其他语言中等效于空指针)
  • 它是类型函数,映射,接口,通道和结构的变量的零值

答案 5 :(得分:0)

Go中的

nil 表示指针界面,地图,切片和通道的值为零。 这意味着该值尚未初始化

答案 6 :(得分:0)

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

字符串中的值为“”

INT 中的

值为

答案 7 :(得分:0)

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

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