Go语言基础面试题

2023-11-17

一、选择题
1.关于异常设计,下面说法正确的是()

A. 在程序开发阶段,坚持速错,让程序异常崩溃 // 开发--测试--准生产--生产
B. 在程序部署后,应恢复异常避免程序终止
C. 一切皆错误,不用进行异常设计
D. 对于不应该出现的分支,使用异常处理

参考答案:ABD

2.关于异常的触发,下面说法正确的是()

A. 空指针解析
B. 下标越界
C. 除数为0
D. 调用panic函数

参考答案:ABCD

3.关于函数返回值的错误设计,下面说法正确的是()

A. 如果失败原因只有一个,则返回bool
B. 如果失败原因超过一个,则返回error
C. 如果没有失败原因,则不返回bool或error
D. 如果重试几次可以避免失败,则不要立即返回bool或error

参考答案:ABCD

4.下面关于recover使用正确的是?

A.recover()
B.defer recover()
C.defer func() {
recover()
}()
D. defer func() {
defer func() {
recover()
}()
}()


答案:C。recover() 必须在 defer() 函数中直接调用才有效。,不能嵌套使用,不能直接使用

5.函数执行时,如果由于 panic 导致了异常,则延迟函数不会执行。这一说法是否正确?

A. 正确
B. 错误
参考答案及解析:B。 defer结合recover可以修复panic
6.错误是业务过程的一部分,而异常不是,这句话是否正确()

A.正确

B.错误

答案:A。异常是要避免的

二、简答题
1.写出下面代码的输出

package main

import "fmt"

func main() {
defer_all()
panic("触发异常")
}

func defer_all() {
defer func() {
fmt.Println("打印前")
}()
defer func() {
fmt.Println("打印中")
}()
defer func() {
fmt.Println("打印后")
}()
}

这道题主要考察的是对 defer 的理解,defer 主要是延迟函数,延迟到调用者函数执行 return 命令之前

2.写出下面代码的执行结果

package main

import (
"fmt"
)

func main() {
defer_call()
}

func defer_call() {
defer func() { fmt.Println("打印前") }()
defer func() { fmt.Println("打印中") }()
defer func() { fmt.Println("打印后") }()
panic("触发异常")
}

打印后
打印中
打印前
panic: 触发异常


参考解析:defer 的执行顺序是先进后出,后进先出
当出现 panic 语句的时候,会先按照 defer 的后进先出的顺序执行,最后才会执行panic

3.下面代码的执行结果为?

package main

import "fmt"

func main() {
a := 1
b := 2
defer Sum( a, b)
a = 3
defer Sum( a, b)
b = 4
}

func Sum(a, b int) {
ret := a + b
fmt.Println(a, b, ret)
}



答案:defer先进后出,后进先出

4.下面代码能正常编译吗?

package main

import "fmt"

func main() {
nil := 1
var map_data map[string]int = nil
fmt.Println(map_data)
}


答案:不能,此时的nil是int类型的变量

一、选择题
1.关于协程,下面说法正确是?

A. 协程和线程都可以实现程序的并发执行
B. 线程比协程更轻量级
C. 协程不存在死锁问题
D. 通过channel来进行协程间的通信

参考答案:AD

2.关于channel,下面语法正确的是()

A. var ch chan int
B. ch := make(chan int)
C. <- ch
D. ch <-



参考答案:ABC


D答案少了写入的数据:ch <- 3

3.关于同步锁,下面说法正确的是()

A. 当一个goroutine获得了Mutex后,其他goroutine就只能乖乖的等待,除非该goroutine释放这个Mutex
B. RWMutex在读锁占用的情况下,会阻止写,但不阻止读
C. RWMutex在写锁占用情况下,会阻止任何其他goroutine(无论读和写)进来,整个锁相当于由该goroutine独占
D. Lock()操作需要保证有Unlock()或RUnlock()调用与之对应

参考答案:ABC。Lock对应Unlock,RLock对应RUnlock

读写锁:
写锁:写写互斥,写读互斥
读锁:读读不互斥,读写互斥

4.关于channel的特性,下面说法正确的是()

A. 给一个 nil channel 发送数据,造成永远阻塞
B. 从一个 nil channel 接收数据,造成永远阻塞
C. 给一个已经关闭的 channel 发送数据,引起 panic
D. 从一个已经关闭的 channel 接收数据,如果缓冲区中为空,则返回一个零值

