## 一、在go语言中,new和make的区别?
new 的作用是初始化一个指向类型的指针(\*T)
new函数是内建函数,函数定义:func new(Type) \*Type
使用new函数来分配空间。传递给`new`函数的是一个**类型**,不是一个值。返回值是 指向这个新分配的零值的**指针**。
make 的作用是为 slice,map 或 chan 初始化并返回引用(T)。
make函数是内建函数,函数定义:func make(Type, size IntegerType) Type
· 第一个参数是一个类型,第二个参数是长度
· 返回值是一个类型
`make(T, args)`函数的目的与`new(T)`不同。它仅仅用于创建 Slice, Map 和 Channel,并且返回类型是 T(不是T\*)的一个初始化的(不是零值)的实例。
## 二、在go语言中,Printf()、Sprintf()、Fprintf()函数的区别用法是什么?
都是把格式好的字符串输出,只是输出的目标不一样:
Printf(),是把格式字符串输出到标准输出(一般是屏幕,可以重定向)。
Printf() 是和标准输出文件(stdout)关联的,Fprintf 则没有这个限制.
Sprintf(),是把格式字符串输出到指定字符串中,所以参数比printf多一个char\*。那就是目标字符串地址。
Fprintf(), 是把格式字符串输出到指定文件设备中,所以参数笔printf多一个文件指针FILE\*。主要用于文件操作。Fprintf()是格式化输出到一个stream,通常是到文件。
## 三、说说go语言中,数组与切片的区别?
(1). 数组 数组是具有固定长度且拥有零个或者多个相同数据类型元素的序列。 数组的长度是数组类型的一部分,所以\[3\]int 和 \[4\]int 是两种不同的数组类型。
数组需要指定大小,不指定也会根据初始化的自动推算出大小,不可改变 ;
数组是值传递;
数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值。在初始化后长度是固定的,无法修改其长度。当作为方法的参数传入时将复制一份数组而不是引用同一指针。数组的长度也是其类型的一部分,通过内置函数len(array)获取其长度。
数组定义:
~~~
var array [10]intvar array = [5]int{1,2,3,4,5}
~~~
(2). 切片 切片表示一个拥有相同类型元素的可变长度的序列。 切片是一种轻量级的数据结构,它有三个属性:指针、长度和容量。
切片不需要指定大小;
切片是地址传递;
切片可以通过数组来初始化,也可以通过内置函数make()初始化 .初始化时len=cap,在追加元素时如果容量cap不足时将按len的2倍扩容;
切片定义:
~~~
var slice []type = make([]type, len)
~~~
## 四、解释以下命令的作用?
go env: #用于查看go的环境变量
go run: #用于编译并运行go源码文件
go build: #用于编译源码文件、代码包、依赖包
go get: #用于动态获取远程代码包
go install: #用于编译go文件,并将编译结构安装到bin、pkg目录
go clean: #用于清理工作目录,删除编译和安装遗留的目标文件
go version: #用于查看go的版本信息
## 五、说说go语言中的协程?
协程和线程都可以实现程序的并发执行;
通过channel来进行协程间的通信;
只需要在函数调用前添加go关键字即可实现go的协程,创建并发任务;
关键字go并非执行并发任务,而是创建一个并发任务单元;
## 六、说说go语言中的for循环?
for循环支持continue和break来控制循环,但是它提供了一个更高级的break,可以选择中断哪一个循环 for循环不支持以逗号为间隔的多个赋值语句,必须使用平行赋值的方式来初始化多个变量
## 七、说说go语言中的switch语句?
单个case中,可以出现多个结果选项
只有在case中明确添加fallthrough关键字,才会继续执行紧跟的下一个case
## 八、 go语言中没有隐藏的this指针,这句话是什么意思?
方法施加的对象显式传递,没有被隐藏起来
golang的面向对象表达更直观,对于面向过程只是换了一种语法形式来表达
方法施加的对象不需要非得是指针,也不用非得叫this
## 九、go语言中的引用类型包含哪些?
数组切片、字典(map)、通道(channel)、接口(interface)
## 十、 go语言中指针运算有哪些?
可以通过“&”取指针的地址
可以通过“\*”取指针指向的数据
## 十一、说说go语言的main函数
main函数不能带参数
main函数不能定义返回值
main函数所在的包必须为main包
main函数中可以使用flag包来获取和解析命令行参数
## 十二、说说go语言的同步锁?
(1) 当一个goroutine获得了Mutex后,其他goroutine就只能乖乖的等待,除非该goroutine释放这个Mutex
(2) RWMutex在读锁占用的情况下,会阻止写,但不阻止读
(3) RWMutex在写锁占用情况下,会阻止任何其他goroutine(无论读和写)进来,整个锁相当于由该goroutine独占
## 十三、说说go语言的channel特性?
A. 给一个 nil channel 发送数据,造成永远阻塞
B. 从一个 nil channel 接收数据,造成永远阻塞
C. 给一个已经关闭的 channel 发送数据,引起 panic
D. 从一个已经关闭的 channel 接收数据,如果缓冲区中为空,则返回一个零值
E. 无缓冲的channel是同步的,而有缓冲的channel是非同步的
## 十四、go语言触发异常的场景有哪些?
A. 空指针解析
B. 下标越界
C. 除数为0
D. 调用panic函数
## 十五、说说go语言的beego框架?
A. beego是一个golang实现的轻量级HTTP框架
B. beego可以通过注释路由、正则路由等多种方式完成url路由注入
C. 可以使用bee new工具生成空工程,然后使用bee run命令自动热编译
## 十六、说说go语言的goconvey框架?
A. goconvey是一个支持golang的单元测试框架
B. goconvey能够自动监控文件修改并启动测试,并可以将测试结果实时输出到web界面
C. goconvey提供了丰富的断言简化测试用例的编写
## 十七、go语言中,GoStub的作用是什么?
A. GoStub可以对全局变量打桩
B. GoStub可以对函数打桩
C. GoStub不可以对类的成员方法打桩
D. GoStub可以打动态桩,比如对一个函数打桩后,多次调用该函数会有不同的行为
## 十八、说说go语言的select机制?
A. select机制用来处理异步IO问题
B. select机制最大的一条限制就是每个case语句里必须是一个IO操作
C. golang在语言级别支持select关键字
## 十九、说说进程、线程、协程之间的区别?
进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元;
同一个进程中可以包括多个线程;
进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束;
线程共享整个进程的资源(寄存器、堆栈、上下文),一个进程至少包括一个线程;
进程的创建调用fork或者vfork,而线程的创建调用pthread\_create;
线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源;
进程是资源分配的单位
线程是操作系统调度的单位
进程切换需要的资源很最大,效率很低 线程切换需要的资源一般,效率一般 协程切换任务资源很小,效率高 多进程、多线程根据cpu核数不一样可能是并行的 也可能是并发的。协程的本质就是使用当前进程在不同的函数代码中切换执行,可以理解为并行。 协程是一个用户层面的概念,不同协程的模型实现可能是单线程,也可能是多线程。
进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。(全局变量保存在堆中,局部变量及函数保存在栈中)
线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是这样的)。
协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。
一个应用程序一般对应一个进程,一个进程一般有一个主线程,还有若干个辅助线程,线程之间是平行运行的,在线程里面可以开启协程,让程序在特定的时间内运行。
协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力。
[推荐文章](http://www.jishuchi.com/read/go-interview/3435)
- 一、经典(一)
- 二、经典(二)
- 三、经典(三)
- 四、经典(四)
- 五、经典(五)
- 六、经典(六)
- 七、经典(七)
- 八、经典(八)
- 九、经典(九)
- 十、经典(十)
- 十一、经典(十一)
- 十二、经典(十二)
- 其他
- 1、知识点一
- 2、面试集
- 3、负载均衡原理
- 4、LVS相关了解
- 5、微服务架构
- 6、分布式锁实现原理
- 7、Etcd怎么实现分布式锁
- 8、Redis的数据结构有哪些,以及实现场景
- 9、Mysql高可用方案有哪些
- 10、Go语言的栈空间管理是怎么样的
- 11、Goroutine和Channel的作用分别是什么
- 12、Go中的锁有哪些?三种锁,读写锁,互斥锁,还有map的安全的锁?
- 13、怎么限制Goroutine的数量
- 14、Goroutine和线程的区别?
- 15、中间件原理