Golang后端面试题
1、以下两种写法有什么区别
func (param CreateOrderParam) Create() {
func (param *CreateOrderParam) Create() {
给方法绑定了一个指针类型的结构体
指针那个可以直接修改结构体的数据,而非指针的那个不行
2.定义一个包内全局字符串变量,下面语法正确的是(A)
A. var str string
B. str:= “”
C.str=""
D. varstr= “”
3、协程和线程有什么区别
线程:cpu切换多个进程的时候,会花费不少的时间,因为切换进程需要切换到内核态,而每次调度需要内核态都需要读取用户态的数据,进程一旦多起来,cpu调度会消耗一大堆资源,因此引入了线程的概念,线程本身几乎不占有资源,他们共享进程里的资源,内核调度起来不会那么像进程切换那么耗费资源。
总结:线程是用来进行内核调度进行共享资源,系统执行。
协程:协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此,协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作执行者则是用户自身程序,goroutine也是协程。
总结:拥有属于自己的寄存器,在切换回来时恢复保存在上下文的栈,用户自身程序执行。
区别:线程和协同程序的主要不同在于:在多处理器情况下,从概念上来讲多线程程序同时运行多个线程;
而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只在必要时才会被挂起。
4、
for k ,V := range itemSlice {
这里k和v在使用上有什么区别
此题主要考的是迭代遍历的问题:range常被用来迭代数组,切片,字典等元素的内置关键字。
k和v 是Key_Value ,key 是键(下标位置),value是值(内容)。
5、go语言中的switch case和其他语言,如java, php中的switch case语句有什么区别
Go 语言的 switch 中的每一个 case 与 case 间是独立的代码块,不需要通过 break 语句跳出当前 case 代码块以避免执行到下一行。
Java中switch case执行时,一定会先进行匹配,匹配成功返回当前case的值,再根据是否有break,判断是否继续输出,或是跳出判断等。
6、go vendor 有什么作用
Go vendor是Golang的依赖包管理工具,它的出现可以避免不同用户在合并同一个项目后从外部获取不同依赖库版本的问题。
7、gin框架中的gin.Context和go语言中原生的Context有什么区别
gin.Context是一个结构体
go原生的context是上下文
8、go test的时候,如何在命令行输出调试信息,请写-个简单的示例
9、defer 函数的用途
在Go语言中,可以使用关键字defer向函数注册退出调用。
在函数退出时,defer后的函数才被调用。defer语句的作用是不管程序是否出现异常,均在函数退出时自动执行相关代码。
9、你常用的项目结构(写出顶级的文件夹名称)
Beego框架,mvc框架
11、gorm 中的Preload特性作用是什么
|
请发表评论