2 回答
TA貢獻1876條經驗 獲得超7個贊
Go 編程語言規范
索引表達式
對于映射類型 M 的 a:如果映射為 nil 或不包含這樣的條目,則 a[x] 是 M 的元素類型的零值。
零值
當通過聲明或調用 new 為變量分配存儲空間時,或者通過復合文字或調用 make 創建新值時,并且沒有提供顯式初始化,則給出變量或值一個默認值。此類變量或值的每個元素都設置為其類型的零值:布爾值為 false,數字類型為 0,字符串為 "",指針、函數、接口、切片、通道和映射為 nil。
Go 編程語言規范
復合文字
復合文字為結構體、數組、切片和映射構造值,并在每次計算它們時創建一個新值。它們由文字類型和后跟大括號綁定的元素列表組成。每個元素前面可以有一個相應的鍵。對于結構文字,以下規則適用:
文字可以省略元素列表;這樣的文字對其類型求值為零值。
對于您的示例,鍵入struct{},省略復合文字中的元素列表,struct{}{},作為零值。
例如,
package main
import "fmt"
func main() {
? ? m := map[string]struct{}{}
? ? val, ok := m["foo"]
? ? fmt.Printf("%T %v\n", val, val)
? ? if val == struct{}{} {
? ? ? ? fmt.Println("==", val, ok)
? ? }
}
輸出:
struct?{}?{}
==?{}?falseGo 編程語言規范
變量聲明
變量聲明創建一個或多個變量,將相應的標識符綁定到它們,并為每個變量賦予一個類型和一個初始值。
如果給出了一個表達式列表,則變量將使用遵循賦值規則的表達式進行初始化。否則,每個變量都被初始化為其零值。
如果存在類型,則每個變量都被賦予該類型。否則,每個變量在賦值中被賦予相應初始化值的類型。
在您的示例中,您可以聲明一個沒有初始值的類型變量struct{},該變量將被初始化為該struct{}類型的零值。
例如,
package main
import "fmt"
func main() {
? ? m := map[string]struct{}{}
? ? val, ok := m["foo"]
? ? fmt.Printf("%T %v\n", val, val)
? ? var zeroValue struct{}
? ? if val == zeroValue {
? ? ? ? fmt.Println("==", val, ok)
? ? }
}
輸出:
struct {} {}
== {} false
TA貢獻1836條經驗 獲得超13個贊
你當然可以做你上面所做的。與 nil 進行比較取決于您在 map 中的值類型。如果是,interface{}你可以將它與 nil 進行比較:
m := map[string]interface{}{}
val, _ := m["foo"]
if val == nil {
fmt.Println("no index")
}
- 2 回答
- 0 關注
- 147 瀏覽
添加回答
舉報
