威❤ 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、点赞零碎设计

算法题,要求给出最优解,计算工夫复杂度和空间复杂度:

  1. 3个有序数组排列
  2. K个有序数组排列,(此题解法是堆排序)

根底题:

  1. 操作系统上电启动到运行init过程执行前做了什么?

    (1)开机BIOS自检,加载硬盘。
    (2)读取MBR,进行MBR疏导。
    (3)grub疏导菜单(Boot Loader)。
    (4)加载内核kernel。
    (5)启动init过程,根据inittab文件设定运行级别)

  1. 零碎中断机制以及使用

这个简略说下软中断、硬中断、寄存器保留、替换等等。例子包含常见的零碎调用socket、read。

  1. 过程、线程、协程区别以及常见过程IPC形式及其实现原理

过程:操作系统分配资源的根本单位。

线程:操作系统调度的根本单位。

协程:有应用层本人负责调度器实现。长处:调度开销小。

常见IPC:共享内存、套接字、信号量、管道、音讯队列。

  1. c++ 11智能指针内存治理形式和Golang的GC

这个说了援用计数,而后聊到内存调配的两级配置器。GC不理解。

  1. c++11 智能指针的循环援用怎么解决。

两种形式。1,调用reset被动开释。2. 应用弱援用weak_ptr

  1. docker和虚拟机区别?

轻量级。docker提供虚构容器,虚拟机提供整个操作系统。

  1. TCP的牢靠机制?

进行期待、滑动窗口、拥塞管制。接着谈谈拥塞管制四个算法。

  1. 网页上拜访HTTP产生了什么?

DNS、创立网络连接、ARP、三次握手;HTTP协定封装等等顺着程序说就行了。

  1. 形容竞态以及死锁并举例

指多个工作单元同时拜访同一个资源,就会呈现并发,竞态的景象。

  1. c/c++ 未定义行为是什么样子?举例

此题没搞懂,未定义的行为怎么去定义,不应该是随机的吗?

  1. 讲讲bootloader和image

晓得不多,没有说。

  1. 讲讲Linux分区和挂载

岗位不同,没说。

  1. 谈谈Linux文件系统

晓得不多,没说。

  1. 翻译一段英文文章,看了下,内容波及多线程这一块。

pass。

  1. 动静布局的三个必要条件。

最优子结构性质。如果问题的最优解所蕴含的子问题的解也是最优的,咱们就称该问题具备最优子结构性质(即满足最优化原理)。最优子结构性质为动静布局算法解决问题提供了重要线索。
无后效性。即子问题的解一旦确定,就不再扭转,不受在这之后、蕴含它的更大的问题的求解决策影响。
子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被反复计算屡次。动静布局算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,而后将其计算结果保留在一个表格中,当再次须要计算曾经计算过的子问题时,只是在表格中简略地查看一下后果,从而取得较高的效率。

整体上偏差底层技术,难度中等,有深度,不要求全会,然而会的局部可能搞懂原理最好。

算法题给了个双指针算法,扩大题没想到堆排序。

根底题答复了大部分,波及驱动局部常识没有讲,也不会。之前筹备的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 交流学习