Go语言中new和 make的区别详解
1、new 的主要特性
创新互联致力于互联网品牌建设与网络营销,包括做网站、网站制作、SEO优化、网络推广、整站优化营销策划推广、电子商务、移动互联网营销等。创新互联为不同类型的客户提供良好的互联网应用定制及解决方案,创新互联核心团队10年专注互联网开发,积累了丰富的网站经验,为广大企业客户提供一站式企业网站建设服务,在网站建设行业内树立了良好口碑。
首先 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)。
make的用法
make的用法如下:
1、make+宾语+不带to的不定式(作宾语补足语)。
如:Nobody made us go to bed at a certain time.
没有人让我们在某一固定时间就寝。
2、make+形容词(短语)+名词短语时,是一种倒装结构。为使句子结构保持平衡,通常将较长的名词短语移置补足语之后,不加引导词汇作形式宾语。
如:The telescope made possible the observation of the far-off stars.
望远镜使人们能够观察遥远的星球。
3、make +宾语+名词(作宾语补足语)。
如:Bill Gates’ Microsoft makes him a phenomenon in the business world.
比尔·盖茨的微软使他成为商界的一个奇才。
4、make +宾语+形容词(作宾语补足语)。
如:Unfortunately, this function also makes estuaries very sensitive to enviro-mental pollution.
不幸的是,这个作用也使河口对环境污染很敏感。
go语言循环队列的实现
队列的概念在 顺序队列 中,而使用循环队列的目的主要是规避假溢出造成的空间浪费,在使用循环队列处理假溢出时,主要有三种解决方案
本文提供后两种解决方案。
顺序队和循环队列是一种特殊的线性表,与顺序栈类似,都是使用一组地址连续的存储单元依次存放自队头到队尾的数据元素,同时附设队头(front)和队尾(rear)两个指针,但我们要明白一点,这个指针并不是指针变量,而是用来表示数组当中元素下标的位置。
本文使用切片来完成的循环队列,由于一开始使用三个参数的make关键字创建切片,在输出的结果中不包含nil值(看起来很舒服),而且在验证的过程中发现使用append()函数时切片内置的cap会发生变化,在消除了种种障碍后得到了一个四不像的循环队列,即设置的指针是顺序队列的指针,但实际上进行的操作是顺序队列的操作。最后是对make()函数和append()函数的一些使用体验和小结,队列的应用放在链队好了。
官方描述(片段)
即切片是一个抽象层,底层是对数组的引用。
当我们使用
构建出来的切片的每个位置的值都被赋为interface类型的初始值nil,但是nil值也是有大小的。
而使用
来进行初始化时,虽然生成的切片中不包含nil值,但是无法通过设置的指针变量来完成入队和出队的操作,只能使用append()函数来进行操作
在go语言中,切片是一片连续的内存空间加上长度与容量的标识,比数组更为常用。使用 append 关键字向切片中追加元素也是常见的切片操作
正是基于此,在使用go语言完成循环队列时,首先想到的就是使用make(type, len, cap)关键字方式完成切片初始化,然后使用append()函数来操作该切片,但这一方式出现了很多问题。在使用append()函数时,切片的cap可能会发生变化,用不好就会发生扩容或收缩。最终造成的结果是一个四不像的结果,入队和出队操作变得与指针变量无关,失去了作为循环队列的意义,用在顺序队列还算合适。
参考博客:
Go语言中的Nil
Golang之nil
Go 语言设计与实现
make的七种用法
1、make语+名词。2、make宾语+动词原形。3、make宾语+形容词。4、make宾语+过去分词(作宾语补足语)。5、make语+介词短语(作宾语补足语)。6、make宾语+从句(作宾语补足语)。7、make形式宾语i形容词或名词(做宾语补足语)+带to的不定式作真正的宾语。 扩展资料 1、make语+名词(作宾语补足语)。Most pop singers make music their career。大多数流行歌手把音乐当作他们的职业。2、make宾语+动词原形(作宾语语补足语)。Nobody made us go to bed at a certain time没有人让我们在某一固定时间就寝。3、make宾语+形容词(作宾语补足语)。But I was happy to help because i knew it was to realize our dreamf making black and white people equal但是我乐于帮忙,因为我知道,这是为了实现我们黑人和白人平等的梦想。4、make宾语+过去分词(作宾语补足语)。The teacher raised his voice so that he could make himself heard那个老师提高了嗓门以便别人能听到他。5、make语+介词短语(作宾语补足语)。You made him into an honest one你使他成为一个诚实的'人。6、make宾语+从句(作宾语补足语)。We will soon make our school what your school is now我们不久就要把我们的学校发展成你们学校目前的那个样子。7、make形式宾语i形容词或名词(做宾语补足语)+带to的不定式作真正的宾语。This makes it possible for agriculture and industry to develo这使工农业有可能很快发展。
网站题目:go语言make的用法 go中的make
网页路径:http://lswzjz.com/article/dogicgp.html