Google资深工程师深度讲解Go语言-课程笔记

news2024/11/13 9:17:52

课程目录:

第1章 课程介绍

欢迎大家来到深度讲解Go语言的课堂。本课程将从基本语法讲起,逐渐深入,帮助同学深度理解Go语言面向接口,函数式编程,错误处理,测试,并行计算等元素,并带领大家实现一个分布式爬虫的实战项目。

  • 1-1 Google资深工程师深度讲解go语言 试看
  • 1-2 安装与环境
  • 1-3 国内镜像配置
  • 1-4 IntelliJ Idea 的安装和配置
  • 1-5 vscode 的安装和配置
Go语言的安装与开发环境

下载:

国内:http://studygolang.com/dl

https://golang.org/dl/

# 设置国内镜像
go env -w GOPROXY=https://goproxy.cn,direct
# 开启 Go Module
go env -w GO111MODULE=on
# goimports
go get -v golang.org/x/tools/cmd/goimports

开发环境:vi, emacs, idea, eclipse, vs, sublime … + go 插件

IDE:Goland, liteIDE
文章视频链接

第2章 基础语法

量,常量,类型,选择,循环,函数,指针,本章节带领大家学习一门新语言所需的必备语法知识。让大家对Go语言有一个初步的认识!

  • 2-1 变量定义
  • 2-2 内建变量类型
  • 2-3 常量与枚举
  • 2-4 条件语句
  • 2-5 循环
  • 2-6 函数
  • 2-7 指针

Go语言指针不能运算
Go 语言只有值传递一种方式
在这里插入图片描述

第3章 内建容器

本章节我们来学习数组,切片,Map和字符串。在Go语言中,我们一般不直接使用数组,而是使用切片来管理线性表结构,它的语法类似python的list,不过更强大哦。当然,Map和字符串的学习也是必不可少。掌握至此,我们就可以写一些简单的算法了,刷刷leetcode不在话下,我们就来试一试。…

  • 3-1 数组
  • 3-2 切片的概念
  • 3-3 切片的操作
  • 3-4 Map
  • 3-5 Map例题
  • 3-6 字符和字符串处理
    文章视频链接

第4章 面向“对象”

Go语言没有class,只有struct。我们来看看struct如何使用,Go语言给结构体定义类似方法或者成员函数的做法非常有特色。我们还将学习Go语言的包的概念,以及如何封装,如何扩展已有类型等。我们还将学习GOPATH和Go语言项目的目录结构,如何从网上下载依赖包等一系列项目相关的知识。我们将以“树”的结构和遍历作为贯穿本章…

  • 4-1 结构体和方法
  • 4-2 包和封装
  • 4-3 扩展已有类型
  • 4-4 使用内嵌来扩展已有类型
结构体和方法

不论地址还是结构本身,一律使用 . 来访问成员

结构创建在堆上还是栈上? 不需要知道 自动垃圾回收

可以使用指针作为方法的接收者

只有使用指针才可以改变结构体内容 nil 指针也可以调用方法 值接收者 vs 指针接收者

要改变内容必须使用指针接收者 结构体过大也考虑使用指针接收者(性能考虑) 一致性:如有指针接收者,最好都是指针接收者 值接收者是
go语言特有 值/指针接收者的方法都是使用 . 来调用

第5章 Go语言的依赖管理

关于Go语言的依赖管理大有可用,只讲核心的,只学有用的,把时间投资在最有价值的学习上。

  • 5-1 依赖管理
  • 5-2 GOPATH 和 GOVENDOR
  • 5-3 go mod的使用
  • 5-4 目录的整理
依赖管理的三个阶段 GOPATH, GOVENDOR, go mod
1. GOPATH 依赖管理
  • GOPATH 依赖管理是通过设置依赖查找路径,来实现依赖导入。
  • 缺点:1. 所有代码的依赖都放置到同一个地方,当不同项目对相同依赖的版本不一致时,将无法处理; 2. 所有的项目代码需要放置到 GOPATH 目录下的 src 目录中,只有这样代码运行时,才能找到 GOPATH 下的依赖。
# 配置成GOPATH模式
go env  # 查看配置项
go env -w GO111MODULE=off   # 关闭go mod 模式,临时设置 export GO111MODULE=off
go env -w GOPATH=/root/go   # 临时设置 export GOPATH=/root/go 
# 需要在GOPATH目录下创建 src 文件夹,用于放置自己编写的代码
mkdir /root/go/src

