Golang中var exp map[string]string和var exp = map[string]string有什么区别
Golang中var exp map[string]string和var exp = map[string]string有什么区别
var exp map[string]string
和
var exp = map[string]string
有什么区别
4 回复
确实如此
更多关于Golang中var exp map[string]string和var exp = map[string]string有什么区别的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
它也是引用类型吗?
首先,您发布的第二个表达式是无效的。它应该是:
var exp = map[string]string{}
第一个表达式声明了一个类型为 map[string]string 的 exp 变量。但这只是类型声明,由于映射未初始化,其当前持有的值为 nil。
第二个表达式同样声明了一个类型为 map[string]string 的 exp 变量,但初始化了映射。在这种情况下,
var exp = map[string]string{}
产生的结果与
var exp = make(map[string]string)
相同。
在Go语言中,这两种声明方式有本质区别:
1. var exp map[string]string
这种方式声明了一个nil map,它没有初始化,不能直接使用:
var exp map[string]string
fmt.Println(exp == nil) // 输出: true
// 以下操作会导致panic
// exp["key"] = "value" // panic: assignment to entry in nil map
2. var exp = map[string]string{}
这种方式声明并初始化了一个空的非nil map,可以直接使用:
var exp = map[string]string{}
fmt.Println(exp == nil) // 输出: false
// 可以直接使用
exp["name"] = "golang"
exp["version"] = "1.21"
fmt.Println(exp) // 输出: map[name:golang version:1.21]
完整示例对比:
package main
import "fmt"
func main() {
// 方式1: nil map
var exp1 map[string]string
fmt.Printf("exp1: %v, is nil: %t\n", exp1, exp1 == nil)
// 需要先初始化才能使用
exp1 = make(map[string]string)
exp1["test"] = "value"
// 方式2: 已初始化的空map
var exp2 = map[string]string{}
fmt.Printf("exp2: %v, is nil: %t\n", exp2, exp2 == nil)
// 可以直接使用
exp2["language"] = "Go"
fmt.Println("exp2:", exp2)
}
输出:
exp1: map[], is nil: true
exp2: map[], is nil: false
exp2: map[language:Go]
关键区别:第一种是nil map需要额外初始化,第二种是已经初始化的空map可以直接使用。

