Z.S.K.'s Records

golang学习(使用new跟make)

golang中经常会用到make来初始化变量, 另外还有new也可以用来定义及初始化变量,这两者有啥区别呢?

new(T)

func new(Type) *Type

new(T)会为T类型的新项目,分配被置零的存储,并且返回它的地址,一个类型为*T的值

1
2
3
4
5
6
7
8
9
p1 := new(int)
fmt.Printf("p1 --> %#v \n ", p1) //(*int)(0xc42000e250)
fmt.Printf("p1 point to --> %#v \n ", *p1) //0

var p2 *int
i := 0
p2 = &i
fmt.Printf("p2 --> %#v \n ", p2) //(*int)(0xc42000e278)
fmt.Printf("p2 point to --> %#v \n ", *p2) //0

一般情况下, 能够使用new的方式也可以使用下面这种方式,效果是一样的.

new不常用

make(T)

make只能用于初始化slice, map, channel这三种数据类型.

slice 的零值是 nil,使用 make 之后 slice 是一个初始化的 slice,即 slice 的长度、容量、底层指向的 array 都被 make 完成初始化,此时 slice 内容被类型 int 的零值填充,形式是 [0 0 0],map 和 channel 也是类似的

1
2
3
4
5
6
7
8
9
10
11
// Slice
var aSlice []int
fmt.Println(aSlice == nil, aSlice) // true, nil
bSlice := make([]int, 1, 2) // 定义一个len=1, cap=2的slice
fmt.Println(bSlice == nil, bSlice) // false, [0, 0]

// map
bMap := make(map[int]int, 5)

// channel
aChan := make(chan int, 100) // 长度为100的channel

两者区别

主要的区别分为两点:

  1. 两者都是内建函数
  2. make的作用是初始化内置的数据结构,只能用于slice, map, channel这3种结构, 返回对应的数据类型
  3. new只接收一种类型, 根据传入的类型在堆上分配一片内存空间并返回指向这片内存空间的指针
  4. 在内存上分配上很难说使用两者golang编译器会如何进行分配, 关于内存分配可再深入研究一番.

参考文章:

转载请注明出处https://izsk.me

Z.S.K. wechat
Scan Me To Read on Phone
I know you won't do this,but what if you did?