「金三银四」这些面试题,看看你会答几道?
Posted 王中阳Go
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「金三银四」这些面试题,看看你会答几道?相关的知识,希望对你有一定的参考价值。
前言
昨天群友问我能不能整理Go主流框架方面的面试题,安排!
这篇文章整理了gRPC、GoFrame、GoZero、GoMicro、GORM、Gin等主流框架的30道面试题。
需要大厂面经的朋友们也可以在CSDN私信我。
gRPC
1.gRPC是什么,有哪些优点?
gRPC是一种高性能、开源的远程过程调用(RPC)框架,它可以使不同平台和语言之间的服务相互通信。它的优点包括:高效性、跨平台、异步流处理、支持多种语言、安全、易于使用和开源。
2.gRPC和REST的区别是什么?
REST是基于HTTP协议的一种风格,而gRPC是一个独立于协议的RPC框架。 REST基于资源的状态转移,使用标准的HTTP方法,而gRPC使用协议缓冲区(Protocol Buffers)进行序列化和反序列化。 gRPC支持异步流处理和双向流,而REST通常只支持请求/响应模式。
3.Protocol Buffers是什么,为什么它被用于gRPC中?
Protocol Buffers是一种语言中立、平台中立、可扩展的序列化格式,它可以用于数据交换和持久化。它被用于gRPC中,因为它可以实现高效的序列化和反序列化,从而提高了gRPC的性能和效率。
4.gRPC的流程是什么?
gRPC流程分为四个步骤:定义服务、生成源代码、实现服务、启动服务。首先,需要定义要实现的服务及其接口,使用Protocol Buffers编写接口定义文件。其次,使用编译器生成客户端和服务器端的源代码。然后,实现生成的接口。最后,启动服务器并将其部署在适当的位置。
5.gRPC支持哪些类型的序列化?
gRPC支持两种类型的序列化:二进制(使用Protocol Buffers)和JSON。其中,二进制序列化在效率和性能方面比JSON序列化更优秀。但是,JSON序列化在可读性方面更好,可以方便地进行调试和测试。
GoFrame
1.什么是 GoFrame?与 Go 标准库有什么区别?
GoFrame 是一个强大的 Go Web 应用开发框架,它提供了一系列优秀的功能模块和常用工具,方便开发者快速构建高性能、高可用的 Web 应用程序。
相较于 Go 标准库,GoFrame 提供了更多的功能模块,例如:ORM、Cache、Session、WebSocket、邮件发送等等。此外,GoFrame 也提供了更友好的 API 和更好的性能。
2.goframe框架中,如何使用中间件?
在goframe框架中使用中间件很简单。只需要在路由定义时使用中间件函数,例如:
s := g.Server()
s.Group("/", func(group *ghttp.RouterGroup)
group.Middleware(MiddlewareFunc)
group.ALL("/user", UserHandler)
)
3.goframe框架中,如何实现定时任务?
在goframe框架中实现定时任务很容易。可以使用gcron插件。该插件提供了简单的API用于创建和管理定时任务,例如:
// 创建定时任务
s := gcron.NewScheduler()
s.Every(1).Hour().Do(TaskFunc)
// 开始定时任务
s.Start()
4.goframe框架中,如何实现文件上传和下载?
在goframe框架中实现文件上传和下载很容易。可以使用ghttp的相关方法进行操作,例如:
// 文件上传
uploadFile, err := r.UploadFile("file")
if err != nil
return err
uploadFile.Save("/path/to/save")
// 文件下载
r.Response().Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", filename))
r.Response().ServeFile(filepath)
5.GoFrame 中的 gvalid 组件是什么?如何使用?
goframe框架提供了功能强大、使用便捷、灵活易扩展的数据/表单校验组件,由gvalid组件实现。
gvalid组件实现了非常强大的数据校验功能,内置了数十种常用的校验规则,支持单数据多规则校验、多数据多规则批量校验、自定义错误信息、自定义正则校验、自定义校验规则注册、支持i18n国际化处理、支持struct tag规则及提示信息绑定等等特性,是目前功能最强大的Go数据校验模块。
Go-Zero
1.Go-Zero 是什么?它的主要功能是什么?它与其他 Go 框架有什么不同?
Go-Zero 是一个基于 Go 语言的微服务开发框架。它旨在提供简单、高效和可靠的微服务开发解决方案。Go-Zero 主要功能包括 RPC、缓存、限流、熔断、监控等。相较于其他 Go 框架,如 Gin 或 Beego,Go-Zero 更加专注于微服务开发,并提供了更多的开箱即用的功能。
2.go-zero中如何实现JWT认证授权?
go-zero中提供了go-jwt包来实现JWT认证授权。具体步骤如下:
1)定义一个Claims结构体,包含需要存储到JWT token中的信息。
2)通过jwt.NewHS256([]byte(“your-secret”))创建一个JWT签名实例,将Claims结构体转换成token字符串。
3)通过jwt.ParseHS256(token, []byte(“your-secret”))验证token,并返回解析后的Claims结构体。
3.如何使用go-zero实现异步任务?
go-zero中提供了go-queue包来实现异步任务。具体步骤如下:
1)创建一个Redis连接池。
2)通过queue.New(queueConfig, redisConfig)创建一个队列实例。
3)通过producer := queue.NewProducer()创建一个生产者实例。
4)通过consumer := queue.NewConsumer(queueConfig, redisConfig)创建一个消费者实例。
5)通过producer.Enqueue(job)将任务放入队列。
6)通过consumer.Consume(processor)处理队列中的任务。
4. 如何使用go-zero实现分布式缓存?
go-zero中提供了go-cache包来实现分布式缓存。具体步骤如下:
1)创建一个Redis连接池。
2)通过cache.New(cacheConfig, redisConfig)创建一个缓存实例。
3)通过cache.Set(key, value, expireTime)将数据存入缓存中。
4)通过cache.Get(key)从缓存中获取数据。
5.如何使用go-zero实现限流?
go-zero中提供了go-ratelimit包来实现限流。具体步骤如下:
1)通过rate.NewLimiter(rate.Every(time.Second), 100)创建一个限流器实例,限制每秒处理100个请求。
2)通过limiter.Allow()方法判断当前请求是否被允许,若被允许则处理请求,否则返回错误提示。
GIN
1.Gin框架有什么特点?
Gin是一个基于Go语言的Web框架,它提供了一些轻量级的工具,使得编写高性能的Web应用程序变得非常容易。Gin具有快速的路由器,中间件支持和错误管理功能,同时还提供了自动化的API文档生成和参数绑定等功能。
2.Gin框架中的中间件是什么?
中间件是Gin框架的一个重要概念,它是一种在处理请求之前或之后执行的函数。中间件通常用于处理请求,如身份验证,日志记录和性能监测等。在Gin框架中,中间件可以按照需要在路由器级别或全局级别进行注册和使用。
3.如何在Gin框架中处理跨域请求?并给出代码
Gin框架提供了一个cors中间件,可以用来处理跨域请求。在使用cors中间件时,可以指定允许跨域请求的源地址,允许的请求方法,允许的头信息等。例如:
r := gin.Default()
r.Use(cors.New(cors.Config
AllowOrigins: []string"http://localhost:8080",
AllowMethods: []string"PUT", "PATCH", "GET", "POST", "DELETE",
AllowHeaders: []string"Origin",
))
4.如何在Gin框架中实现文件上传?
在Gin框架中,可以使用MultipartForm函数来处理文件上传。MultipartForm函数会自动解析multipart/form-data格式的表单数据,并将文件保存在指定的目录中。例如:
func UploadFile(c *gin.Context)
file, err := c.FormFile("file")
if err != nil
c.JSON(http.StatusBadRequest, gin.H"error": err.Error())
return
filename := filepath.Base(file.Filename)
if err := c.SaveUploadedFile(file, filename); err != nil
c.JSON(http.StatusBadRequest, gin.H"error": err.Error())
return
c.JSON(http.StatusOK, gin.H"filename": filename)
5.GoFrame 中的 gvalid 模块是什么?如何使用?
goframe框架提供了功能强大、使用便捷、灵活易扩展的数据/表单校验组件,由gvalid组件实现。
gvalid组件实现了非常强大的数据校验功能,内置了数十种常用的校验规则,支持单数据多规则校验、多数据多规则批量校验、自定义错误信息、自定义正则校验、自定义校验规则注册、支持i18n国际化处理、支持struct tag规则及提示信息绑定等等特性,是目前功能最强大的Go数据校验模块。
5.如何在Gin框架中实现JWT认证?
在Gin框架中,可以使用jwt-go库来实现JWT认证。JWT认证流程通常包括登录,生成token,验证token等步骤。在Gin框架中,可以使用中间件来实现JWT认证,例如:
func AuthMiddleware() gin.HandlerFunc
return func(c *gin.Context)
tokenString := c.GetHeader("Authorization")
if tokenString == ""
c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H"message": "Authorization header required")
return
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface, error)
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
GORM
1.GORM 如何实现一对多和多对多关系的映射?
对于一对多关系,可以使用 GORM 的 BelongsTo 和 HasMany 方法实现映射。比如:
type User struct
ID uint
Name string
Addresses []Address
type Address struct
ID uint
UserID uint
Address string
// User 模型对应的表应该包含一个外键,指向 Address 表中的 UserID 字段
// 使用 BelongsTo 和 HasMany 方法进行关联
func (u *User) Addresses() []Address
var addresses []Address
DB.Model(&u).Association("Addresses").Find(&addresses)
return addresses
func (a *Address) User() User
var user User
DB.Model(&a).Association("User").Find(&user)
return user
对于多对多关系,可以使用 GORM 的 ManyToMany 方法实现映射。比如:
type User struct
ID uint
Name string
Articles []Article `gorm:"many2many:user_articles"`
type Article struct
ID uint
Title string
Content string
Users []User `gorm:"many2many:user_articles"`
// User 和 Article 之间的关系通过 user_articles 表进行映射
2.在使用 GORM 进行数据库查询时,如何避免 N+1 查询的问题?
N+1 查询问题指的是在查询关联表时,如果使用了嵌套循环进行查询,就会产生大量的 SQL 查询。为了避免这个问题,可以使用 GORM 的 Preload 方法预先加载关联数据。比如:
// 查询 Users 以及它们的 Addresses
var users []User
DB.Preload("Addresses").Find(&users)
这个查询会一次性加载所有 User 和 Address 数据,避免了 N+1 查询问题。
3. 如何使用 GORM 进行事务管理?
GORM 的事务管理使用 Begin、Commit 和 Rollback 方法实现。比如:
tx := DB.Begin()
defer func()
if r := recover(); r != nil
tx.Rollback()
()
// 在事务中执行一系列操作
if err := tx.Create(&user).Error; err != nil
tx.Rollback()
return err
if err := tx.Create(&address).Error; err != nil
tx.Rollback()
return err
// 提交事务
tx.Commit()
4.GORM 的 Preload 方法和 Joins 方法有什么区别?在什么情况下使用哪种方法更好?
Preload 方法是在查询时预加载关联数据,而 Joins 方法是通过 SQL JOIN 语句连接多个表查询数据。Preload 方法适用于关联表较少、数据量不大的情况;而 Joins 方法适用于关联表较多、数据量较大的情况。
5.如何在 GORM 中使用原生 SQL 查询?
在 GORM 中,可以使用 Raw 方法来执行原生 SQL 查询。Raw 方法接受一个 SQL 查询字符串和可选的参数列表,并返回一个 *gorm.DB 对象,可以使用该对象进行进一步的查询操作。
下面是一个使用 Raw 方法执行原生 SQL 查询的示例:
import "gorm.io/gorm"
// ...
var users []User
result := db.Raw("SELECT * FROM users WHERE age > ?", 18).Scan(&users)
if result.Error != nil
// 处理错误
在上面的示例中,我们使用 Raw 方法执行了一个简单的 SQL 查询,它将返回所有年龄大于 18 岁的用户。Scan 方法用于将查询结果映射到一个 []User 对象中。
还可以使用 Exec 方法来执行不需要返回值的 SQL 查询,如插入、更新或删除数据:
result := db.Exec("DELETE FROM users WHERE age < ?", 18)
if result.Error != nil
// 处理错误
在上面的示例中,我们使用 Exec 方法执行一个删除语句,它将删除所有年龄小于 18 岁的用户。由于这个SQL不需要返回值,我们只需检查 result.Error 是否为 nil 来判断查询是否成功。
请注意,使用原生 SQL 查询可能会使代码更难以维护和调试,因为它们不受 GORM 的自动迁移和其他便利功能的支持。因此,应该尽可能地使用 GORM 提供的高级查询功能。
Go-Micro
1.什么是 go-micro?
go-micro 是一个微服务框架,它可以用于构建可伸缩和可维护的微服务应用程序。它支持多种语言和传输协议,并提供了一系列服务发现、负载均衡、消息传递和远程过程调用(RPC)等基础设施功能。
2.go-micro 支持哪些传输协议?
go-micro 支持多种传输协议,包括 HTTP、TCP 和 NATS。其中,HTTP 和 TCP 协议适用于内部服务之间的通信,而 NATS 协议则适用于跨网络边界的通信。
3.如何使用 go-micro 进行服务发现和负载均衡?
go-micro 内置了服务发现和负载均衡功能,可以通过调用相关 API 实现。例如,可以使用 go-micro 的服务发现 API 来查找已注册的服务,并使用负载均衡 API 来将请求分配到多个实例之间。
4.go-micro 支持哪些消息传递方式?
go-micro 支持多种消息传递方式,包括同步和异步消息传递。同步消息传递使用 RPC 机制,而异步消息传递则使用消息队列和事件驱动模式。
5.如何使用 go-micro 进行测试?
go-micro 提供了一系列测试工具和测试框架,可以用于测试微服务应用程序的各个组件。其中,mock 测试工具可以用于模拟服务接口和行为,以及对服务进行单元测试。另外,go-micro 还提供了一些集成测试工具,例如 Docker 和 Kubernetes,可以用于测试多个服务之间的交互。
总结
有志者,事竟成,破釜沉舟,百二秦关终属楚。
苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
就算就业环境再好,也有人找不到工作;即使就业环境不好,也肯定有人能找到工作。
停止抱怨和焦虑,要想找到好工作:项目+算法+八股,都要硬,学起来吧!兄弟们加油。
成功上岸
如果你不知道如何写好简历,不知道如何在面试中做好自我介绍和项目介绍:可以关注我的公众号:程序员升职加薪之旅
也欢迎大家关注我的账号,点赞、留言、转发。你的支持,是我更文的最大动力!
金三银四,如果没准备这些面试题,找工作还是缓一缓吧
前言:
最近金三银四跳槽季,相信很多小伙伴都在面试找工作,怎样才能拿到大厂的offer,没有掌握绝对的技术,那么就要不断的学习…
如何拿下阿里等大厂的offer的呢,今天分享一个秘密武器,资深测试开发师整理的软件测试面试核心知识点,面试时面试官必问的知识点,篇章包括了很多知识点,其中包括了有测试理论、Linux基础、MySQL基础、Web测试、接口测试、App测试、管理工具、Python基础、Selenium相关、性能测试、LordRunner相关等
目录
由于题量较多,篇幅的限制,文章中的面试题分享没有全部附上详细的解析,但是整理成了一份详细的PDF文档可分享给大家,文末获取免费领取方式
看面试题可以是为了面试,也可以是对自己学到的东西的一种查漏补缺,更加深刻的去了解一些核心知识点
- 测试理论(测试基础+需求分析+测试模型+测试计划+测试策略+测试案例等等)
- Linux( Linux基础+Linux练习题)
- MySQL(基础知识+查询练习+万年学生表经典面试题汇总+数据库企业真题)
- Web测试
- API测试
- App测试
- 管理工具
- Python基础(Python基础+编程题+集合+函数+Python特性等等)
- Selenium相关
- 性能测试
- LordRunner相关
- 计算机网络
- 组成原理
- 数据结构与算法
- 逻辑题
- 人力资源
一、软件测试基础
- 软件测试的步骤是什么?
- 如何录制测试脚本?
- 应该考虑进行如何测试的测试方法
- 怎样估计测试工作量?
- 测试设计的问题
- 当测试过程发生错误时,有哪几种解决办法?
- 测试执行的问题
- 测试评估的目标
- 如何提高测试?
- C/S模式的优点和缺点
- B/S模式的优点和缺点
- …
二、Linux
- grep和find的区别? grep 都有哪些用法?
- 查看IP地址?
- 创建和删除一个多级目录?
- 在当前用户家目录中查找haha.txt文件?
- 如何查询出tomcat的进程并杀掉这个进程,写出linux命令?
- 动态查看日志文件?
- 查看系統硬盘空间的命令?
- 查看当前机器listen 的所有端口?
- …
三、Python
- 统计python源代码文件中代码行数,去除注释,空行,进行输出?
- python调用cmd并返回结果?
- 冒泡排序
- 1,2,3,4 这4个数字,能组成多少个互不相同的且无重复的三位数,都是多少?
- 请用 python 打印出 10000 以内的对称数(对称数特点:数字左右对称,如:1,2,11,121,1221 等)
- 给定一个整数 N,和一个 0-9 的数 K,要求返回 0-N 中数字 K 出现的次数
- 判断 101-200 之间有多少个素数,并输出所有的素数
- 一个输入三角形的函数,输入后输出是否能组成三角形,三角形类型,请用等价类- 划分法设计测试用例
- …
四、MySQL
- 你用的Mysql是哪个引擎,各引擎之间有什么区别?
- 如何对查询命令进行优化?
- 数据库的优化?
- Sql注入是如何产“生的,如何防止?
- NoSQL和关系数据库的区别?
- MySQL与MongoDB本质之间最基本的差别是什么
- Mysql数据库中怎么实现分页?
- Mysql数据库的操作?
- 优化数据库?提高数据库的性能?
- 什么是数据的完整性?
- …
五、Web
- Web测试和app测试区别?
- WEB测试环境搭建和测试方法
- WEB测试教程
- WEB测试要点及基本方法
- Web测试页面总结
- …
六、接口测试
- 什么是接口
- 如果模块请求http改为了https,测试方案应该如何制定,修改?
- 常用HTTP 协议调试代理I具有什么?详细说明抓取HTTPS协议的设置过程?
- 描述TCP/IP协议的层次结构,以及每一-层中重要协议
- jmeter,一个接口的响应结果如下:
- 接口产生的垃圾数据如何清理
- 依赖第三方的接口如何处理
- 测试的数据你放在哪?
- 什么是数据驱动,如何参数化?
- …
七、性能测试
- 你认为性能测试的目的是什么?做好性能测试的工作的关键是什么?
- 服务端性能分析都从哪些角度来进行?
- 如何理解压力测试,负裁测试以及性能测试?
- 如何判断是否有内存泄漏及关注的指标?
- 描述软件产“生内存泄露的原因以及检查方式。(可以结合- 种开发语言进行描述)
- 简述什么是值传递,什么是地址传递,两者区别是什么?
- 什么是系统瓶颈?
- …
八、selenium
- 如何开展自动化测试框架的构建?
- 如何设计自动化测试用例:
- webdriver如何开启和退出一个浏览器?
- 什么是自动化测试框架?
- Selenium是什么,流行的版本有哪些?
- 你如何从命令行启动Selenium RC?
- 在我的机器端口4444不是免费的。我怎样才能使用另一个端口?
- 什么是Selenium Server,它与Selenium Hub有什么不同?
- 你如何从Selenium连接到数据库?
- 你如何验证多个页面上存在的一个对象?
- XPath中使用单斜杠和双斜杠有什么区别?
- 如何编写SeleniumIDE/ RC的用户扩展?
- 如何在页面加载成功后验证元素的存在?
- 你对Selenium Grid有什么了解?它提供了什么功能?
- 如何从你的Java Class启动Selenium服务器?
- Selenium中有哪些验证点?
- 什么是XPath?什么时候应该在Selenium中使用XPath?
- …
九、计算机与网络
- 一台计算机的IP是192.168.10.71子网掩码255.255.255.64与192.168.10.201 …
- 请简述DNS、活动目录、域的概念。
- 10M兆宽带是什么意思?理论下载速度是多少?
- 什么是IP地址?
- OSI七层网络模型的划分?
- TCP和UDP有什么不同?
- HTTP属于哪一层的协议?
- HTTP和HTTPS的区别?
- cookies和session的区别?
- HTTP的get请求和post请求的区别?
- HTTP1.0和HTTP1.1有什么区别
- TCP的连接建立过程,以及断开过程?
- 客户端使用DHCP获取IP的过程?
- 写出某个网段的网络地址和广播地址?
- …
十、人力资源
- 你的测试职业发展是什么?你自认为做测试的优势在哪里?
- 你找工作时,最重要的考虑因素为何?
- 为什么我们应该录取你?
- 请谈谈你个人的最大特色。
- 一个测试工程师应具备那些素质和技能?
- 还有问一下你是怎样保证软件质量的,也就是说你觉得怎样才能最大限度地保证软件质量?
- 为什么选择测试这行?
- 如果我雇用你,你能给部门带来什么贡献?
- …
最后
整份文档一共有将近 200 页,全部为大家展示出来肯定是不太现实的,为了不影响大家的阅读体验就只展示了部分内容,还望大家海涵,希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习!
以上是关于「金三银四」这些面试题,看看你会答几道?的主要内容,如果未能解决你的问题,请参考以下文章
金三银四想找Python开发工作,先来考考自己这些基础面试题吧