Golang实战班

适合人群

有Linux基础,有志于使用Go语言做分布式系统编程的人员,想往系统架构师方向发展的同学。BAT架构师带你一起飞。

上课时间

每周六(9:30-18:30)

课时安排

最新一期10-14号开课,火爆招生中

历时3个月(每周六,15天)

课程费用

面授费用和网络班学费(提供课堂视频、多媒体直播、终身免费重听)请咨询QQ

课程目标

1 掌握迄今为止最为强大易用的分布式编程语言。像脚本语言一样易用,运行效率和C比肩。

2 为向架构师,技术总监发展奠定基础

3 带领学员在实战中学习,摸爬滚打中积累经验

51Reboot.com 教学特色

以结果为导向,以实战为特色,实战内容完全贴近运维开发实际需求

所有讲师均由顶尖互联网公司资深开发工程师担当,实战与授课经验丰富,深入浅出

十几人小班授课,导师和助教一对一辅导

精选教材,内容反复锤炼,精炼详实,既有实用基础知识,又有丰富的系统底层原理讲解

真正资深面试官进行面试辅导与模拟面试,大大提升你的就业与跳槽成功几率!

优秀学员加入 51Reboot.com 精英团, 由 BAT 顶尖互联网公司资深工程师一对一无保留免费指导,带 你迈入顶尖互联网公司的大门

讲师介绍

饼干老湿 某在线旅游网站基础架构部架构师,曾经在腾讯工作,见证了在线旅游行业整个基础架构&自动化运维从无到有的整个过程。主要技术方向是高并发以及分布式系统的设计与实现。

PC老湿 大学时期就负责学校官方网站的运维工作,实习期间加入豆瓣,有幸成为豆 瓣Top20员工,从事Python开发及运维工作,后在BAT从事自动化运维,见证BAT运 维自动化从无到有。擅长系统底层、分布式系统开发,热衷于开源运动,给 memcached、SETI@Home等多个开源项目贡献过代码

并发能力

golang拥有无与伦比的并发能力,可以用极少的代码完成复杂架构的设计。

课程简介

自我介绍

先做一下自我介绍,我从2013年开始使用go,到现在已经有4年的历史了,我从事的工作主要是自动化运维和基础架构相关的工作,因为工作的特点,也促使我最早接触到go语言,
在做了几个成功的项目之后,就开始在全部门推广go的使用,现在go语言已经成为部门的后端语言标配,之后也在公司层面推广过go语言,可以说是一个go语言的布道者。

特性一览

Go语言是Google于2009年开源的一门新的系统编程语言,主要有以下特点:

  • 静态编译
  • 垃圾回收
  • 简洁的符号和语法
  • 平坦的类型系统
  • 基于CSP的并发模型。
  • 高效简单的工具链。
  • 丰富的标准库

Hello world

我们先看下go的hello world

package main

import "fmt"

func main() {
    fmt.Println("hello, world")
}

可以看出go的语法风格跟c还是很像的,有c或者python背景的同学应该不难理解。

我们再看另外一个例子,是用go写的一个HTTP的例子

package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, world!")
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

我们很容易就写出来一个高并发的HTTP库,这得益于go内置了一个完整的HTTP库的实现,再加上go天然的并发支持,写出高性能的HTTP服务其实可以很简单。

Go出生的背景

Go最早并不是一个Google的正式项目,而是作为一个"20%"的项目出现的,直到2009年才以开源的方式面向大众,目前go team有稳定的发布周期,大约半年一个新的版本,最新的是1.8。
Go语言的出身可以说非常豪华,最早对go语言的讨论是由罗伯特·格瑞史莫、罗伯·派克和肯·汤普逊发起的,主要是为了解决c++中出现的问题而发起的项目。肯·汤普逊是c语言和unix的发明者,罗伯特·格瑞史莫参与设计了Java的HotSpot虚拟机和Chrome浏览器的JavaScript V8引擎,罗博·派克在大名鼎鼎的bell lab侵淫多年,参与了Plan9操作系统、C编译器以及多种语言编译器的设计和实现。

Go语言从2009年开源到现在吸引了很多开发者的注意,分别获得了2009年和2016年的TIOBE之星,如果说2009年那一次是因为Google的影响,那2016年这一次绝对是自身实力的厚积薄发

为什么需要一个新的语言

传统的语言比如c++,大家花费太多时间来学习如何使用这门语言,而不是如何更好的表达写作者的思想,同时编译花费的时间实在太长,对于编写-编译-运行这个链条来说周期太长。动态语言如Python,由于没有强类型的约束,很多问题需要在运行时发现,这种低级错误更应该交给编译器来发现。

