```go
var mm = make(map[int]string) //这个是用make申明
fmt.Println(mm) //输出map[]
var mm2 map[int]string //这个是像普通类型一样申明
fmt.Println(mm2) //输出map[]
mm = map[int]string{9:"nine", 7:"seven"}
mm2 = map[int]string{8:"eight", 4:"four"}
fmt.Println(mm)
fmt.Println(mm2)
```
go中 为什么需要用make来初始化?直接像普通数据类型一样用var申明不就好了吗?我看效果也是一样的,有什么区别?
`var mm = make(map[int]string)` 跟 `var mm2 map[int]string ` 感觉都给变量初始化了。
用new的场合极少,目前暂时没遇到过. 当然,有的面试会问这个区别的.区别涉及一些底层原理.
用make有时的确需要申明最大空间或预留容量.实际工程我就用过.因为我非常清楚需求多大空间来避免多次扩容带来的性能损失.
像slice每次扩容在小于1024都是2倍扩容,一扩容就要引起数据拷贝.
#5
更多评论
```golang
package main
import "fmt"
func main() {
var mm = make(map[int]string) //这个是用make申明,make 的作用是初始化内置的数据结构,可以对切片、哈希表和 Channel进行初始化;
fmt.Println(mm==nil) //输出map[],这里的mm2 不是nil值
var mm2 map[int]string //这个是像普通类型一样申明,这里的mm2 是nil值
fmt.Println(mm2==nil) //输出map[]
mm = map[int]string{9:"nine", 7:"seven"}
mm2 = map[int]string{8:"eight", 4:"four"}
fmt.Println(mm)
fmt.Println(mm2)
}
```
* Q:go中 为什么需要用make来初始化
* A: make 可以进行内存的预分配
* Q:直接像普通数据类型一样用var申明不就好了吗?我看效果也是一样的,有什么区别?
* A: 这两者是有区别的,见上面代码注释
#1
* 实际工程中可以使用 map[int]string{}{}代替,减少心智负担,什么new ,make 都不需要
* 当然有些场景是只需要类型的,用于反射获取类型,比如errors.Is就是这么干的
* struct{}{},[]int{},map[int]int{}一梭子干到底
#2