# 安装测试依赖
go get -u go.uber.org/zap 
2. GOVENDOR 依赖管理
  • GOVENDOR 依赖管理是通过在当前项目目录下新建 vendor 文件夹,放置本项目使用依赖库,
    代码运行时,优先从 vendor 目录下查找依赖,如果没有找到,就会到 GOPATH 目录下查找依赖库。
  • 缺点:需要用户手动拷贝依赖库到 vender 目录下,自动化操作时需要使用第三方依赖库(如:glide, dep, go dep, …)
3. go mod 依赖管理
  • 配置系统为 go mod 模式
    go env -w GO111MODULE=on  # 配置 go mode 模式
    go env -w GOPROXY=https://goproxy.cn,direct  # 使用国内源
    
  • 由go命令统一管理,用户不必关心项目所在目录和vendor目录
  • 初始化 go mod: go mode init [name], eg: go mode init gomodtest, 执行命令后将生成 go.mod 文件
  • 安装依赖,在 go.mod 文件所在目录下执行
    go get -u go.uber.org/zap   # 安装最新版本
    go get go.uber.org/zap@1.11  # 安装指定版本
    
  • 更新依赖后通过整理命令清理旧的依赖记录
    go get go.uber.org/zap@1.11   # 安装zap@1.11
    go get go.uber.org/zap@1.12   # 更新到zap@1.12
    go mod tidy    # 重新整理依赖记录
    
  • 将旧项目迁移到go mod:
    go mod init [mod_name]  # 初始化 go.mod 文件
    go build ./...          # 将所有项目依赖记录到go.mod中
    

第6章 面向接口

这一章我们从duck typing的概念开始学起,还将探讨其他语言中对duck typing的支持,由此引出接口的概念。我们将深入理解Go语言接口的内部实现以及使用接口实现组合的模式。

  • 6-1 接口的概念
  • 6-2 duck typing的概念 试看
  • 6-3 接口的定义和实现
  • 6-4 接口的值类型
  • 6-5 接口的组合
  • 6-6 常用系统接口

第7章 函数式编程

在其他通用语言中,函数式编程是“高级”概念,但对于Go语言却非常基本。本章我们将讲解函数式编程的概念并且比较其他语言函数式编程的实现方法。我们将重点理解闭包。这章中我们将采用多样的例题来帮助大家更好的理解闭包,函数作为一等公民等及其常见概念和应用方法。…

  • 7-1 函数式编程
  • 7-2 函数式编程例一
  • 7-3 函数式编程例二
    文章视频链接

第8章 错误处理和资源管理

这将是本课程最“无聊”的一章,但却是区分出优秀软件工程师的关键能力。Go语言独特的defer/panic/recover,以及错误机制,在社区有着广泛的争论。我们来深入理解Go语言的错误处理机制,看看Go语言如何区分错误以及异常。最后,我们实现一个Web应用微型项目,采用商业服务的错误处理思路,结合函数式编程,来演示Go语言错误…

  • 8-1 defer调用
  • 8-2 错误处理概念
  • 8-3 服务器统一出错处理
  • 8-4 panic和recover
  • 8-5 服务器统一出错处理2

第9章 测试与性能调优

Go语言的测试不同于其他如junit,Go语言采用“表格驱动测试”的理念。我们将学习和体会这样的理念,并用Go语言的测试支持库来实践表格驱动测试,并做代码覆盖和性能检测,通过內建的性能调优工具来优化我们之前的算法。最后演示了对http服务器的多种粒度的测试。…

  • 9-1 测试
  • 9-2 代码覆盖率和性能测试
  • 9-3 使用pprof进行性能调优
  • 9-4 测试http服务器(上)
  • 9-5 测试http服务器(下)
  • 9-6 生成文档和示例代码
  • 9-7 测试总结

第10章 Goroutine

这一章开始我们进入并发编程。我们讲解Goroutine,协程的概念,以及背后的Go语言调度器。

  • 10-1 goroutine
  • 10-2 go语言的调度器

第11章 Channel

Channel是Goroutine之间通信的桥梁,它和函数一样是一等公民。在介绍完Channel的语法及运行方式后,我们将采用数个例题来演示Go语言并发编程中最常见的任务极其解决模式。

  • 11-1 channel
  • 11-2 使用Channel等待任务结束
  • 11-3 使用Channel进行树的遍历
  • 11-4 用select进行调度
  • 11-5 传统同步机制
  • 11-6 sync包的使用
