2017-10-11 20 views
1

字符串""的「nil」值對我有意義,但0是合法的數字。例如,房間裏的人數可以是0,但是一個人的名字不能是""。這次大會背後的推理是什麼?爲什麼數字0的「無」值?

(編輯)附加信息:

我希望做的是有測試的方式,如果一個值已設置了許多。將某人的姓名設置爲""顯然不正確,而將整數設置爲零可能是合法的。有沒有一種典型的方法來解決這種情況?

+4

''「''也是一個合法的字符串。在Go中,只有指針和接口值可以爲零,所以實際上沒有辦法使數字爲零。 – Peter

+5

也許你的意思是[零值](https://golang.org/ref/spec#The_zero_value)的數字? – putu

+2

'nil'(或其他語言的'null' /'NULL')是不相同的或者是空字符串或零的替換。這是一個概念,表示沒有任何價值,一個未知的價值或一個在上下文中無關緊要的價值。空字符串是一個無效的人名,但'nil'可能是一個完全有效的值。這意味着這個名字還不知道。 – axiac

回答

7

一個字符串""的「nil」價值對我來說很有意義,但0是一個合法的數字。

有兩個明顯的問題,您的發言:

  1. 有作爲一個字符串一個nil」值沒有這樣的事。
  2. ""是一個完全合法的字符串。

您似乎將Go的「零值」概念與零混淆。這些概念幾乎完全不相關。

  • 字符串的零值爲""
  • 一個數字的零值是0
  • 指針或接口的零值爲nil。這是nil和「零值」真正相互關聯的唯一地方。

其他字符串,數字和其他具體類型在Go中不可能是nil。 (指向這些類型的指針可以是,但明顯不同)。因此,談論「一個字符串的零值」或「零值的數字」甚至都沒有意義。


作爲對您編輯的迴應,此問題已在各種情況下得到解答。有關與JSON解組相關的示例,請參閱here。總而言之,您必須使用除數字/字符串類型之外的其他東西。使用指針或包裝類型(例如sql.NullInt64)。

3

A 指定的有效的的值必須選擇的類型的值。還有什麼可以更有資格成爲zero-value

nil不是數值類型(如intuintint32等)的一個有效的值,所以這是不可能的。

0具有在二進制表示中全零的好處。它的名字也符合「零值」

也許-1?二進制表示中的-1是完整的表示(使用2's complement表示)。 -1沒有特別之處。

那麼也許最小值?在int32的情況下,將是-1 << 31,這是-2147483648。但是如果類型是無符號的,例如uint32,那將再次爲0。此外,採用int類型的最小值甚至不是一個常數,因爲它取決於目標架構(可能是-1 << 31-1 << 63)。

如果0是你使用一個值,你要區分它是否已經被設置(或者,如果該值只作爲零值),使用指針(如*int)也可以有一個nil值(零值)表示尚未設置。

另一種選擇是使用第二個變量(可能是bool類型),它的值爲true,表示已設置數量。

而且多種技術(選擇一個聰明,未使用有效值),檢查出How do I represent an Optional String in Go?

0

對於string,默認值是"";對於bool,默認值爲false;對於int,默認值爲0

您可以使用指針。

var num *int 
if num == nil { 
    // num is not set 
} else { 
    // num is set 
    if *num == 0 { 
     // num is set to 0 
    } else { 
     // num is set to another integer 
    } 
} 

以同樣的方式,您可以判斷是否設置了布爾值。

0

有沒有一種典型的方法來解決這種問題?

空字符串或零是否爲有效/無效值取決於應用程序。一個空名稱可能對您的應用程序無效,但在其他情況下可能有效。

在Go中處理這個問題的一種方法是創建一個結構體並在其中表示您是否具有該值。例如:

type Person struct { 
    Name string 
    HasName bool 
    Age  int 
    HasAge bool 
} 

這似乎對於這樣一個人爲的例子有點麻煩,但在更復雜的場景具有額外字段的開銷是最小的。