Go语言中new和 make的区别详解

Python019

Go语言中new和 make的区别详解,第1张

1、new 的主要特性

首先 new 是内建函数,定义也很简单:

func new(Type) *Type

内建函数 new 用来分配内存,第一个参数是一个类型,不是一个值,返回值是一个指向新分配类型零值的指针

实现一个类似 new 的功能:

func newInt() *int {

var i int

return &i

}

someInt := newInt()

函数的功能跟 someInt := new(int) 一模一样。定义 new 开头的函数时,出于约定也应该返回类型的指针。

2、make 的主要特性

make 也是内建函数,定义比 new 多了一个参数,返回值也不同:

func make(Type, size IntegerType) Type

内建函数 make 用来为 slice,map 或 chan 类型分配内存和初始化一个对象(注意:只能用在这三种类型上),跟 new 类似,第一个参数也是一个类型而不是一个值,跟 new 不同的是,make 返回类型的引用而不是指针,而返回值也依赖于具体传入的类型,具体说明如下:

Slice: 第二个参数 size 指定了长度,容量和长度相同。

可以传入第三个参数来指定不同的容量值,但必须不能比长度值小。

比如 make([]int, 0, 10)

Map: 根据 size 大小来初始化分配内存,不过分配后的 map 长度为 0,如果 size 被忽略了,那么会在初始化分配内存时分配一个小尺寸的内存

Channel: 管道缓冲区依据缓冲区容量被初始化。如果容量为 0 或者忽略容量,管道没有缓冲区。

3、总结

new 的作用是初始化一个指向类型的指针(*T),make 的作用是为 slice,map 或 chan 初始化并返回引用(T)。

类的成员函数 有时也称为 方法 。因此,方法可以认为是传统面向对象中 类的成员函数 。不同的是,go中方法可以绑定到任何类型上,但是成员函数只能属于类。

用来描述主调方法,就像向对象发送消息。

不允许本身是指针的类型进行方法声明。

与继承的不同,组合中的顺序也是无意义的。

参考一等函数,方法做变量

首字母大小写,要封装一个对象,只能通过结构体。

Get转到定义是如下代码,

func (c *Client) Get(url string) (resp *Response, err error) {

req, err := NewRequest("GET", url, nil)

if err != nil {

return nil, err

}

return c.Do(req)

}

看上去已经有足够多的动作了,并不是你说的只是一个接口啊