map初始化

一、初始化

对于空map请使用make(..)初始化,这样使得map的初始化和声明有较大不同,例如:

//bad usage
var (
  // m1 读写安全;
  // m2 在写入时会 panic
  m1 = map[T1]T2{}
  m2 map[T1]T2
)

//good usage
var (
  // m1 读写安全;
  // m2 在写入时会 panic
  m1 = make(map[T1]T2)
  m2 map[T1]T2
)

另外,如果map包含固定的元素列表,则使用map literals初始化映射。

//bad usage
m := make(map[T1]T2, 3)
m[k1] = v1
m[k2] = v2
m[k3] = v3

//good usage
m := map[T1]T2{
  k1: v1,
  k2: v2,
  k3: v3,
}

二、性能提升

map初始化时提供大致的容量大小信息。

make(map[T1]T2, hint)

make()提供容量信息尝试在初始化时调整map大小,这减少了在将元素添加到map时增长和分配的开销。**注意,map不能保证分配hint个容量。因此,即使提供了容量,添加元素仍然可以进行分配。

//bad usage
m := make(map[string]os.FileInfo)

files, _ := ioutil.ReadDir("./files")
for _, f := range files {
    m[f.Name()] = f
}

//good usage
files, _ := ioutil.ReadDir("./files")

m := make(map[string]os.FileInfo, len(files))
for _, f := range files {
    m[f.Name()] = f
}

Last updated

Was this helpful?