Day01 第一课 Go基础|青训营笔记

295 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

Day01 第一课 Go基础

讲师:王克纯

一、课程简介

  1. Go系列课程:基础语言、工程实践、高质量编程与性能调优、发行版优化与落地实践
  2. 基础语言:猜谜游戏、命令行词典、SOCKS5代理

二、课堂笔记

1.基础

1.1什么是Go语言

  1. 高性能、高并发:和C/C++媲美的性能、调用标准库实现高并发
  2. 语法简单、学习曲线平缓:10行实现http服务器
  3. 丰富的标准库
  4. 完善的工具链:编译、代码格式化、单元测试框架
  5. 静态链接
  6. 快速编译
  7. 跨平台
  8. 垃圾回收

1.2哪些公司在用Go

字节、腾讯、百度、谷歌、美团、滴滴等

1.3为什么用Go

1.最初使用的Python,由于性能问题换成了Go 2.C++不太适合在线 Web业务 3.早期团队非Java背景 4.性能比较好 5.部署简单、学习成本低 6. 内部 RPC和 HTTP框架的推广

2.入门

2.1开发环境

  1. 安装Golang
  2. VsCode/Goland
  3. Github下载example代码

2.2基础语法

  1. Hello World
  2. 变量
    • var a =
    • f :=
    • const s string =
  3. ifelse
    • 没有()
    • 必须一行,后接{
  4. 循环
    • 只有for
    • 没有()
  5. switch
    • 不需要break
    • 可以简化ifelse
  6. 数组
    • var a [5]int
  7. 切片(常用)
    • 长度可变
    • 创建:s := make([]string, 3)
    • 追加append
    • 左闭右开
  8. map
    • 创建:m := make(map[string]int)
    • 是否存在:r, ok := m["unknow"]
  9. range
    • 遍历返回索引和值
  10. 函数
    • 遍历类型后置
    • 返回两个值:1.真正返回值;2.错误信息
  11. 指针
    • 默认拷贝传参,需要加* 引用传递
  12. 结构体
    • 对应类
  13. 结构体方法
    • 对应类成员函数
  14. 错误处理
    • 返回值加err error
  15. 字符串操作
    • Contains
    • Count
    • ...
  16. 字符串格式化
    • printf %v%+v%#v
  17. JSON处理
    • 结构体中的变量名首字母大写
    • 序列化json.Marshal()
    • 打印时需要string()
  18. 时间处理
    • time.Now()
    • time.Date()
    • .Unix()获取时间戳
  19. 数字解析
    • import strconv
    • ParseInt(字符串, 进制, 精度)
  20. 进程信息
    • import os
    • os.Args
    • os.Getenv("PATH")

3.实战

3.1猜谜游戏

  • Q1:Invalid input. Please enter an integer value
  • A1:Win环境需要\r\ninput = strings.TrimSuffix(input, "\r\n")

3.2在线词典

  1. 调用彩云翻译的api(兴奋) fanyi.caiyunapp.com
  2. 生成代码,解析request bodycurlconverter.com/#go
  3. defer会在函数结束后从下往上出发,关闭流,防止内存泄漏
  4. 生成代码,解析response bodyoktools.net/json2go
  5. 运行-命令行go run simpleDict/v4/main.go walnut

3.3SOCKS5代理

  1. 代理:用于提供单一接口,访问公司内部网
  2. 工作原理,四个阶段:
    • (1)协商/握手阶段
      • 认证方式
      • 跳过,因为实现的是不加密代理
    • (2)认证阶段
    • (3)请求阶段
    • (4)relay阶段
      • 转发响应结果
  3. TCP echo server实现
    • process处理连接
    • go关键字,减小开销,轻松处理上万并发
    • bufio.NewReader带缓冲的字节流
      • 先读1KB,再1字节1字节地读
    • nc 127.0.0.1 1080?
      • Q1:无法将“nc”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
      • A1:??(要配置go mod proxy后重启,才能代码补全
      • Q2:PowerShell执行,报错:main.go:4:2: package bufio is not in GOROOT
      • A2:??
  4. auth
    • curl --socks5 127.0.0.1:1080 -v http://www.qq.com
  5. request
    • 这部分优点没学明白
  6. relay
    • copy(dst, src)是单向拷贝,所以需要两个go func(){}
    • 采用context.WithCancel(),这样出错时可以及时cancel()关闭
    • Q3:找不到接受实际参数“127.0.0.1:1080”的位置形式参数。
    • A3:??

EX.Q&A

  1. Go学习路线图
  2. 课后作业
  3. 建议按行读取,不要scanf
  4. alt+点击结构,可以跳读源码
    • Q:请问go的字符串拼接效率问题,一般考虑到综合易用性和性能,推荐使用 strings.Builder 来拼接字符串。但为什么有的文章会说标准编译器对使用+运算符的字符串衔接做了特别的优化。 所以,一般说来,在被衔接的字符串的数量是已知的情况下,使用+运算符进行字符串衔接是比较高效的。请问下一般在项目中如何拼接字符串是比较高效合理的呢
    • A:(1)写代码不建议一开始就性能优化。(2)建议strings.Builder拼接。+确实有优化。
  5. cmd和Bash不一样,会导致问题
  6. SOCKS5协议的讲解

三、心得体会

  1. 知识点密集,不罗嗦不废话,几秒一个点
  2. 在线词典的实战很吸引我,因为调用了在线网页的功能