sync包的使用
  • Mutex 互斥锁
    1. Lock()
    2. UnLock()
  • RWMutex 读写互斥锁
    1. Lock() 写的时候,排斥其他的写锁和读锁
    2. UnLock() 释放写锁
    3. Rlock() 在读取的时候 不会阻塞其他的读锁,但是会排斥写锁 Lock()
    4. RUnlock() 释放读锁
  • Once Once.Do(一个函数) 这个方法无论被调用多少次,只会执行一次
  • WaitGroup
    1. Add(delta int) 设定需要Done多少次
    2. Done() 没执行一次加1
    3. Wait() 阻塞到 执行Done() 的次数 和 Add(delta int)的delta次数相同
      示例代码详见 chapter_11/02_channel_done/channelWaitGroup_2
  • Map 一个并发字典, 可并发读写
    1. Store(key, val) 写入字典中数据
    2. Load(key) 读取字段中数据
    3. LoadOrStore(key, defaultVal) 读不到设置key默认值defaultVal
    4. Range(func(key, value interface{}) bool {})
      传入一个函数,遍历字典(函数每返回true, 开始遍历下一个元素,返回false终止遍历)
    5. Delete(key) 删除字典中key
  • Pool 并发池 通过Put 将数据丢到Pool中,然后Get() 但是没有顺序,可以用完再丢回去
    1. Put
    2. Get
  • Cond 通知锁
    1. NewCond(lock) 创建一个Cond
    2. cond.L.Lock() ~ cond.L.Unlock() 创建一个锁区间 在区域内部可以cond.Wait()
    3. cond.Wait() 在锁区间内部可以cond.Wait()
    4. cond.Broadcast() 全部释放cond.Wait()
    5. cond.Signal() 解锁一个cond.Wait()

第12章 迷宫的广度优先搜索

这章我们将综合运用学过的知识实现一个广度优先算法来解迷宫,为接下来的实战项目做好技术和算法上的准备。广度优先算法不仅是面试和工作中常用的技术,而且实现上相比大部分其它算法更为复杂,是检验是否熟练掌握一门语言的经典例题。让我们来试一试吧。…

  • 12-1 迷宫_算法
  • 12-2 迷宫代码实现

第13章 http及其他标准库

这里我们简要介绍一下Go语言中非常重要而且封装良好的http标准库,回顾并实现http客户端和服务器。我们还介绍了Go语言中其他的标准库。

  • 13-1 http标准库
  • 13-2 其它标准库
  • 13-3 gin 框架介绍
  • 13-4 为gin增加middleware

第14章 开始实战项目

至此为止,恭喜同学完成了这门课Go语言部分的学习。接下来我们来进入实战项目。本章将介绍项目的具体内容,课题的选择,技术选型,总体架构,以及实现步骤。

  • 14-1 爬虫项目介绍
  • 14-2 爬虫的法律风险
  • 14-3 新爬虫的选择
  • 14-4 总体算法
  • 14-5 模拟相亲网站上线啦!

第15章 单任务版爬虫

在考虑性能之前我们首先应该考虑正确性。单任务版爬虫确保我们能够正确爬取我们所需的信息。我们应用了之前练习的广度优先算法,抽象出Parser和Fetcher,学习正则表达式,成功实现并运行单任务版爬虫。

  • 15-1 获得初始页面内容
  • 15-2 正则表达式
  • 15-3 提取城市和url
  • 15-4 单任务版爬虫的架构
  • 15-5 Engine 与 Parser
  • 15-6 测试CityListParser
  • 15-7 城市解析器
  • 15-8 用户信息解析器(上)
  • 15-9 用户信息解析器(下)
  • 15-10 单任务版爬虫性能
    文章视频链接

第16章 并发版爬虫

为了提升爬虫性能,我们抽象出Worker的概念,并添加调度器,实现并发版爬虫。我们应用接口的概念,完成了由简至复杂的多个调度器的实现。同学可以在实战项目中更真实的体会并学习Go语言并发编程的多种模式。

  • 16-1 并发版爬虫架构
  • 16-2 简单调度器
  • 16-3 并发调度器
  • 16-4 队列实现调度器
  • 16-5 重构和总结
  • 16-6 更多城市
  • 16-7 更多用户与去重

第17章 数据存储和展示

