new 主要用于结构体的初始化
创新互联专注于徐汇企业网站建设,成都响应式网站建设公司,商城网站建设。徐汇网站建设公司,为徐汇等地区提供建站服务。全流程按需规划网站,专业设计,全程项目跟踪,创新互联专业和态度为您提供的服务
make用于数组array,切片slice,协程chnnel的初始化
例如: users:=make([10]int);
msg:=make(chan int);
new会分配结构空间,并初始化为清空为零,不进一步初始化
new之后需要一个指针来指向这个结构
make会分配结构空间及其附属空间,并完成其间的指针初始化
make返回这个结构空间,不另外分配一个指针
例子new:
var p *[]int = new([]int)
或
p := new([]int)
以上分配了一个slice结构,但是结构中的应该指向底层数组的ptr指针为空,故实际不能往这个slice里面存取数据
同时分配了一个指针p,也即(在32位系统中)占4个字节并存放slice结构的地址
例子make:
var v []int = make([]int, 0)
v := make([]int, 0)
以上分配了一个slice结构,且结构中的应该指向底层数组的ptr指针已经指向了某个底层数组,这个底层数组应该已经分配了,故这个slice已经可以使用了
注意v就是这个slice结构,而不是一个指向slice的指针
上述仅是示例,一般使用时都会明确长度和容量:v := make([]int, 10, 50)
结论:
由上可见,用new来分配slice的意义不大,因为没有恰当的初始化,无法直接使用
有附带空间的结构,使用make来初始化,可以完成内部指针初始化,其后可以立即使用
要判断数据类型用Go空接口: 建函数t 设置参数i 类型空接口空接口接受任何数据类型 func t(i interface{}) { //函数t 参数i switch i.(type) { //选语句switch case string: //字符做事情 case int: //整...
队列的概念在 顺序队列 中,而使用循环队列的目的主要是规避假溢出造成的空间浪费,在使用循环队列处理假溢出时,主要有三种解决方案
本文提供后两种解决方案。
顺序队和循环队列是一种特殊的线性表,与顺序栈类似,都是使用一组地址连续的存储单元依次存放自队头到队尾的数据元素,同时附设队头(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 语言设计与实现
new是内建函数,作用是初始化一个指向类型的指针,make的作用是slice,map或chan初始化并返回引用,第一个参数是一个类型,第二个参数是长度。
方法名与对象相关,函数名与对象无关,其实区别不大.有时需要面向对象思想时用方法名喽.