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

课程目录:

第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.mzph.cn/bicheng/48034.shtml

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

相关文章

(vue)Vue读取public中的json文件,打包后只需更改包文件

(vue)Vue读取public中的json文件,打包后只需更改包文件 背景:增加账号需求。原本是在页面,每次都需技术人员添加再打包部署,现在放到json里,以后直接服务器改json就行。 旧版: let userArr [{username:aaa,password:…

VLAN 划分案例详解

vlan 的应用在网络项目中是非常广泛的,基本上大部分的项目都需要划分 vlan,这里从基础的 vlan 的知识开始,了解 vlan 的划分原理。 为什么需要 vlan: 1、什么是 VLAN? VLAN(Virtual LAN)&…

Python数据分析实战:利用ARIMA模型洞察股市规律

在股市中,数据的波动与变化风云莫测,难以捉摸。然而,借助科学的分析方法和工具,我们或许能够找到一些数据规律。今天,我们聊聊如何使用Python编程语言,结合ARIMA模型来洞察股市的变幻,为我们的投…

【TCP通信】

7.18学习记录 NetAssist.exeTCP/IP协议准备工作做好之后开始创建方案 通信架构设备管理接收事件发送事件心跳管理响应配置 VM4.0二次开发 NetAssist.exe 网络协议调试助手文件,支持UDP和TCP协议。只需要输入主机的地址和端口就能获取数据解析。要用到的协议是 TCP/…

wps office 2019 Pro Plus 集成序列号Vba安装版教程

前言 wps office 2019专业增强版含无云版是一款非常方便的办公软件,我们在日常的工作中总会碰到需要使用WPS的时候,它能为我们提供更好的文档编写帮助我们更好的去阅读PDF等多种格式的文档,使用起来非常的快捷方便。使用某银行专业增强版制作…

生活中生智慧

【 圣人多过 小人无过 】 觉得自己做得不够才能做得更好,互相成全;反求诸己是致良知的第一步;有苦难才能超越自己,开胸怀和智慧;不浪费任何一次困苦,危机中寻找智慧,成长自己。 把困苦当作当下…

Linux——awk操作符

[rootlocalhost ~] # awk BEGIN{x2;y3;print x**y,x^y,x*y,x/y,xy,x-y,x%y} 8 8 6 0 .666667 5 -1 2 赋值运算符 条件运算符 awk 中的条件运算符只有一个,其语法如下: expression?value1:value2 这是一个三目运算符,当表达式 expre…

MySQL索引特性(上)

目录 索引的重要 案例 认识磁盘 MySQL与存储 先来研究一下磁盘 扇区 定位扇区 结论 磁盘随机访问与连续访问 MySQL与磁盘交互基本单位 建立共识 索引的理解 建立测试表 插入多条记录 局部性原理 所有的MySQL的操作(增删查改)全部都是在MySQL当中的内存中进行的&am…

【删除链表的倒数第N个节点】python刷题记录

目录 哑结点 为什么设置哑节点? 方法1(先遍历统计长度,再查找具体位置): 方法2(双指针): 链表基本用法 哑结点 在链表前面添加哑节点,指向头节点 为什么设置哑节点…

系统架构师考点--统一建模语言UML

大家好。今天我来总结一下面向对象的第二个考点–统一建模语言UML。 UML(统一建模语言)是一种可视化的建模语言,而非程序设计语言,支持从需求分析开始的软件开发的全过程。UML的结构包括构造块、规则和公共机制三个部分。其中考点主要集中在构造块部分&…

一建备考,五步形成闭环学习!

一建备考从7月份到考前是大部分人焦虑的时候,因为基础阶段结束,开始成套做真题了,第一遍做真题很多人分数都不太理想,很多同学直接失去信心,开始emo,这都是只听课不做题的结果。 现在很多同学都是这种情况…

ABAP group by 语句学习

第一个案例:原文链接:https://blog.csdn.net/lmf496891416/article/details/111317377 第一步:定义结构,此处定义了三个字段 key1 ,key2 ,col ,然后定义表 itab 参照结构 struct TYPES: BEGIN OF ty_employee,name TYPE char30,…

ASUS/华硕幻13 2022 GV301R系列 原厂win11系统 工厂文件 带F12 ASUS Recovery恢复

华硕工厂文件恢复系统 ,安装结束后带隐藏分区,一键恢复,以及机器所有驱动软件。 系统版本:windows11 原厂系统下载网址:http://www.bioxt.cn 需准备一个20G以上u盘进行恢复 请注意:仅支持以上型号专用…

平凯星辰黄东旭出席 2024 全球数字经济大会 · 开放原子开源数据库生态论坛

7 月 5 日,以“开源生态筑基础,数字经济铸未来”为主题的 2024 全球数字经济大会——开放原子开源数据库生态论坛在北京成功举办。平凯星辰(北京)科技有限公司联合创始人黄东旭发表了题为《TiDB 助力金融行业关键业务系统实践》的…

校验el-table中表单项

需求: 表格中每一行都有几个必填项,如用户提交时有未填的选项,将该选项标红且给出提示,类似el-form 的那种校验 el-table本身并没有校验的方法,而且每一行的输入框也是通过插槽来实现的,因此我们要自己跟…

信息安全工程师题

物理隔离技术要求两台物理机物理上并不直连,只能进行间接的信息交换。所以防火墙不能实现网络的物理隔离Web应用防火墙可以防止SQL注入、xss攻击、恶意文件上传、远程命令执行、文件包含、恶意扫描拦截等;可以发现并拦截恶意的Web代码;可防止…

基于单片机的智能医疗监护系统设计

1.简介 随着社会的发展,智能化电子设备成为了人们生活中不可或缺的一部分,尤其是在人们对于身心健康更加注重的今天,智能医疗监护系统应运而生。本套电子监护设备集体温测量、心电采集、心率监测、血氧监测于一体,带有语音播报模块…

【Java】用队列实现栈 力扣

文章目录 题目链接题目描述思路代码 题目链接 225.用队列实现栈 题目描述 思路 一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。 代码 class MyStack {Q…

Django 请求和响应

1、请求 &#xff08;1&#xff09;get请求 用户直接在浏览器输入网址&#xff0c;参数直接在url中携带 http://127.0.0.1:8000/login/?a1&b%221243%22 &#xff08;2&#xff09;post请求 在html使用post,login.html <!DOCTYPE html> <html lang"en&…

防御综合实验作业2

办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP NAT策略&#xff1a; 安全策略&#xff1a; 测试&#xff1a; 分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 是怎么转换的&#xff0c;首先分公司的用户需…