威❤ itspcool 交流学习
Go 语言如何学习
Go 语言语法特地简略简洁,有 C 的底子更好,差一些也没关系。前提是你要真心想学,才有足够的能源去学。
资源链接: https://pan.baidu.com/s/1Qq3F… 提取码: kczq
作者 -\/ 307570512
前提是你要真心想学,才有足够的能源去学。初学 Go 语言首先弄懂根底语法和概念:根本数据类型、Struct、Array、map、Slice、指针、接口、map、内置函数,罕用工具包等,还有接口和 Slice 的底层数据结构。这些不须要弄特地懂,能本人了解并本人形容我感觉就能够了,要害在实际和利用练习。而后学文件操作、网络编程、锁、协程、对象序列化和反序列化,以及各种数据格式的封装等,这是进阶的内容。学完下面两个阶段,就能够本人接触一些框架,而后搭建一个 web 服务器,来做一些测试和练习。Go 各种框架都十分多了,github 上 star 数过万的就有很多,这里列举几个:beego、iris、gin、echo、revel 等。对于学习一些应用办法还是很有帮忙的。在第三个阶段做的过程中,天然就接触到了数据库,io,操作系统,网络,存储优化、须要排很多雷。到这一步,曾经可能模块化开发,应答正式的开发工作需要了。以上是作为从 Java 转过来的一枚现役 goer 的感悟吧,供大家探讨。上面再来说说学习材料的问题。
极客工夫 Go 工程师零根底待业班学习 – 根底知识点
1、go 的调度
2、go struct 能不能比拟
因为是强类型语言,所以不同类型的构造不能作比拟,然而同一类型的实例值是能够比拟的,实例不能够比拟,因为是指针类型
3、go defer(for defer),先进后出,后进先出
4、select 能够用于什么,常用语 gorotine 的完满退出
golang 的 select 就是监听 IO 操作,当 IO 操作产生时,触发相应的动作每个 case 语句里必须是一个 IO 操作,确切的说,应该是一个面向 channel 的 IO 操作
5、context 包的用处 Context 通常被译作上下文,它是一个比拟形象的概念,其本质,是【高低高低】存在上上层的传递,上会把内容传递给下。在 Go 语言中,程序单元也就指的是 Goroutine
6、client 如何实现长连贯
server 是设置超时工夫,for 循环遍历的
7、主协程如何等其余协程完再操作
应用 channel 进行通信,context,select
8、slice,len,cap,共享,扩容
append 函数,因为 slice 底层数据结构是,由数组、len、cap 组成,所以,在应用 append 扩容时,会查看数组前面有没有间断内存快,有就在前面增加,没有就从新生成一个大的素组
9、map 如何程序读取
map 不能程序读取,是因为他是无序的,想要有序读取,首先的解决的问题就是,把key变为有序,所以能够把 key 放入切片,对切片进行排序,遍历切片,通过 key 取值。
10、实现 set
[图片上传失败 …(image-fa2b2d-1551792454360)]
实现 set
11、实现音讯队列(多生产者,多消费者)
1 应用切片加锁能够实现
12、大文件排序
1 归并排序,分而治之, 拆分为小文件,在排序
13、根本排序,哪些是稳固的
14、http get 跟 head
1HEAD 和 GET 实质是一样的,区别在于 HEAD 不含有出现数据,而仅仅是 HTTP 头信息。有的人可能感觉这个办法没什么用,其实不是这样的。设想一个业务情景:欲判断某个资源是否存在,咱们通常应用 GET,但这里用 HEAD 则意义更加明确。
15、http 401,403
400 bad request,申请报文存在语法错误
401 unauthorized,示意发送的申请须要有通过 HTTP 认证的认证信息
403 forbidden,示意对申请资源的拜访被服务器回绝
404 not found,示意在服务器上没有找到申请的资源
16、http keep-alive
client 收回的 HTTP 申请头须要减少 Connection:keep-alive 字段
Web-Server 端要能辨认 Connection:keep-alive 字段,并且在 http 的 response 里指定 Connection:keep-alive 字段,通知 client,我能提供 keep-alive 服务,并且 ” 应允 ”client 我临时不会敞开 socket 连贯
17、http 能不能一次连贯屡次申请,不等后端返回
http 实质上市应用 socket 连贯,因而发送申请,接写入 tcp 缓冲,是能够屡次进行的,这也是 http 是无状态的起因
18、tcp 与 udp 区别,udp 长处,实用场景
tcp 传输的是数据流,而 udp 是数据包,tcp 会进过三次握手,udp 不须要
19、time-wait 的作用
20、数据库如何建索引
21、孤儿过程,僵尸过程
22、死锁条件,如何防止
23、linux 命令,查看端口占用,cpu 负载,内存占用,如何发送信号给一个过程
24、git 文件版本,应用程序,merge 跟 rebase
25、Slice 与数组区别,Slice 底层构造
26、我的项目里的微信领取这块,在领取完微信告诉这里,收到两次微信雷同的领取告诉,怎么避免反复生产(相似接口的幂等性),说了借助 Redis 或者数据库的事务
27、我的项目里的音讯推送怎么做的(业务无关)
28、Go 的反射包怎么找到对应的办法(这里遗记怎么问的,间接说不会,只用了 DeepEqual,简略讲了 DeepEqual)
29、Redis 根本数据结构
30、Redis 的 List 用过吗?底层怎么实现的?晓得然而没用过,不晓得怎么实现
31、Mysql 的索引有几种,工夫复杂度
32、InnoDb 是表锁还是行锁,为什么(这里答不进去为什么,只说了行锁)
33、Go 的 channel(有缓冲和无缓冲)
34、退出程序时怎么避免 channel 没有生产完,这里一开始有点没分明面试官问的,而后说了监听中断信号,做退出前的解决,而后面试官说不是这个意思,而后说发送前先告知长度,长度要是不晓得呢?close channel 上游会受到 0 值,能够利用这点(这里也有点跟面试官说不明确)
35、用过什么消息中间件之类吗?没有
36、有什么问题吗?评估?前面还有面试,前面再问吧
38、生产者消费者模式,手写代码(Go 间接应用 channel 实现很简略,还想着面试官会不会不让用 channel 实现,不必 channel 的能够应用数组加条件变量),channel 缓冲长度怎么决定,怎么管制上游生产速度过快,这里没说出解决方案,只是简略说了 channel 长度能够与上下游的速度比例成线性关系,面试官说这是一种解决方案
39、手写循环队列
40、写的循环队列是不是线程平安,不是,怎么保障线程平安,加锁,效率有点低啊,而后面试官就揭示 Go 推崇原子操作和 channel
41、写完代码面试官说前面问的问题答复就能够,不晓得的话没关系
42、Linux 会不会,只会几个命令,面试官就说一共也就一百多个命令
43、TimeWait 和 CloseWait 起因
44、线段树理解吗?不理解,字典树?理解
45、看过啥源码,nsq(Go 的消息中间件),简略问了我外面的 waitgroup 包证实我看过
46、sync.Pool 用过吗,为什么应用,对象池,防止频繁调配对象(GC 无关),那外面的对象是固定的吗?不分明,没看过这个的源码
47、有什么问题吗?评估?根底不错,Linux 尚缺,Go 的了解不够深刻,高级数据结构不理解,长处是看源码
48、前面面试官讲了他们做的货色,次要是广告局部,说日均数据量至多百万以上,多达上亿,高并发应用 Go 撑持,有微服务,服务治理,说我须要学的货色挺多的
49、证实二叉树的叶子节点跟度数为 2 的节点的关系
50、惟一索引和主键索引
51、智能指针
52、字符串解析为数字(思考浮点型)
53、单点登录,tcp 粘包
54、手写洗牌
55、解决粘包断包实现,面试官认为是 negle 算法无关,解释了下 negle 跟糊涂窗口综合征无关,而后面试官感觉其余我的项目是 crud 就没问了
56、goroutine 调度用了什么零碎调用,这个不会,面试官想从 go 问到操作系统,而后认为 * 作零碎根底不好,就问了操作系统问题
57、过程虚拟空间散布,全局变量放哪里?答上来了,操作系统就不问了
58、有没有网络编程,有,怎么看连贯状态?netstat,有哪些?ESTABLISHED,LISTEN 等等,有异常情况吗?TIME_WAIT 很多,为什么?大量短链接
59、几种根本排序算法说一下,问了堆的工夫复杂度,稳定性,为什么不稳固
60、topk 问题,海量数据 topk(答复成切分屡次加载内存,而后用维持 k 长度的有序链表,而后被说工夫复杂度不好,提醒说还是用堆,而后哦哦哦对)最长间断字串和,这里我说的解决方案没用 dp(对 dp 不熟),面试官始终疏导我 dp,还是不会
61、什么是主键
62、联结索引和惟一索引
62、越多的索引越好吗?
63、建设索引要留神什么?
64、过程和线程区别?
65、死锁?
66、tcp 三次握手
67、http,https
68、状态码 401,301,302,201
69、我的项目我说只有一台机子,所以用的单机部署,面试官说单机也能够部署多个,有什么办法吗?我说 docker,问 docker 有哪些网络,不熟,dockerfile 关键字,只答几个。顺便扯了下 nginx 转发。
70、数据库隔离级别,提交读会造成什么
71、go 调度
72、goroutine 透露有没有解决,设置 timeout,select 加定时器
73、mysql 高可用的计划
74、过程线程区别
75、排序算法以及工夫复杂度
76、怎么学习 go
77、go 的线程,给他讲了跟 goroutine 调度
78、io 模型,同步阻塞,同步非阻塞,异步
79、cookie 和 session
80、接口 kps 测试
81、redis 排行榜数据结构(跳跃表),查问工夫复杂度
82、redis 分布式,如何缩小同步提早
83、mysql 能实现 redis 的性能吗
84、平时怎么学习?
85、看什么书?
86、兴趣爱好
87、看过 google 四篇分布式论文吗,没看过
89、cap 实践,举例
90、LRU 算法,LFU
91、讲讲怎么了解网络编程
92、go 应用踩过什么坑(for range,数据库连贯 defer close)
93、go 优缺点
95、go 的值传递和援用
96、慢查问
97、为什么应用 pg
98、redis 的数据类型
99、所有左叶子节点的和
100、m 个 n 大小的有序数组求并集,一开始是 2 路归并,求工夫复杂度,起初在面试官揭示间接 m 路归并,求工夫复杂度
101、static 关键字,还有其余关键字吗
102、hash 表设计,线程平安?
103、线程本人独享什么
104、网络编程过程
105、select、epoll106、看什么书
107、排行榜怎么实现
108、go 的锁如何实现,用了什么 cpu 指令
109、go 的 runtime 如何实现
110、看过 sql 的连接池实现吗
111、ctx 包理解吗?有什么用?
112、go 什么状况下会产生内存透露?(他说 ctx 没有 cancel 的时候,这个真不知道)
113、怎么实现协程完满退出?
114、智力题:1000 瓶酒中有 1 瓶毒酒,10 只老鼠,7 天后毒性才发生,第 8 天要卖了,怎么求那瓶毒酒?
115、简略 dp 题,n* n 矩阵从左上角到右下角有多少种走法(只限往下和往右走)
116、用 channel 实现定时器?(实际上是两个协程同步)
117、go 为什么高并发好?讲了 go 的调度模型
118、操作系统内存治理?过程通信,为什么共享存储区效率最高
119、实现一个 hashmap,解决 hash 抵触的办法,解决 hash 歪斜的办法
120、怎么了解 go 的 interface
121、100 亿个数选 top5,小根堆
122、数组和为 n 的数组对
123、最大间断子数组和
124、redis 容灾,备份,扩容
125、跳跃表,为什么应用跳跃表而不应用红黑树
126、输出 url 后波及什么
127、tcp 怎么找到哪个套接字
128、ipc 形式,共享存储区原理
130、过程虚拟空间布局
131、过程状态转换
132、线程的栈在哪里调配
133、多个线程读,一个线程写一个 int32 会不会有问题,int64 呢(这里面试官起初说了要看数据总线的位数,32 位的话写 int32 没问题,int64 就有问题)
134、判断二叉树是否为满二叉树
135、lru 实现
136、一个大整数(字符串模式示意的),挪动字符求比它大的数中最小的
137、点赞零碎设计
算法题,要求给出最优解,计算工夫复杂度和空间复杂度:
- 3 个有序数组排列
- K 个有序数组排列,(此题解法是堆排序)
根底题:
-
操作系统上电启动到运行 init 过程执行前做了什么?
(1)开机 BIOS 自检,加载硬盘。
(2)读取 MBR, 进行 MBR 疏导。
(3)grub 疏导菜单(Boot Loader)。
(4)加载内核 kernel。
(5)启动 init 过程,根据 inittab 文件设定运行级别)
- 零碎中断机制以及使用
这个简略说下软中断、硬中断、寄存器保留、替换等等。例子包含常见的零碎调用 socket、read。
- 过程、线程、协程区别以及常见过程 IPC 形式及其实现原理
过程:操作系统分配资源的根本单位。
线程:操作系统调度的根本单位。
协程:有应用层本人负责调度器实现。长处:调度开销小。
常见 IPC:共享内存、套接字、信号量、管道、音讯队列。
- c++ 11 智能指针内存治理形式和 Golang 的 GC
这个说了援用计数,而后聊到内存调配的两级配置器。GC 不理解。
- c++11 智能指针的循环援用怎么解决。
两种形式。1,调用 reset 被动开释。2. 应用弱援用 weak_ptr
- docker 和虚拟机区别?
轻量级。docker 提供虚构容器,虚拟机提供整个操作系统。
- TCP 的牢靠机制?
进行期待、滑动窗口、拥塞管制。接着谈谈拥塞管制四个算法。
- 网页上拜访 HTTP 产生了什么?
DNS、创立网络连接、ARP、三次握手;HTTP 协定封装等等顺着程序说就行了。
- 形容竞态以及死锁并举例
指多个工作单元同时拜访同一个资源,就会呈现并发,竞态的景象。
- c/c++ 未定义行为是什么样子?举例
此题没搞懂,未定义的行为怎么去定义,不应该是随机的吗?
- 讲讲 bootloader 和 image
晓得不多,没有说。
- 讲讲 Linux 分区和挂载
岗位不同,没说。
- 谈谈 Linux 文件系统
晓得不多,没说。
- 翻译一段英文文章,看了下,内容波及多线程这一块。
pass。
- 动静布局的三个必要条件。
最优子结构性质。如果问题的最优解所蕴含的子问题的解也是最优的,咱们就称该问题具备最优子结构性质(即满足最优化原理)。最优子结构性质为动静布局算法解决问题提供了重要线索。
无后效性。即子问题的解一旦确定,就不再扭转,不受在这之后、蕴含它的更大的问题的求解决策影响。
子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被反复计算屡次。动静布局算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,而后将其计算结果保留在一个表格中,当再次须要计算曾经计算过的子问题时,只是在表格中简略地查看一下后果,从而取得较高的效率。
整体上偏差底层技术,难度中等,有深度,不要求全会,然而会的局部可能搞懂原理最好。
算法题给了个双指针算法,扩大题没想到堆排序。
根底题答复了大部分,波及驱动局部常识没有讲,也不会。之前筹备的 redis、mongodb、kafka 倒是一点没问,整个面试给人感觉良好,有所得,没有浪费时间。
极客工夫 Go 工程师零根底待业班 – 我的项目实战
package handler
import (
dblayer "../../filestore-server/db"
"../../filestore-server/util"
"fmt"
"io/ioutil"
"net/http"
"time"
)
const (pwdSalt = "*#520")
// 解决用户的注册申请
func SignupHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == http.MethodGet {data, err := ioutil.ReadFile("./static/view/signup.html")
if err != nil {w.WriteHeader(http.StatusInternalServerError)
return
}
w.Write(data)
return
}
// 参数校验
r.ParseForm()
username := r.Form.Get("username")
password := r.Form.Get("password")
if len(username) < 3 || len(password) < 5 {w.Write([]byte("invalid parameter"))
return
}
encPassword := util.Sha1([]byte(password + pwdSalt))
suc := dblayer.UserSignup(username, encPassword)
if suc {w.Write([]byte("SUCCESS"))
} else {w.Write([]byte("FAILED"))
}
}
// 用户登录
func SigninHandler(w http.ResponseWriter, r *http.Request) {r.ParseForm()
username := r.Form.Get("username")
password := r.Form.Get("password")
encPasswd := util.Sha1([]byte(password + pwdSalt))
// 1. 校验用户名及明码
pwdChecked := dblayer.UserSignin(username, encPasswd)
if !pwdChecked {w.Write([]byte("FAILED"))
return
}
// 2. 生成拜访凭证(token)
token := GenToken(username)
upRes := dblayer.UpdateToken(username, token)
if !upRes {w.Write([]byte("FAILED"))
return
}
// 3. 登录胜利后重定向到首页
resp := util.RespMsg{
Code: 0,
Msg: "OK",
Data: struct {
Location string
Username string
Token string
}{
Location: "http://" + r.Host + "/static/view/home.html",
Username: username,
Token: token,
},
}
w.Write(resp.JSONBytes())
}
// 查问用户信息
func UserInfoHandler(w http.ResponseWriter, r *http.Request) {
// 1. 解析申请参数
r.ParseForm()
username := r.Form.Get("username")
// 2. 拦截器校验 token
// 3. 查问用户信息
user, err := dblayer.GetUserInfo(username)
if err != nil {w.WriteHeader(http.StatusForbidden)
return
}
// 4. 组装并且响应用户数据
resp := util.RespMsg{
Code: 0,
Msg: "OK",
Data: user,
}
w.Write(resp.JSONBytes())
}
// 生成 token
func GenToken(username string) string {// 40 位字符:md5(username+timestamp+token_salt)+timestamp[:8]
ts := fmt.Sprintf("%x", time.Now().Unix())
tokenPrefix := util.MD5([]byte(username + ts + "_tokensalt"))
return tokenPrefix + ts[:8]
}
// IsTokenValid : token 是否无效
func IsTokenValid(token string) bool {if len(token) != 40 {return false}
// TODO: 判断 token 的时效性,是否过期
// TODO: 从数据库表 tbl_user_token 查问 username 对应的 token 信息
// TODO: 比照两个 token 是否统一
return true
}
资源链接: https://pan.baidu.com/s/1Qq3F… 提取码: kczq
作者 -\/ 307570512
\/ itspcool 交流学习