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]stringexp 变量。但这只是类型声明,由于映射未初始化,其当前持有的值为 nil。

第二个表达式同样声明了一个类型为 map[string]stringexp 变量,但初始化了映射。在这种情况下,

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可以直接使用。

回到顶部