是时候检验我们项目的成果了。我们将采用Docker+ElasticSearch来存储我们爬取的信息。在简单了解Docker和ElasticSearch后,我们将使用ElasticSearch的Go语言客户端将爬取数据写入。之后我们使用Go语言的模板引擎迅速实现前端网页展示。至此,我们已经可以尝试自己喜欢的搜索条件去查看数据啦。…

  • 17-1 ItemSaver的架构
  • 17-2 Docker和ElasticSearch介绍
  • 17-3 Docker的安装和使用
  • 17-4 ElasticSearch入门
  • 17-5 向ElasticSearch存储数据
  • 17-6 完整爬虫的运行与数据存储
  • 17-7 添加URL与ID
  • 17-8 重构与运行
  • 17-9 标准模板库介绍
  • 17-10 实现前端展示页面
  • 17-11 完善前端展示

第18章 分布式爬虫

本章在简要介绍分布式概念后,将我们的并发爬虫改写成分布式。我们在很少改动的情况下,加入jsonrpc客户/服务端,实现并部署分布式爬虫。最后探讨实战项目的更多改进方案。

  • 18-1 分布式系统简介
  • 18-2 分布式爬虫架构
  • 18-3 jsonrpc的使用
  • 18-4 ItemSaver服务
  • 18-5 整合ItemSaver服务
  • 18-6 解析器的序列化
  • 18-7 实现爬虫服务
  • 18-8 完整分布式爬虫的运行
  • 18-9 使用连接池链接爬虫集群
  • 18-10 实战项目总结
  • 18-11 进一步的工作

第19章 课程总结

感谢同学们学到这里,恭喜同学们给自己的技术栈加上了非常重要的Go语言技能。希望同学们带着这门课上学到的知识,更好的参与到项目中去,共同推动Go语言的发展。

  • 19-1 体会Go语言的设计
  • 19-2 课程总结
    课程概览
    在这里插入图片描述

在这里插入图片描述

文章视频链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1933599.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高性能内存对象缓存Memcached

memcached常用架构 memcached分布式示例图 一致性hash算法简单示例图

Yum包下载

1. 起因 内网有一台服务器需要升级php版本,维护的同学又不想二进制安装.服务器只有一个光盘的yum仓库 2. 解决方法 解决思路如下: 外网找一台机器配置php8.3.8的仓库外网服务器下载软件集并打包内网服务器上传并解压实现升级 2.1 下载php8.3.8仓库 配置php仓库 rootcent…

SQL 子查询中,查询了一个不存在的字段,居然不报错

前言 前几天在做一个需求,用户所在的部门被删除了,对应用户的角色也要清空。测试测的时候发现,只要测我的这个需求系统的所有角色都被删除了。。。。。。。 我看了日志也没报错呀,我也没有删除所有账号的角色呀。我有点不相信&a…

(一)原生js案例之图片轮播

原生js实现的两种播放效果 效果一 循环播放&#xff0c;单一的效果 代码实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sc…

4款良心软件,免费又实用,内存满了都舍不得卸载

以下几款高质量软件&#xff0c;若是不曾体验&#xff0c;实在是遗憾可惜。 PDF Guru 这是一款开源免费的PDF编辑软件&#xff0c;打开之后功能一目了然。 可以拆分、合并PDF&#xff0c;也可以给PDF添加水印和密码&#xff0c;同时也可以去除别人PDF里的水印或密码&#xff0…

状态管理的艺术:探索Flutter的Provider库

状态管理的艺术&#xff1a;探索Flutter的Provider库 前言 上一篇文章中&#xff0c;我们详细介绍了 Flutter 应用中的状态管理&#xff0c;以及 StatefulWidget 和 setState 的使用。 本篇我们继续介绍另一个实现状态管理的方式&#xff1a;Provider。 Provider优缺点 基…

Spock单元测试框架使用介绍和实践

背景 单元测试是保证我们写的代码是我们想要的结果的最有效的办法。根据下面的数据图统计&#xff0c;单元测试从长期来看也有很大的收益。 单元测试收益: 它是最容易保证代码覆盖率达到100%的测试。可以⼤幅降低上线时的紧张指数。单元测试能更快地发现问题。单元测试的性…

STM32 UART 硬件结构

访问串口与读写内存无差&#xff0c;串口将寄存器中的值通过数据线一位一位的传输出去 协议 设置波特率&#xff0c;数据位 115200 8 n 1 BSRR/CR 查询方式进行数据的发送与接收 &#xff08;在一个while循环中判断状态&#xff0c;然后读取数据&#xff09; 1、发送…

在线商城系统带万字文档java项目java课程设计java毕业设计

文章目录 在线商城系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码带万字文档&#xff08;9.9&#xffe5;带走&#xff09; 在线商城系统 一、项目演示 在线商城系统 二、项目介绍 基于springbootvue的前后端分离在线商…