参考答案:ABCD

5.关于 channel 下面描述正确的是?

A. 向已关闭的通道发送数据会引发 panic;

B. 从已关闭的缓冲通道接收数据,返回已缓冲数据或者零值;

C. 无论接收还是发送,nil 通道都会阻塞;

参考答案及解析:ABC。

6.关于无缓冲和有冲突的channel,下面说法正确的是()

A. 无缓冲的channel是默认的缓冲为1的channel // 默认位0
B. 无缓冲的channel和有缓冲的channel都是同步的
C. 无缓冲的channel和有缓冲的channel都是非同步的
D. 无缓冲的channel是同步的,而有缓冲的channel是非同步的

参考答案:D。

7.关于select机制,下面说法正确的是()

A. select机制用来处理异步IO问题
B. select机制最大的一条限制就是每个case语句里必须是一个IO操作
C. golang在语言级别支持select关键字
D. select关键字的用法与switch语句非常类似,后面要带判断条件

参考答案:ABC

8下面代码输出什么?请简要说明。

type MyMutex struct {
count int
sync.Mutex
}

func main() {
var mu MyMutex
mu.Lock()
var mu1 = mu
mu.count++
mu.Unlock()
mu1.Lock()
mu1.count++
mu1.Unlock()
fmt.Println(mu.count, mu1.count)
}
A. 不能编译;
B. 输出 1, 1;
C. 输出 1, 2;
D. fatal error;
参考答案及解析:D。加锁后复制变量,会将锁的状态也复制,所以 mu1 其实是已经加锁状态,再加锁会死锁。

代码优化后的:

func main() {
var mu MyMutex
mu.Lock()
mu.count++
mu.Unlock()
var mu1 = mu
mu1.Lock()
mu1.count++
mu1.Unlock()
fmt.Println(mu.count, mu1.count)
}

二、简答题
1.select是随机的还是顺序的?

随机的

2.协程,线程,进程的区别?

进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元;

同一个进程中可以包括多个线程;

进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束;

线程共享整个进程的资源(寄存器、堆栈、上下文),一个进程至少包括一个线程;


线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源;

进程是资源分配的单位

线程是操作系统调度的单位

进程切换需要的资源很最大,效率很低 线程切换需要的资源一般,效率一般 协程切换任务资源很小,效率高 多进程、多线程根据cpu核数不一样可能是并行的 也可能是并发的。协程的本质就是使用当前进程在不同的函数代码中切换执行,可以理解为并行。 协程是一个用户层面的概念,不同协程的模型实现可能是单线程,也可能是多线程。

进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。(全局变量保存在堆中,局部变量及函数保存在栈中)

线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是这样的)。

协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。

一个应用程序一般对应一个进程,一个进程一般有一个主线程,还有若干个辅助线程,线程之间是平行运行的,在线程里面可以开启协程,让程序在特定的时间内运行。

协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力。

3.说说go语言中的协程?

协程和线程都可以实现程序的并发执行;

通过channel来进行协程间的通信;

只需要在函数调用前添加go关键字即可实现go的协程,创建并发任务;

关键字go并非执行并发任务,而是创建一个并发任务单元;

4.说说go语言的channel特性?

给一个 nil channel 发送数据,造成永远阻塞

从一个 nil channel 接收数据,造成永远阻塞

给一个已经关闭的 channel 发送数据,引起 panic

从一个已经关闭的 channel 接收数据,如果缓冲区中为空,则返回一个零值

无缓冲的channel是同步的,而有缓冲的channel是非同步的

5.说说go语言的select机制?

A. select机制用来处理异步IO问题

B. select机制最大的一条限制就是每个case语句里必须是一个IO操作

C. golang在语言级别支持select关键字

6.select可以用于什么?

常用于gorotine的完美退出
golang 的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作
每个case语句里必须是一个IO操作,确切的说,应该是一个面向channel的IO操作

7.主协程如何等其余协程完再操作

sync.WiteGroup

Add() 指定计数器
Done() 计数器减1
Wite() 等待计数器减为0,结束

8.sync.Once的作用?实现一个单例

sync.Once 是 Golang package 中使方法只执行一次的对象实现,作用与 init 函数类似。但也有所不同。

