如何在Go中清除地图?

时间:2012-12-11 01:16:46

标签: go

我正在为原始类型.clear()寻找类似c ++函数map的内容。

或者我应该只创建一张新地图?

更新:感谢您的回答。通过查看答案,我才意识到有时候创建一个新地图可能会导致一些我们不想要的不一致。请考虑以下示例:

var a map[string]string
var b map[string]string

func main() {
    a = make(map[string]string)
    b=a
    a["hello"]="world"
    a = nil
    fmt.Println(b["hello"])
}

我的意思是,这仍然与c ++中的.clear()函数不同,后者将清除对象中的内容。

5 个答案:

答案 0 :(得分:70)

你应该只是创建一个新地图。没有理由去尝试清除现有的一个,除非多个代码引用相同的映射,并且一个明确需要清除值,以便其他代码片段可以看到此更改。 / p>

所以是的,你应该只是说

mymap = make(map[keytype]valtype)

如果您确实需要出于任何原因清除现有地图,这很简单:

for k := range m {
    delete(m, k)
}

答案 1 :(得分:10)

与C ++不同,Go是一种垃圾收集语言。你需要以不同的方式思考问题。

制作新地图时

a := map[string]string{"hello": "world"}
a = make(map[string]string)

原始地图最终将被垃圾收集;你不需要手动清除它。但请记住,地图(和切片)是参考类型;你用make()创建它们。只有在没有对它的引用时,底层映射才会被垃圾收集。 因此,当你做

a := map[string]string{"hello": "world"}
b := a
a = make(map[string]string)

原始数组不会被垃圾收集(直到b被垃圾收集或b指的是其他东西)。

答案 2 :(得分:2)

// Method - I , say book is name of map
for k := range book {
    delete(book, k)
}

// Method - II
book = make(map[string]int)

// Method - III
book = map[string]int{}

答案 3 :(得分:-2)

  

The value of an uninitialized map is nil

map = nil; 

应该这样做。当然,您需要创建一个新地图。

答案 4 :(得分:-2)

如果您尝试在循环中执行此操作,则可以利用初始化为您清除地图。例如:

for i:=0; i<2; i++ {
    animalNames := make(map[string]string)
    switch i {
        case 0:
            animalNames["cat"] = "Patches"
        case 1:
            animalNames["dog"] = "Spot";
    }

    fmt.Println("For map instance", i)
    for key, value := range animalNames {
        fmt.Println(key, value)
    }
    fmt.Println("-----------\n")
}

执行此操作时,它会清除上一个地图并以空地图开头。这由输出验证:

$ go run maptests.go 
For map instance 0
cat Patches
-----------

For map instance 1
dog Spot
-----------