同时有如下趋势:

  • 人力成本越来越高
  • 机器越来越便宜
  • 机器的性能越来越厉害
  • 在开发效率和运行速度上达到平衡

这就是go诞生的背景。

Go的哲学

简化这门语言必是一门更大的成就 - Rob Pike

Go的思维方式

  • 最小心智负担原则
  • 最小特性
  • 最少惊异
  • 最少犯错机会

Go的目标是成为互联网的c语言,在保持了c简单明了的基础上,同时加入了一些自己的特性

  • 少就是指数级的多
  • 最少特性原则:如果一个功能不对解决任何问题有显著价值,那么就不提供
  • 显式表达:所写即所得的语言
  • 极度简化但完备的OOP
  • 功能内聚:例如,强大的组合能力
  • 最友善的 C 语言的支持

Go是一门以软件工程为目的的语言设计:

  • 快速编译
  • 严格的依赖管理
  • 代码风格的强一致性
  • 偏向组合而不是继承

列出几个我认为比较优秀的设计:

  • if for switch之类的语句不需要用括号了,但保留了大括号,方便定位语句块。
  • 可以使用 := 进行自动类型推导。再也不用写诸如 list::iterator it = l.begin()之类的语法了。
  • 使用字母大小写设置可见性(letter case sets visibility)。省去了成员前面一堆的public和private,直接看名字就可以辨认。
  • 保留了指针操作,但去掉了指针算术,指针更安全了,同时留给了程序员使用值语义和引用语义的权利。
  • defer关键字。妈妈再也不用担心句柄没有关闭了。

Go对OOP的支持有如下特点:

  • 返璞归真,没有继承,只有组合
  • 明确区分复用和抽象,复用使用组合,抽象使用
  • 所见即所得,明确的内存模型,没有vtable之类的东西
  • 鸭子类型,抽象更方便

Go对并发的支持是一个重要的特性,go有两大神器来支持并发:

  • goroutine:轻量的"线程"
  • channel: 带类型的,协程安全的管道,类似unix里面的pipe

Go解决C10K问题

func handle(conn net.Conn) {
    fmt.Fprintf(conn, "%s", time.Now().String())
    conn.Close()
}

func main() {
    l, err := net.Listen("tcp", ":8080")
    if err != nil {
        log.Fatal(err)
    }
    for {
        conn, err := l.Accept()
        if err != nil {
            log.Fatal(err)
        }
        go handle(conn)
    }
}

很直接,回归最原始的思维方式,没有回调地狱

Go在工程上的设计

Go在工程上的设计可谓体贴入微:

交叉编译只是一个环境变量的问题:

  • 编译成linux的二进制 GOOS=linux go get github.com/icexin/markdown
  • 编译成windows的二进制 GOOS=windows go get github.com/icexin/markdown
  • 编译成arm上的二进制 GOOS=linux GOARCH=arm go get github.com/icexin/markdown
    如果尝试过c的交叉编译的同学就能体会这种便捷性。

一些一键命令:

  • 一键编译 go build
    go build github.com/icexin/markdown

  • 一键测试 go test
    go test github.com/icexin/markdown

  • 一键下载更新依赖并编译 go get
    go get github.com/icexin/markdown

Go对文档的支持是目前所有语言里面最贴心的,比如你在github上看到一个项目叫github.com/go-redis/redis,前面加上godoc.orggodoc.org/github.com/go-redis/redis就可以自动生成所有的文档。

Go的明星项目:

  • Docker,正火热的容器化技术
  • kubernetes,Goole Borg的开源实现
  • Etcd, 类似zookeeper的高可用key-value存储
  • TIDB, 国人开发的Google spanner的开源实现

Go学习资料

  • 官方网站 golang.org
  • Go在线教程 tour.golang.org
  • 文档 golang.org/doc/
课表

Go语言课程

一、Golang入门

  • Golang常用开发工具介绍
    • 编辑器IDE
    • 编译运行或者直接运行
  • Hello, World
  • 命令行参数
  • 查找重复的行
  • GIF动画
  • Golang写爬虫
  • Golang爬虫并发实战
  • Golang实现一个HTTP服务
  • 本章要点回顾

二、Golang程序结构

  • Golang的设计哲学:约定优于机制
  • 命名
  • 声明
  • 变量
  • 赋值
  • 类型
  • 包和文件
  • 作用域

