2011-05-20 71 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