├── .gitignore ├── LICENSE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.exe~ 4 | *.dll 5 | *.so 6 | *.dylib 7 | 8 | # Test binary, build with `go test -c` 9 | *.test 10 | 11 | # Output of the go coverage tool, specifically when used with LiteIDE 12 | *.out 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 studygolang 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Go语言面试问答 2 | 3 | 受 [PHP-Interview-QA](https://github.com/colinlet/PHP-Interview-QA) 项目启发! 4 | 5 | 结合实际Go面试,汇总自己遇到的问题,以及网上其他人遇到的问题,尝试提供简洁准确的答案 6 | 7 | 包含网络、数据结构与算法、Go、Web、MySQL、Redis、Linux、安全、设计模式、架构、面试等部分 8 | 9 | ## 面试流程 10 | 11 | ![面试流程](./docs/interview.png) 12 | 13 | ## 问题列表 14 | 15 | ### 网络篇 16 | 17 | - [计算机网络体系结构](./docs/01.网络/QA.md#1-计算机网络体系结构) 18 | - [UDP 的主要特点](./docs/01.网络/QA.md#2-udp-的主要特点) 19 | - [TCP 的主要特点](./docs/01.网络/QA.md#3-tcp-的主要特点) 20 | - [简述三报文握手建立 TCP 连接](./docs/01.网络/QA.md#4-简述三报文握手建立-tcp-连接) 21 | - [建立 TCP 连接为什么最后还要发送确认](./docs/01.网络/QA.md#5-建立-tcp-连接为什么最后还要发送确认) 22 | - [简述 TCP 连接的释放](./docs/01.网络/QA.md#6-简述-tcp-连接的释放) 23 | - [TIME-WAIT 是什么,为什么必须等待 2MLS](./docs/01.网络/QA.md#7-time-wait-是什么为什么必须等待-2mls) 24 | - [TCP 粘包问题](./docs/01.网络/QA.md#8-tcp-粘包问题) 25 | - [UDP、TCP 区别,适用场景](./docs/01.网络/QA.md#9-udptcp-区别适用场景) 26 | - [建立 socket 需要哪些步骤](./docs/01.网络/QA.md#10-建立-socket-需要哪些步骤) 27 | - [DNS 主要作用是什么](./docs/01.网络/QA.md#11-dns-主要作用是什么) 28 | - [HTTP 报文组成](./docs/01.网络/QA.md#12-http-报文组成) 29 | - [HTTP 状态码](./docs/01.网络/QA.md#13-http-状态码) 30 | - [常见的 HTTP 方法](./docs/01.网络/QA.md#14-常见的-http-方法) 31 | - [GET 与 POST 请求方式区别](./docs/01.网络/QA.md#15-get-与-post-请求方式区别) 32 | - [HTTP 优缺点](./docs/01.网络/QA.md#16-http-优缺点) 33 | - [HTTPS 通信原理](./docs/01.网络/QA.md#17-https-通信原理) 34 | - [HTTP 2.0](./docs/01.网络/QA.md#18-http-20) 35 | - [WebSocket](./docs/01.网络/QA.md#19-websocket) 36 | - [IPv6 与 IPv4 有什么变化](./docs/01.网络/QA.md#20-ipv6-与-ipv4-有什么变化) 37 | - [什么是心跳机制](./docs/01.网络/QA.md#21-什么是心跳机制) 38 | - [什么是长连接](./docs/01.网络/QA.md#22-什么是长连接) 39 | 40 | ### 数据结构与算法篇 41 | 42 | - [衡量、比较算法优劣的指标](./docs/02.数据结构与算法/QA.md#衡量比较算法优劣的指标) 43 | - [链表有哪些](./docs/02.数据结构与算法/QA.md#链表有哪些) 44 | - [线性结构](./docs/02.数据结构与算法/QA.md#线性结构) 45 | - [树](./docs/02.数据结构与算法/QA.md#树) 46 | - [散列查找](./docs/02.数据结构与算法/QA.md#散列查找) 47 | - [排序](./docs/02.数据结构与算法/QA.md#排序) 48 | - [其他](./docs/02.数据结构与算法/QA.md#其他) 49 | 50 | ### Go 篇 51 | 52 | 53 | ### Web 篇 54 | 55 | - [SEO 有哪些需要注意的](./docs/04.Web/QA.md#seo-有哪些需要注意的) 56 | - [img 标签的 title 和 alt 有什么区别](./docs/04.Web/QA.md#img-标签的-title-和-alt-有什么区别) 57 | - [CSS 选择器的分类](./docs/04.Web/QA.md#css-选择器的分类) 58 | - [CSS sprite 是什么,有什么优缺点](./docs/04.Web/QA.md#css-sprite-是什么有什么优缺点) 59 | - [display: none 与 visibility: hidden 的区别](./docs/04.Web/QA.md#display-none-与-visibility-hidden-的区别) 60 | - [display: block 和 display: inline 的区别](./docs/04.Web/QA.md#display-block-和-display-inline-的区别) 61 | - [CSS 文件、style 标签、行内 style 属性优先级](./docs/04.Web/QA.md#css-文件style-标签行内-style-属性优先级) 62 | - [link 与 @import 的区别](./docs/04.Web/QA.md#link-与-import-的区别) 63 | - [盒子模型](./docs/04.Web/QA.md#盒子模型) 64 | - [容器包含若干浮动元素时如何清理(包含)浮动](./docs/04.Web/QA.md#容器包含若干浮动元素时如何清理包含浮动) 65 | - [如何水平居中一个元素](./docs/04.Web/QA.md#如何水平居中一个元素) 66 | - [如何竖直居中一个元素](./docs/04.Web/QA.md#如何竖直居中一个元素) 67 | - [flex 与 CSS 盒子模型有什么区别](./docs/04.Web/QA.md#flex-与-css-盒子模型有什么区别) 68 | - [Position 属性](./docs/04.Web/QA.md#position-属性) 69 | - [PNG,GIF,JPG 的区别及如何选](./docs/04.Web/QA.md#pnggifjpg-的区别及如何选) 70 | - [为什么把 JavaScript 文件放在 Html 底部](./docs/04.Web/QA.md#为什么把-javascript-文件放在-html-底部) 71 | - [JavaScript 数据类型](./docs/04.Web/QA.md#javascript-数据类型) 72 | - [JavaScript 操作 DOM 的方法有哪些](./docs/04.Web/QA.md#javascript-操作-dom-的方法有哪些) 73 | - [JavaScript 字符串方法有哪些](./docs/04.Web/QA.md#javascript-字符串方法有哪些) 74 | - [JavaScript 字符串截取方法有哪些?有什么区别](./docs/04.Web/QA.md#javascript-字符串截取方法有哪些有什么区别) 75 | - [setTimeout 和 setInterval 的区别](./docs/04.Web/QA.md#settimeout-和-setinterval-的区别) 76 | - [使用 new 操作符实例化一个对象的具体步骤](./docs/04.Web/QA.md#使用-new-操作符实例化一个对象的具体步骤) 77 | - [如何实现 ajax 请求](./docs/04.Web/QA.md#如何实现-ajax-请求) 78 | - [同源策略是什么](./docs/04.Web/QA.md#同源策略是什么) 79 | - [如何解决跨域问题](./docs/04.Web/QA.md#如何解决跨域问题) 80 | - [引起内存泄漏的操作有哪些](./docs/04.Web/QA.md#引起内存泄漏的操作有哪些) 81 | - [闭包理解及应用](./docs/04.Web/QA.md#闭包理解及应用) 82 | - [对 JavaScript 原型的理解](./docs/04.Web/QA.md#对-javascript-原型的理解) 83 | - [对 JavaScript 模块化的理解](./docs/04.Web/QA.md#对-javascript-模块化的理解) 84 | - [如何判断网页中图片加载成功或者失败](./docs/04.Web/QA.md#如何判断网页中图片加载成功或者失败) 85 | - [如何实现懒加载](./docs/04.Web/QA.md#如何实现懒加载) 86 | - [JSONP 原理](./docs/04.Web/QA.md#jsonp-原理) 87 | - [Cookie 读写](./docs/04.Web/QA.md#cookie-读写) 88 | - 从浏览器地址栏输入 URL 到显示页面的步骤 89 | - [Vue.js 双向绑定原理](./docs/04.Web/QA.md#vuejs-双向绑定原理) 90 | - 如何进行网站性能优化 91 | - [渐进增强](./docs/04.Web/QA.md#渐进增强) 92 | 93 | ### MySQL 篇 94 | 95 | - [体系结构](./docs/05.MySQL/QA.md#体系结构) 96 | - [基础操作](./docs/05.MySQL/QA.md#基础操作) 97 | - [数据库设计范式](./docs/05.MySQL/QA.md#数据库设计范式) 98 | - [数据库设计原则](./docs/05.MySQL/QA.md#数据库设计原则) 99 | - [CHAR 和 VARCHAR 数据类型区别](./docs/05.MySQL/QA.md#char-和-varchar-数据类型区别) 100 | - [LEFT JOIN 、RIGHT JOIN、INNER JOIN](./docs/05.MySQL/QA.md#left-join-right-joininner-join) 101 | - [UNION、UNION ALL](./docs/05.MySQL/QA.md#unionunion-all) 102 | - [常用 MySQL 函数](./docs/05.MySQL/QA.md#常用-mysql-函数) 103 | - [锁](./docs/05.MySQL/QA.md#锁) 104 | - [事务](./docs/05.MySQL/QA.md#事务) 105 | - [常见存储引擎](./docs/05.MySQL/QA.md#常见存储引擎) 106 | - [常见索引](./docs/05.MySQL/QA.md#常见索引) 107 | - [聚族索引与非聚族索引的区别](./docs/05.MySQL/QA.md#聚族索引与非聚族索引的区别) 108 | - [BTree 与 BTree-/BTree+ 索引原理](./docs/05.MySQL/QA.md#btree-与-btree-btree-索引原理) 109 | - [分表数量级](./docs/05.MySQL/QA.md#分表数量级) 110 | - [EXPLAIN 输出格式](./docs/05.MySQL/QA.md#explain-输出格式) 111 | - my.cnf 配置 112 | - 慢查询 113 | 114 | ### Redis 篇 115 | 116 | - [Redis 介绍](./docs/06.Redis/QA.md#redis-介绍) 117 | - [Redis 特点](./docs/06.Redis/QA.md#redis-特点) 118 | - [Redis 支持哪些数据结构](./docs/06.Redis/QA.md#redis-支持哪些数据结构) 119 | - [Redis 与 Memcache 区别](./docs/06.Redis/QA.md#redis-与-memcache-区别) 120 | - [发布订阅](./docs/06.Redis/QA.md#发布订阅) 121 | - [持久化策略](./docs/06.Redis/QA.md#持久化策略) 122 | - [Redis 事务](./docs/06.Redis/QA.md#redis-事务) 123 | - [如何实现分布式锁](./docs/06.Redis/QA.md#如何实现分布式锁) 124 | - [Redis 过期策略及内存淘汰机制](./docs/06.Redis/QA.md#redis-过期策略及内存淘汰机制) 125 | - [为什么 Redis 是单线程的](./docs/06.Redis/QA.md#为什么-redis-是单线程的) 126 | - [如何利用 CPU 多核心](./docs/06.Redis/QA.md#如何利用-cpu-多核心) 127 | - [集合命令的实现方法](./docs/06.Redis/QA.md#集合命令的实现方法) 128 | - [有序集合命令的实现方法](./docs/06.Redis/QA.md#有序集合命令的实现方法) 129 | - redis.conf 配置 130 | - 慢查询 131 | 132 | ### Linux 篇 133 | 134 | - [Linux 目录结构](./docs/07.Linux/QA.md#linux-目录结构) 135 | - [Linux 基础](./docs/07.Linux/QA.md#linux-基础) 136 | - [命令与文件查找](./docs/07.Linux/QA.md#命令与文件查找) 137 | - [数据流重定向](./docs/07.Linux/QA.md#数据流重定向) 138 | - [sed](./docs/07.Linux/QA.md#sed) 139 | - [awk](./docs/07.Linux/QA.md#awk) 140 | - [计划任务](./docs/07.Linux/QA.md#计划任务) 141 | - [Vim](./docs/07.Linux/QA.md#vim) 142 | - [负载查看](./docs/07.Linux/QA.md#负载查看) 143 | - Linux 内存管理 144 | - [进程、线程、协程区别](./docs/07.Linux/QA.md#进程线程协程区别) 145 | - 进程间通信与信号机制 146 | 147 | ### 安全篇 148 | 149 | - [跨站脚本攻击(XSS)](./docs/08.安全/QA.md#跨站脚本攻击xss) 150 | - [跨站点请求伪造(CSRF)](./docs/08.安全/QA.md#跨站点请求伪造csrf) 151 | - [SQL 注入](./docs/08.安全/QA.md#sql-注入) 152 | - [应用层拒绝服务攻击](./docs/08.安全/QA.md#应用层拒绝服务攻击) 153 | - [PHP 安全](./docs/08.安全/QA.md#php-安全) 154 | - [伪随机数和真随机数](./docs/08.安全/QA.md#伪随机数和真随机数) 155 | 156 | ### 设计模式篇 157 | 158 | - [什么是设计模式](./docs/09.设计模式/QA.md#什么是设计模式) 159 | - [如何理解框架](./docs/09.设计模式/QA.md#如何理解框架) 160 | - [主要设计模式](./docs/09.设计模式/QA.md#主要设计模式) 161 | - [怎样选择设计模式](./docs/09.设计模式/QA.md#怎样选择设计模式) 162 | - [单例模式](./docs/09.设计模式/QA.md#单例模式) 163 | - [抽象工厂模式](./docs/09.设计模式/QA.md#抽象工厂模式) 164 | - [工厂方法模式](./docs/09.设计模式/QA.md#工厂方法模式) 165 | - [适配器模式](./docs/09.设计模式/QA.md#适配器模式) 166 | - [观察者模式](./docs/09.设计模式/QA.md#观察者模式) 167 | - [策略模式](./docs/09.设计模式/QA.md#策略模式) 168 | - [OOP 思想](./docs/09.设计模式/QA.md#oop-思想) 169 | - [抽象类和接口](./docs/09.设计模式/QA.md#抽象类和接口) 170 | - [控制反转](./docs/09.设计模式/QA.md#控制反转) 171 | - [依赖注入](./docs/09.设计模式/QA.md#依赖注入) 172 | 173 | ### 架构篇 174 | 175 | - [OAuth 2.0](./docs/10.架构/QA.md#oauth-20) 176 | - [单点登录](./docs/10.架构/QA.md#单点登录) 177 | - [REST](./docs/10.架构/QA.md#rest) 178 | - [API 版本兼容](./docs/10.架构/QA.md#api-版本兼容) 179 | - [JWT](./docs/10.架构/QA.md#jwt) 180 | - [画出 PHP 业务架构图](./docs/10.架构/QA.md#画出-php-业务架构图) 181 | - [LVS](./docs/10.架构/QA.md#lvs) 182 | - [Ngnix](./docs/10.架构/QA.md#ngnix) 183 | - 服务化 184 | - 微服务 185 | - 服务注册发现 186 | - [数据库读写分离](./docs/10.架构/QA.md#数据库读写分离) 187 | - [数据库拆分](./docs/10.架构/QA.md#数据库拆分) 188 | - [分布式事务](./docs/10.架构/QA.md#分布式事务) 189 | - ID 生成器 190 | - [一致性哈希](./docs/10.架构/QA.md#一致性哈希) 191 | - [Redis 集群](./docs/10.架构/QA.md#redis-集群) 192 | - 消息队列 193 | - 穿透、雪崩 194 | - 限流(木桶、令牌桶) 195 | - 服务降级 196 | - 语言对比 197 | 198 | ## 为何要写这个 199 | 200 | 从事软件开发,已经接近五个年头了,去年面试中,发现自己依然处于尴尬的位置。简单重复,缺乏挑战的工作,已经没有多大吸引力了,优秀的平台,面试缺屡次碰壁。人上年纪之后,思维敏感度、记忆力都明显有所下滑。 201 | 202 | 程序开发不要被限制在语言层面,这是大家都懂的道理。但是作为一个 PHP 开发者,很多时候都是缠绕在业务的沟壑,理想和现实总是相差甚大。去年由于部门重组,本来将近十余人负责的项目,之后只剩两三人负责,各种坑只能靠人肉解决,深感无力。 203 | 204 | 工作可能只是你的一部分,你必须有自己的能力定位。以前总觉得学什么,做什么都无所谓,需要学习的技术,花点时间快速学习就行,有新的技术出来,赶紧紧跟了解下。但这些年下来,发现自己却没有一样能够拿的出手的,甚至连一个像样的作品也没有。其实 PHP 的技术栈还是比较广的,在对整个技术栈有一定的掌握之后,可能还需要深挖几个自己喜欢的领域,否则在现今的就业市场里面,没有任何的竞争力。所以可以看到很多招聘者都在感慨,中高级工程师都去哪里了。 205 | 206 | 面试或者面试他人,无法逃避,那就选择面对。撰写《PHP 面试问答》,构建一个面试体系,而不必慌张的临时准备,时时刻刻都充分准备好,对自己负责,也对别人负责。 207 | 208 | 结合实际 PHP 面试,系统的汇总面试中的各种各样的问题,尝试提供简洁准确的答案。如果你在 PHP 面试中遇到问题,欢迎提 Issues 交流。包含网络、数据结构与算法、Go、Web、MySQL、Redis、Linux、安全、设计模式、架构、自我介绍、离职原因、职业规划、准备问题等部分。 209 | 210 | 最后,祝愿大家在日后的求职中,都能拿到满意的 offer~~ 211 | 212 | ## 参考 213 | 214 | [术语对照表](./docs/术语对照表.md):顾名思义,帮助联想知识点 215 | 216 | [参考资料](./docs/参考资料.md):站在巨人的肩膀上,你将能看的更远 217 | 218 | ## 声明 219 | 220 | 本资料仅供参考,水平有限,难免存在纰漏错误之处 221 | 222 | 欢迎转载,转载请标明来源出处,谢谢~~ 223 | 224 | 作者:凌枫 Email:colinlets@gmail.com 225 | 226 | 链接:https://github.com/colinlet/PHP-Interview-QA 227 | --------------------------------------------------------------------------------