2011-05-20 72 views
1

我知道Go在这方面与其他语言有些不同,但我想知道Go语言是否值得自动测试比较中的零指针并返回不等于值为零(比较)而不是创建运行时错误。 Go在这么多领域非常出色,我认为它可以做到这一点。示例如下:比较nil指针变量的值


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

var pugForm *cuForm 

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

    if (sWanted == pugForm.sName) { 

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

+3

这可能更适合gonots邮件列表 – nos 2011-05-20 07:49:38

+0

只有* what *值之一? pugForm不是一个被比较的值,它是一个指向包含被比较值的结构的指针。如果它是零,它不指向任何结构 - 这是一个程序逻辑错误来解引用它。 – 2011-06-05 04:21:58

回答

1

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

当指针pugForm为零时,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) 
} 
+0

我认为,因为我只提到比较,“<" and ">”是不合逻辑的(没有给出错误),因此测试相等性也不合逻辑。采取的点。 – brianoh 2011-05-20 14:09:50

0

不是说你的问题是不相关的,我看到一个很好的理由不执行此为默认行为举止:在运行时意味着更多的测试,我不希望为所有相等测试我的程式。

但的确,专用表达式(例如像'==='之类的东西)可能(可能)有用。

正如Nos表示的那样,坚果邮件列表可能会成为本次讨论更具建设性的地方。

+0

即使这是实现的(我怀疑),它不会“破坏”任何现有的代码,并且不会阻止测试为零。显然它可能会有意想不到的后果(非错误)。也许它会在一定程度上影响运行时间。在某些情况下,它可以改善运行时间,而无需专门为它编写代码。让这么好的事情(恕我直言)是一大堆小小的改进和创新,它们阻止我们永远说“为什么它不允许(或做)这个或那个?”。这对我来说是什么使它如此愉快地使用 - 少花钱多办事。 – brianoh 2011-05-21 04:21:27

+0

它不会破坏很多代码,但会减慢它的速度。这很有趣,但我不希望这个新功能取代我现有的快速测试。 – 2011-05-22 08:42:24