Go 比较nil指针变量的值

Go 比较nil指针变量的值,go,Go,我知道Go在这方面与其他语言没有什么不同,但我想知道Go语言是否值得在比较中自动测试nil指针,如果只有一个值是nil(在比较中),而不是创建运行时错误,则返回unquality。围棋在很多方面都很棒,我只是觉得它可能会做到。这方面的例子如下: type cuForm struct {sName string; iUseCount int64; baForm []byte} var pugForm *cuForm //************************************

我知道Go在这方面与其他语言没有什么不同,但我想知道Go语言是否值得在比较中自动测试nil指针,如果只有一个值是nil(在比较中),而不是创建运行时错误,则返回unquality。围棋在很多方面都很棒,我只是觉得它可能会做到。这方面的例子如下:


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,则会发生运行时错误。显然,如果只有一个值是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)
}
主程序包
进口(
“fmt”
)
func main(){
变量i int
变量p*int
布尔变量
b=i==*p
b=i=*p
i+=*p
i-=*p
i*=*p
i/=*p
i%=*p
i=*p>uint(i)
格式打印LN(i、p、b)
}
错误消息是:“死机:运行时错误:无效内存地址或零指针取消引用”。实际错误是零指针取消引用

当指针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)
}
主程序包
进口(
“fmt”
)
func main(){
变量i int
变量p*int
布尔变量
b=i==*p
b=i=*p
i+=*p
i-=*p
i*=*p
i/=*p
i%=*p
i=*p>uint(i)
格式打印LN(i、p、b)
}

我不是说你的问题不相关,我认为有一个很好的理由不将其作为默认组件实现:这意味着在运行时进行更多的测试,我不希望我的程序的所有平等性测试都是这样

但是,一个专用表达式(例如像“==”这样的东西)确实(可能)是有用的


正如Nos所说,go nuts邮件列表可能是进行讨论的一个更具建设性的地方。

不是说你的问题不相关,我认为有一个很好的理由不将其作为默认组件实现:这意味着在运行时进行更多的测试,我不希望我的程序的所有平等测试都是这样

但是,一个专用表达式(例如像“==”这样的东西)确实(可能)是有用的


正如Nos所说,go nuts邮件列表可能是一个更具建设性的讨论场所。

这可能更适合gonots邮件列表,只是其中一个价值观?pugForm不是要比较的值,而是指向包含要比较的值的结构的指针。如果它是nil,它不会指向任何结构——取消引用它是一个程序逻辑错误。在gonots邮件列表中,这可能更适合于哪一个值?pugForm不是要比较的值,而是指向包含要比较的值的结构的指针。如果它是nil,它不会指向任何结构——取消引用它是一个程序逻辑错误。我认为,因为我只提到了比较,“”是不符合逻辑的(没有给出错误),因此相等性测试也不符合逻辑。我想,因为我只提到比较,所以“”是不符合逻辑的(没有给出错误),因此测试相等性也是不符合逻辑的。即使实现了这一点(我对此表示怀疑),它也不会“破坏”任何现有代码,也不会阻止对nil的测试。显然,它可能会产生意想不到的后果(非错误)。也许它会在某种程度上影响运行时。在某些情况下,它可能不必专门为它编写代码,从而改进运行时。让Go如此出色(IMHO)的是大量的小改进和创新,它们阻止我们永远说“为什么它不允许(或不允许)这个或那个?”。对我来说,这就是使用它的乐趣所在——用更少的资源做更多的事情。它不会破坏很多代码,但会减慢速度。这很有趣,但我不希望这个新特性取代我现有的快速测试。即使实现了(我对此表示怀疑),它也不会“破坏”任何现有代码,也不会阻止对nil的测试。显然,它可能会产生意想不到的后果(非错误)。也许它会在某种程度上影响运行时。在某些情况下,它可能不必专门为它编写代码,从而改进运行时。让Go如此出色(IMHO)的是大量的小改进和创新,它们阻止我们永远说“为什么它不允许(或不允许)这个或那个?”。对我来说,这就是使用它的乐趣所在——用更少的资源做更多的事情。它不会破坏很多代码,但会减慢速度。这很有趣,但我不希望这个新功能取代我现有的快速测试。