Go基础面试

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、大写表示对此作用域外的地方也可见(公开访问) ,小写只对此作用域可见(私有,仅在定义当前结构体的包中可访问)。

你可能感兴趣的:(Go基础面试)