课堂小知识:

  • HTTP、TCP、IP协议详解
    • HTTP协议基础,各种常见header的含义
    • HTTP性能优化:KeepAlive、连接复用
    • HTTP、TCP、UDP等常见协议的关系

三、Golang的基础数据类型

  • 整型
  • 浮点数
  • 复数
  • 布尔型
  • 字符串
  • const常量

课堂小知识:

  • Linux文件系统原理,inode、空洞文件。
  • Golang文件操作,顺序读写,随机读写。

四、Golang复合数据类型

  • 数组
  • Slice
  • Map
  • 结构体
  • Golang的JSON处理
  • 文本和HTML模板

课堂小知识:

  • CPU L1、L2 cache介绍以及对性能的影响
  • Linux Buffer、Cache对性能的影响

五、Golang的函数

  • 函数声明
  • 递归
  • 多返回值
  • 错误
  • 函数值
  • 匿名函数
  • 可变参数
  • Deferred函数
  • Panic异常
  • Recover捕获异常

课堂小知识:

  • 长连接和短连接,推送机制的实现
  • 通信协议的实现,通信协议的关键点
  • 深入理解HTTP协议
  • 为什么HTTP协议是现在这个样子

六、Golang的方法

  • 方法声明
  • 基于指针对象的方法
  • 通过嵌入结构体来扩展类型
  • 方法值和方法表达式
  • Golang编码实战: Bit数组
  • Golang的封装
  • 闭包的概念,用Golang实现闭包

开源架构分析:

  • Docker实现原理解析
    • CGroups和LXC隔离技术
    • namespace技术解析
    • 分层文件系统AUFS和DeviceMapper

七、Golang的接口

  • 接口是合约
  • 接口类型
  • 实现接口的条件
  • flag.Value接口
  • 接口值
  • sort.Interface接口
  • http.Handler接口
  • error接口
  • Golang编码实战: 表达式求值
  • 类型断言
  • 基于类型断言识别错误类型
  • 通过类型断言查询接口
  • 类型分支
  • Golang编码实战: 基于标记的XML解码
  • 补充几点

八、Golang的协程和Channel

  • Golang编码实战: 并发的Clock服务
  • Golang编码实战: 并发的Echo服务
  • Channel
  • 并发的循环
  • Golang编码实战: 并发的Web爬虫
  • 基于select的多路复用
  • Golang编码实战: 并发的字典遍历
  • 并发的退出
  • Golang编码实战: 聊天服务

课堂小知识:

  • 多进程多线程的产生,在Linux系统中的地位
  • 多进程和多线程的选用场景
  • 多进程、多线程基础;为什么不能一味的开线程解决问题
  • Go routines的实现原理

九、Golang基于共享变量的并发

  • 竞争条件
  • sync.Mutex互斥锁
  • sync.RWMutex读写锁
  • 内存同步
  • sync.Once初始化
  • 竞争条件检测
  • Golang编码实战: 并发的非阻塞缓存
  • Goroutines和线程

名企架构剖析:

  • Twitter 架构探秘----Scaling、Cache、Tracing

十、Golang包和工具

  • 包简介
  • 导入路径
  • 包声明
  • 导入声明
  • 包的匿名导入
  • 包和命名
  • 工具

名企架构剖析

  • 百亿量级数据库架构----Pinterest

十一、Golang测试简介

  • 测试和单元测试的含义和意义
  • go test
  • 测试函数
  • 测试覆盖率
  • 基准测试
  • 剖析
  • Golang编码实战函数

十二、Golang的反射

  • 为何需要反射?
  • reflect.Type和reflect.Value
  • Display递归打印
  • Golang编码实战: 编码S表达式
  • 通过reflect.Value修改值
  • Golang编码实战: 解码S表达式
  • 获取结构体字段标识
  • 显示一个类型的方法集

十三、Golang底层编程

  • unsafe.Sizeof, Alignof 和 Offsetof
  • unsafe.Pointer
  • Golang编码实战: 深度相等判断
  • 通过cgo调用C代码
  • 深度解析Golang net/rpc框架

十四、Golang综合大作业(手写监控系统)

  • Open-Falcon监控系统架构解析
  • 采集agent
  • 数据中转transfer + kafka
  • 数据入库saver + es
  • 报警模块

十五、大家来“点菜”

  • 51Reboot.com拥有强大的金牌讲师团队
  • 由同学们自己选择想要深入学习的内容
  • 由51Reboot.com金牌讲师给大家深入剖析讲解
  • 往届内容:
    • Google Borg分布式调度系统
    • 名企架构师面试实战
    • CI(持续集成)& CD(持续部署)