1.内建函数make和new的区别
首先make和new均是Go语言的内置的用来分配内存的函数。但是适用的类型不同:前者适用于slice ,map,channel 等引用类型,后者用于int型,数组,结构体等值类型。
其次,两者的函数形式及调用形式不同,函数形式如下:
func make(t Type,size ...IntegerType)Type
func new(Type)*Type
前者返回一个值,后者返回一个指针。
使用上,make返回初始化之后的类型的引用,new会为类型的新值分配已置零的内存空间,并返回指针。例如:
s:=make([]int,0,10)//使用make创建一个长度为0,容量为10的切片
a:=new(int)//使用new分配一个零值的int型
*a=5
思考?类似于make函数的声明里参数类型前的三个点:“...”有什么作用呢?
“...”表示可以传一个或多个实参,这使得函数调用更加灵活。例如:
func append(slice []Type, elems ...Type)[]Type
2.Go语言中进程,协程,线程之间的关系
进程(process):程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。
线程(thread):操作系统基于进程开启的轻量级进程,是操作系统调度执行的最小单位。
协程(coroutine):非操作系统提供而是由用户自行创建和控制的用户态“线程”,比线程更轻量级。
进程、线程和协程的联系:
线程是进程的子集,也称为轻量级进程。进程包含线程,一个进程可以有一个或者多个线程,一个进程内的所有线程都是相互关联的。进程和线程都是为了解决并发编程。线程的效率要高于进程,因为多个线程可以共享一份资源,而进程与进程之间是独立的。协程既不是进程也不是线程,协程仅是一个特殊的函数。协程、进程和线程不是一个维度的。一个进程可以包含多个线程,一个线程可以有多个协程,一个进程也可以单独拥有多个协程。
进程和线程的区别:
进程是操作系统分配资源的最小单位,线程是操作系统调度(程序执行)的最小单位。进程具有独立性,进程A的崩溃不会影响到进程B的崩溃;在一个进程中的多个线程是共享一份资源的,一个线程的崩溃可能会影响到该进程中其他线程的崩溃,进而导致整个进程崩溃。进程间的通信需要在内核中进行,而线程因为共享一份资源可以直接进行通信。
协程和线程的区别:
1、线程进程都是同步机制,而协程则是异步。
2、协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力。
3、进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。
4、线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。
3.go语⾔中指针的运算; 定义一个结构体,其中的元素大小写区别
1、可以通过“&”取指针的地址 ;可以通过“*”取指针指向的数据 。
2、大写表示对此作用域外的地方也可见(公开访问) ,小写只对此作用域可见(私有,仅在定义当前结构体的包中可访问)。