🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 一、在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)