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 {} {} == {} false
Go 编程语言规范
变量声明
变量声明创建一个或多个变量,将相应的标识符绑定到它们,并为每个变量赋予一个类型和一个初始值。
如果给出了一个表达式列表,则变量将使用遵循赋值规则的表达式进行初始化。否则,每个变量都被初始化为其零值。
如果存在类型,则每个变量都被赋予该类型。否则,每个变量在赋值中被赋予相应初始化值的类型。
在您的示例中,您可以声明一个没有初始值的类型变量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 关注
- 91 浏览
添加回答
举报