比较nil指针变量的值

时间:2011-05-20 07:45:21

标签: go

我知道Go在这方面与其他语言略有不同,但我想知道Go语言是否值得在比较时自动测试nil指针并且如果只有一个值为nil则返回不相等(在比较)而不是创建运行时错误。 Go在很多领域都是如此之大,我以为它可以做到。这方面的例子如下:


type cuForm struct {sName string; iUseCount int64; baForm []byte}

var pugForm *cuForm

//***********************************************************
func loadForm (sWanted string) (*cuForm, os.Error) {
//***********************************************************

    if (sWanted == pugForm.sName) {

在上面的示例中,如果pugForm为nil,则会发生运行时错误。显然,如果只有一个值为零,则它不能相等 - 至少逻辑上。可能有理由不应该这样做,但我不认为历史应该是一个原因。

2 个答案:

答案 0 :(得分:1)

错误消息是:“panic:运行时错误:无效的内存地址或nil指针取消引用。”实际错误是nil指针取消引用。

当指针pugForm为nil时,pugForm.sName未定义。您希望它是一个特殊值,如SQL中的null或浮点数的NaN。现在,您需要为所有操作设置一组特殊规则,而不仅仅是相等。

零指针取消引用几乎总是错误的。如果发生这种情况,运行时应该反对如果没有错,请通过测试nil来避免问题。修正你的错误,不要试图假装它没有发生。

您对此计划的期望是什么?

package main

import (
    "fmt"
)

func main() {
    var i int
    var p *int
    var b bool
    b = i == *p
    b = i <= *p
    b = i >= *p
    i += *p
    i -= *p
    i *= *p
    i /= *p
    i %= *p
    i = *p << uint(i)
    i = *p >> uint(i)
    fmt.Println(i, p, b)
}

答案 1 :(得分:0)

不是说你的问题不合适,我认为没有把它作为默认的comportment来实现:这意味着在运行时有更多的测试,我不希望我的程序的所有相等测试。

但确实,专用表达式(例如'===')可能(可能)有用。

正如Nos所说,go-nuts邮件列表可能会成为讨论的一个更具建设性的地方。