2 回答

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