init 函数是在文件包首次被加载的时候执行,且只执行一次
sync.Onc 是在代码运行中需要的时候执行,且只执行一次
当一个函数不希望程序在一开始的时候就被执行的时候,我们可以使用 sync.Once 。

9.死锁条件,如何避免?

死锁产生的原因
1.系统资源的竞争导致系统资源不足,以及资源分配不当,导致死锁
2.请求和释放资源的顺序不当,会导致死锁
如何避免:
channel推送和读取同时存在时才不会发生死锁,而且需要注意channel读写的顺序,只读或只推都会发生死锁
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go语言基础面试题 的相关文章

  • 在 Java 中有效地对图像进行颜色循环

    我正在编写一个曼德尔布罗分形查看器 我想以智能的方式实现颜色循环 给定一个图像 我想修改它的 IndexColorModel 据我所知 没有办法修改 IndexColorModel 也没有办法为图像提供新的 IndexColorModel
  • SWIG 类型映射 uint8_t* 从 C/C++ 到 java.nio.ByteBuffer

    我正在尝试将输入和输出缓冲区从 C 传递给 java 类 出于效率原因 我需要使用 ByteBuffer 这两个缓冲区都是在 C 部分中分配的 我需要将它们传递给一个 java 函数 该函数将使用输入缓冲区进行一些计算并将结果写入输出缓冲区
  • 如何在 Android 中恢复我的音频?

    我必须实现用于创建具有暂停和恢复状态的音频的应用程序 当我的应用程序作为启动时音频启动 当我按下模拟器上的后退按钮时 音频音乐处于暂停状态 但是当我的活动回来时从停止状态到前台我的音频音乐未恢复 这是我的代码 public class Au
  • 逐行读取 JTextPane

    有没有办法读取a的内容JTextPane逐行 很像 BufferedReader 吗 Element root textPane getDocument getDefaultRootElement 获得根元素后 您可以检查存在多少个子元素
  • 平衡括号问题的优化解

    给定一个仅包含字符的字符串 and 判断输入字符串是否有效 输入字符串在以下情况下有效 左括号必须由相同类型的括号封闭 左括号必须按正确的顺序关闭 请注意 空字符串也被视为有效 示例1 Input Output true Example 2
  • 使用 Thymeleaf 时我们应该删除 HTML 属性吗?

    我正在研究 Thymeleaf 发现几乎所有示例中都有 Thymeleaf 的标签值以及标准 HTML 值 例如 这些
  • 读取 Nashorn JO4 和 NativeArray

    Java调用代码 import jdk nashorn api scripting myCustomHashMap dataStore new myCustomHashMap ScriptEngineManager sem new Scri
  • IntelliJ 建议错误的 @NotNull 注释

    IntelliJ 建议导入com sun istack internal NotNull以下程序中的 NotNull 注释 这是错误的 public class Test implements Comparable
  • 从另一个类添加 Swing 组件

    我正在学习java 我正在尝试从另一个类向我的框架添加一个菜单栏 练习将代码划分为多个类以更好地组织程序 这是我的代码示例 public class MainApp public static void main String args C
  • 在 JSF 自定义验证器中区分 ajax 请求和完整请求

    我的验证器需要知道它是完整请求还是 ajax 请求 在我当前的解决方案中 我检查 http 请求标头X Requested With元素 public void validate FacesContext context UICompone
  • EasyMock : java.lang.IllegalStateException: 1 个匹配器预期,2 个记录

    我在使用 EasyMock 2 5 2 和 JUnit 4 8 2 通过 Eclipse 运行 时遇到问题 我已阅读此处所有类似的帖子 但尚未找到答案 我有一个包含两个测试的类 它们测试相同的方法 我正在使用匹配器 每个测试单独运行时都会通
  • 更改 Spring Web 应用程序的默认会话超时

    我必须测试一个由 spring 和 jsp 编写的 Web 应用程序 应用程序的默认会话超时为 30 分钟 我想减少会话超时 为此 我改变了web xml文件输入tomcatInstallationLocation conf 但这不起作用
  • 在 Java/GWT 中解析用户时间输入

    解析用户在 GWT 中的文本字段中键入的时间的最佳方法是什么 默认时间格式要求用户完全按照区域设置指定的时间格式输入时间 我想要更加灵活 因为用户可以通过多种不同的方式输入时间 例如 8 8p 8pm 8 15pm 13 15 1315 1
  • 无法从 ViewPager 中的 Fragment 编辑 ActionBar 标题

    我有一个Activity它通过一个托管多个片段ViewPager 在活动的onCreate方法我使用以下代码来更改ActionBar title Toolbar toolbar findViewById R id toolbar setSu
  • 为什么 Cassandra 客户端在生产中没有 epoll 时会失败? [复制]

    这个问题在这里已经有答案了 当我在本地运行服务时 我收到一条警告 指出 epoll 不可用 因此它使用 NIO 很公平 当我将其部署到 Kubernetes 中时 我得到了以下信息 这导致服务无法运行 2017 03 29T19 09 22
  • 飞碟 - html 实体未呈现

    我正在使用 Flying saucer lib 生成 pdf 但我对一些 html 实体有问题 我已经在寻找解决方案 我在这个论坛和其他地方找到了很多提示 但仍然存在问题 我尝试过这种方法 http sdtidbits blogspot c
  • 使用 OpenNLP 获取句子的解析树。陷入困境。

    OpenNLP 是一个关于自然语言处理的 Apache 项目 NLP 程序的目标之一是解析一个句子 并给出其语法结构的树 例如 天空是蓝色的 这句话 可能会被解析为 S NP VP The sky is blue where S是句子 NP
  • Java分数计算器

    我对 Java 编程还很陌生 我的 AP 计算机编程课程有作业要完成 所以请耐心等待 我必须弄清楚如何将两个分数相乘 我想知道是否有任何方法可以在方法内部声明变量并在该方法外部使用它 我在介绍方法中的 while 循环 谢谢您 希望这不会令
  • 如何获取 res.drawable 文件夹的路径来复制文件?

    我正在编写我的应用程序AndroidStudio 我的里面有gif文件drawable gifs文件夹 我希望将该文件复制到MediaStore Images Media单击按钮后的文件夹 目前 即使使用发布的一些答案 我也无法获取我的 g
  • selenium 没有找到合适的方法,直到(ExpectedCondition)

    这是有线的问题 我导入的项目运行 100 几个月前 今天我已将其与依赖项一起导入 但存在问题WebDriverWait 这是我的代码 WebDriverWait driverWait new WebDriverWait driver 100