Vue3滚动条(Scrollbar)

效果如下图&#xff1a;在线预览 APIs Scrollbar 参数说明类型默认值必传contentStyle内容样式CSSProperties{}falsesize滚动条的大小&#xff0c;单位 pxnumber5falsetrigger显示滚动条的时机&#xff0c;none 表示一直显示‘hover’ | ‘none’‘hover’falsehorizontal是否…

【韩顺平零基础学java】第17章补充笔记记录

1.线程终止 线程完成任务后会自动退出 或者可以使用变量来控制run方法退出的方式终止线程&#xff0c;即通知方式 【例】Threadexit 启动一个线程T。要求在main方法中终止线程T public class ThreadExit_ {public static void main(String[] args) throws InterruptedExcepti…

网络故障处理及分析工具:Wireshark和Tcpdump集成

Wireshark 是一款免费的开源数据包嗅探器和网络协议分析器&#xff0c;已成为网络故障排除、分析和安全&#xff08;双向&#xff09;中不可或缺的工具。 本文深入探讨了充分利用 Wireshark 的功能、用途和实用技巧。 无论您是开发人员、安全专家&#xff0c;还是只是对网络操…

Unity格斗游戏,两个角色之间互相锁定对方,做圆周运动

1&#xff0c;灵感来源 今天手头的工作忙完了&#xff0c;就等着服务器那边完活&#xff0c;于是开始研究同步问题。 正好想到之前想做的&#xff0c;两个小人对线PK&#xff0c;便有了这篇文章。 2&#xff0c;要实现的效果 如图所示&#xff0c;两个小人可以互相锁定&…

RuoYi-后端管理项目入门篇1

目录 前提准备 下载若依前后端 Gitee 地址 准备环境 后端数据库导入 1 克隆完成 若依后端管理后端 Gitte 地址 :若依/RuoYi-Vue 2.1 创建Data Source数据源 2.2 填写好对应的数据库User 和 Password 点击Apply 2.3 新建一个Schema 2.4 填写对应数据库名称 这边演示写的…

linux shell脚本编程(分支语句、循环语句)

一、分支语句 1、语法结构 : if 表达式 then 命令表 fi 如果表达式为真 , 则执行命令表中的命令 ; 否则退出 if 语句 , 即执行 fi 后面的语句。 if 和 fi 是条件语句的语句括号 , 必须成对使用 ;命令表中的命令可以是一条 , 也可以是若干条。 2、语法结构为 : if 表达式 t…

Flink源码学习资料

Flink系列文档脑图 由于源码分析系列文档较多&#xff0c;本人绘制了Flink文档脑图。和下面的文档目录对应。各位读者可以选择自己感兴趣的模块阅读并参与讨论。 此脑图不定期更新中…… 文章目录 以下是本人Flink 源码分析系列文档目录&#xff0c;欢迎大家查阅和参与讨论。…

leetcode日记(42)螺旋矩阵

我使用的是递归&#xff0c;每次递归遍历一圈矩阵&#xff0c;将遍历结果塞进结果vector中&#xff0c;每次遍历修改上下左右边界&#xff0c;直至遍历后其中两边界重合或交错。 class Solution { public:vector<int> spiralOrder(vector<vector<int>>&…

MySQL双主双从实现方式

双主双从&#xff08;MM-SS&#xff09; 前言 避免单一主服务器宕机&#xff0c;集群写入能力缺失 从 1 复制 主1 &#xff0c;从 2 复制 主 2 主 1 复制 主 2&#xff0c;主 2 复制主 1 也就是 主 1 和主 2 互为主从。主1主2互为主从&#xff0c; 是为了以下情景&#xff0c…

Fork_Join模式:分治和Work-Stealing的完美结合

引言 在计算机科学领域&#xff0c;解决大规模数据和复杂计算任务的需求促使了并行计算模型的发展。Fork/Join模式以其独特的分治和Work-Stealing结合的方式&#xff0c;成为解决可分解并行问题的一项卓越选择。本文将重点探讨Fork/Join模式中分治和Work-Stealing的关键优势&a…

【网络】掌握网络基础概念

文章目录 OSI七层模型TCP/IP五层&#xff08;或四层&#xff09;模型为什么要有TCP/IP协议网络传输的基本流程网络传输流程图数据包封装和分用 网络中的地址管理IP地址Mac地址比较IP地址和Mac地址 OSI七层模型 OSI即Open System Interconnection,开发系统互连。OSI七层模型是一…