随机推荐

  • 机器学习加速器文献整理

    William J Dally 团队 文献一SCNN An Accelerator for Compresse d sparse Convolutional Neural Networks1 文献二EIE Efficient Inferen
  • DirectX9 SDK Samples(12) CustomUI Sample

    这一次的例子是关于DXUT的UI 下面先翻译文档中的比较重要的说明 这个例子开始时定义了两个CDXUTDialog对象 g HUD和g SampleUI 一个CDXUTDialog是一个装入了一个或多个控件 按钮等 的容器 对话框 CDXU
  • 部分HTTPS网站无法访问的可能原因

    最近访问一些HTTPS的网站 总有一些网站无法正常访问 总是提示证书过期 查看了下对应网站的证书 没到期呀 于是总认为是自己系统或者浏览器的问题 可查来查去 改来改去也无法解决问题 直到仔细观察了下证书颁发机构 才发现都是一个机构的 Let
  • java swing 日志_springBoot swing 界面实现配置和日志打印

    packagecom adao simulater swing importcom adao simulater common Constant importcom adao simulater common PropertiesUtil
  • http请求与Request常用方法

    一 http请求 HTTP请求报文由3部分组成 请求行 请求头 请求体 是请求方法 GET和POST是最常见的HTTP方法 除此以外还包括DELETE HEAD OPTIONS PUT TRACE 不过 当前的大多数浏览器只支持GET和PO
  • 安装cnpm(傻瓜式通俗移动)

    1 首先确保自己安装好node并且npm能正常使用 2 以管理员身份打开cmd 3 输入npm install g cnpm registry https registry npm taobao org并运行 4 等待安装结束后 输入 cn
  • PWM调光调色温技术学习(笔记)

    前言 在智能化的浪潮中 智能照明是智能家居中非常重要的一部分 由于LED照明的大量普及 相对于传统的节能灯和白炽灯 LED照明的可塑性强很多 这其中LED灯的亮度调节和色温调节已经成为智能照明的主流需求 本文就从LED照明的亮度调节 色温调
  • [网络安全自学篇] 三十一.文件上传之Upload-labs靶场及CTF题目01-10(四)

    这是作者的系列网络安全自学教程 主要是关于安全工具和实践操作的在线笔记 特分享出来与博友们学习 希望您们喜欢 一起进步 前文分享了编辑器漏洞和IIS高版本文件上传漏洞 包括FCKeditor eWebEditor 畸形解析漏洞等 本篇文章将
  • Linux 如何快速查看 IP 地址

    查看IP 1 进入Linux 系统 在主页面空旷的地方右键 选择 打开终端 2 在显示的界面中输入 ifconfig a 就可以查看到Linux 的地址了 快速查看IP 和修改 1 点击应用程序 gt 选择系统工具 选择设置 gt 找到网络
  • Ubuntu 安装 zshell

    一 检查系统中原来的shell cat etc shells 二 安装 zsh apt install zsh 安装zsh chsh s bin zsh 将zsh设置成默认shell 不设置的话启动zsh只有直接zsh命令即可 三 安装oh
  • 二叉树知识总结

    一 前言 数组的搜索比较方便 可以直接用下标 但删除和插入就比较麻烦 链表与之相反 删除和插入元素很快 但查找比较慢 此时 二叉树应运而生 二叉树既有链表的好处 也有数组的好处 在处理大批量的动态数据时比较好用 是一种折中的选择 文件系统和
  • 线程——一个计数器计数到100,在每个数字之间暂停1秒,每隔10个数字输出一个字符串

    16 一个计数器计数到100 在每个数字之间暂停1秒 每隔10个数字输出一个字符串 public class MyThread extends Thread public void run for int i 0 i lt 100 i if
  • Qt 环境搭建

    安装QtCreator 进入Qt官网https www qt io zh cn 点击下载按钮 然后选择试用Qt 这里下载的是免费版本 也就是社区版本 如果点击购买则下载专业版 点击下载后需要填写个人信息 填好邮箱和手机 还需要填写用途 并选
  • 【基于深度学习的生活垃圾分类识别管理可视化系统-哔哩哔哩】 https://b23.tv/0UBohX2

    基于深度学习的生活垃圾分类识别管理可视化系统 哔哩哔哩 https b23 tv 0UBohX2 https b23 tv 0UBohX2
  • 【前端】Vue+Element UI案例:通用后台管理系统-Header+导航栏折叠

    文章目录 目标 代码 0 创建组件 1 按钮 2 头像下拉框 3 去除左右缝隙 4 点击按钮折叠导航栏 Vuex 5 折叠标题和Header效果 总代码 CommonHeader vue store的index js store的tab j
  • 误区 一下代码是曾经误认为 radio的onclick 事件在 发生 以下是实例代码

    实际上onclick事件还是在radio上发生 只不过是通过js把 a 标签的href属性的 值 给动态的发生该表了而已 误以为是在 a 标签上发生了onclick事件 a a
  • playwright自动化项目搭建

    具备功能 关键技术 pylaywright测试库 pytest单元测试框架 pytest playwright插件 非关键技术 pytest html插件 pytest rerunfailures插件 seldom 测试框架 实现功能 元素
  • 静态链接原理以及过程

    通常程序的编译中 或多或少会调用其它库中的函数接口 本篇blog就是讲静态库的调用流程 通常我们知道编译一个可执行程序会有这四个过程 预处理 编译 汇编以及链接 前面三步就是产生目标文件 o的过程 链接就是把各个 o文件粘在一起 构成一个可
  • 杂项设备(misc device)和字符设备(char device)区别

    杂项设备 misc device 杂项设备也是在嵌入式系统中用得比较多的一种设备驱动 在 Linux 内核的include linux目录下有Miscdevice h文件 要把自己定义的misc device从设备定义在这里 其实是因为这些
  • Go语言基础面试题

    一 选择题 1 关于异常设计 下面说法正确的是 A 在程序开发阶段 坚持速错 让程序异常崩溃 开发 测试 准生产 生产 B 在程序部署后 应恢复异常避免程序终止 C 一切皆错误 不用进行异常设计 D 对于不应该出现的分支 使用异常处理 参考