Files
fzu-product/7.网络应用开发/7.3.1基础部分.md
2024-07-21 07:36:24 +08:00

210 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 基础部分
作者:[iyear](https://github.com/iyear) 、后端的小伙伴们
::: tip 🎇
Hello~这里是杭电助手技术部后端,无论基础如何,您都可以跟随着这篇文章的指引,使用 Golang 开发一个基于 Web 的简易登录系统后端部分。
:::
本任务将涉及以下知识:
- Go 语言(又称 Golang开发环境搭建、基础语法知识、Gin 框架的使用
- HTTP 基础知识
- 登录系统的接口设计
- 一点点的工程基础
不需要担心,后续我们将给出充足的资料和路线,相信这些对你一定不是难题~
> 在学习初期,视频可以帮助你快速理解并踏入大门,但在学习的后期,文档&博客才拥有第一手资料和最新动态 (视频就像你的教科书,更新的脚步永远跟不上技术)。<br/>在任务初期我们将给出对应的视频资料,在后期我们只给出图文资料。<br/>👏 当然,这不是强制要求:学的舒服是原则
## 👋 初识 Go 语言 (Day 1)
> Go又称 Golang是 Google 开发的一种静态,强类型、编译型、并发型的编程语言。其于 2009 年 11 月正式发布成为开源代码项目。Go 的语法接近 C 语言,但其支持垃圾回收功能,开发效率远高于 C 语言。而其对海量并发的支持,以及在运行效率,低内存消耗方面的优异表现,也有人称其为互联网时代的 C 语言。
<del>↑ 太官方了,我的评价是不如看资料 (</del>
官网虽然是英文,但是非常非常的友好,近年还刚翻新过一次好看了许多,还有各种可爱的吉祥物插图。
这只吉祥物囊袋鼠的英文学名为 **Gopher**,每位热爱 Golang 的开发者都会自称 **Gopher** (就像 jvaver 一样 (x),而它的造型出于创始人之一 Rob Pike 的妻子之手。
### 视频资料 (**P2-P3**)
<Bilibili bvid='BV1zR4y1t7Wj'/>
### 文字资料:
- Golang 官网 (非常好记go.dev(eloper))
<https://go.dev/>
- 一些第三方的前景概览
<https://www.topgoer.com/>
### 补充资料:
- [我使用 Golang 两年后的总结:优点和令人讨厌的怪癖](https://www.infoq.cn/article/ydmrvvr1ijaaih3eh5fw) - 比较客观的开发体验
- [许式伟:我与 Go 语言的这十年](https://cloud.tencent.com/developer/article/1043859) - 七牛云 CEO、前 WPS 首席架构师、Go 语言布道师
- [Go 一周年,一年前的今天](https://learnku.com/docs/go-blog/go-one-year-ago-today/6583) - 2010 年 Go Team 写下的一周岁博文。那时的 Go 还在一脸懵逼的状态蹒跚向前。
- [Go Developer Survey 2022 Q2 Results - The Go Programming Language](https://go.dev/blog/survey2022-q2-results) - 2022 年 Golang 官方博客的调研结果报告。
对比两篇博客,可以清晰地感受到 Golang 的发展之快:曾经还在娘胎里的 Golang现在已经在云原生、微服务、CLI 程序、DevOps、区块链等领域大杀四方。
## 😥 Golang 环境搭建 (Day1 - 2)
Golang 是一门年轻的语言 (相比 Java & JavaScript),它没有那么多的历史包袱,所以环境搭建在一众语言中可以算得上十分容易。同时 Golang 自带了丰富的工具链,许多 Gopher 的整个职业生涯中可能都不需要用到官方工具链以外的相关工具。
::: tip 📌
本小节还请同学们各显神通由于不同计算机不同环境不同平台的区别Golang 环境搭建各有区别。资料中将尽可能给出一些教程,但具体需同学们使用搜索引擎寻找最佳实践。出现问题在群内积极提问~
:::
对于 IDE 的选择:
在这里推荐两个比较流行的 IDE
首先是万能的 VSCode
<https://code.visualstudio.com/>
还有智能的 GoLand
<https://www.jetbrains.com/go/>
喜欢折腾的同学可以选择 VSCode 作为自己的开发工具,如果想能够马上上手学习的同学,可以使用 GoLand 作为自己的开发工具
::: tip 🤭
GoLand 可以使用教育邮箱学生认证白嫖噢~👀
:::
### 视频资料 (**P4-P6**)
<Bilibili bvid='BV1zR4y1t7Wj'/>
### 文字资料:
- VSCode 的爹亲自教你装 Golang 环境
<https://learn.microsoft.com/zh-cn/azure/developer/go/configure-visual-studio-code>
- 使用 GoLand 搭建
<https://polarisxu.studygolang.com/posts/go/2022-dev-env/>
### 补充资料
> 这些文章只是帮助你理解的更透彻,看不懂完全没关系。甚至你完全可以跳过他们,在任务结束后再来看看,或许你会有更多收获。
- Golang 依赖管理的前世今生:[一文搞懂 Go Modules 前世今生及入门使用 - 掘金](https://juejin.cn/post/6844904166310019086)
- IDEA 系列学生认证教程 (用 GoLand 必看)[学生邮箱白嫖 JetBrains 全家桶——保姆级教程](https://zhuanlan.zhihu.com/p/136497468)
## 😕 Golang 基础语法的学习 (Day 1-8)
Golang 的语法是 C/C++ 系的,在许多地方你都可以看到他们的影子,这对未来 C 的学习更有自顶向下的帮助。当然,如果你曾经用过 Java、PythonGolang 的语法你可能会不太习惯,这不会是问题~在熟悉语法后你会发现“Golang 一把梭”是真实存在的 🤓。
**对于基础语法的学习,无需一时学习过深,也不必花费过多时间在此**。**即使半懵半懂,在多次实践后也会渐渐领悟**
本次任务并不需要用到反射、并发等高级特性 (学到时可选择性暂时避开),最深只需要用到结构体与方法的相关知识。
### 视频资料 (P9-P56 每集视频并不长,不要被吓到了喔)
<Bilibili bvid='BV1zR4y1t7Wj'/>
### 文字资料:
- 非常推荐的 Go Tour 中文版。Go Tour 是 **Go 官方为初学者打造的渐进式教程**,你可以跟随着它的步伐一点点探索 Go 语言。Go Tour 的代码都充满着它的**设计哲学与最佳实践**,是每位 Gopher 的必经之路。同时它也是**交互式的**,左侧是教程,右侧能直接敲代码,在网页上运行。
<https://tour.go-zh.org/welcome/1>
- 短小精湛的 Golang 入门教程,是 The Little Go Book 的中文翻译
<https://learnku.com/docs/the-little-go-book>
### 补充资料:
- [Go by Example 中文版](https://gobyexample-cn.github.io/) - Go by Example 是对 Go 基于实践的介绍,包含一系列带有注释说明的示例程序。
- [《Go 入门指南》](https://learnku.com/docs/the-way-to-go) - 《Go 入门指南》是《The Way to Go》的中文译本本书专为 Golang 初学者量身定制。教程较老,小部分内容有点过时,但质量很高。
- [《Go 语言 101》](https://gfw.go101.org/) - 《Go 101》详细描述了 Golang 部分底层原理、最佳实践、代码风格、常见错误,适合进一步深入阅读。
- [《Go 语言圣经》](https://books.studygolang.com/gopl-zh/) - 《The Go Programming》的中文版是官方书籍。内容相当老但包含着 Golang 的设计哲学与建设初期的思考和路线。
## 🎯 HTTP 协议学习 (Day 9-10)
如果你从未接触过协议二字,那 HTTP 协议将是你大学生涯最重要的协议之一,也是 Web 的基础。与其说是小任务的基础,我更想说这是对人类互联的探索。
HTTP 协议起草与演进之路十分坎坷,但每一步都举足轻重,在人类历史上画下了浓墨重彩的一笔。
### 文字资料:
- 非常著名的阮一峰博客 **(他的博客可以从最早开始都过一遍,很多计算机科普可以说永不过时)**
<https://www.ruanyifeng.com/blog/2016/08/http.html>
- 图解系列非常有意思,最重要的是不止于介绍协议,更为你道来其历史设计的进程。本书不必在任务期间内看完,但我相信你会爱上它的。
<https://book.douban.com/subject/25863515/>
- 经典菜鸟教程,不过有点枯燥乏味。可以用于回顾和工具书查阅。
<https://www.runoob.com/http/http-intro.html>
#### 补充资料:
- [《互联网时代》纪录片](https://www.bilibili.com/video/BV1uE411o7UW/) - 与 HTTP 没什么关系,但给当时的我带来极大的震撼和触动。互联网是人类连接的重要一步,是对人类自由、平等、互通之理念长达半个世纪的深刻贯彻。
<Bilibili bvid='BV1uE411o7UW'/>
> 原本稀薄的得以聚合,曾经蜷曲的得以伸展,容易被忽略的得以显现,可能被排斥的获得接纳:孤独的不再孤独,卑微的不再卑微,每一个生命绽放的声音,从来没有像这样韵味深长。
- [HTTP | MDN](https://developer.mozilla.org/zh-CN/docs/Web/HTTP) - HTTP 协议较为权威的参考文档和资料。
> MDN 是一个不断发展的学习网络技术和网络软件的平台。MDN 的使命简单明了:提供一个更好的网络蓝图并赋能新一代开发者和内容创意者在此之上构建网络。
## 🎉 回到正题:小任务
> 一些题外话:是的,任务期已经过去了约十天 (当然优秀的你可能更快~),但在我看来,小任务其实已经不再那么重要了。如果在以上小节中你曾感到兴奋、热情、探索的欲望,我诚挚地相信,你能在技术的道路上走的很远很远~
用了这么长的时间铺垫了以上的基础知识脑子肯定胀满了各种各样的东西if for range slice interface http …… 是时候释放他们了!
这次的小任务我们将设计一个简易的登录系统,它将十分简单,简单到甚至只需要一个 `.go` 文件,但可能也很难,它直接或间接地包含了以上几乎所有内容。
<del>经过了上文详细的“喂饭”小节,下面轮到同学们自己吃饭了~</del>
### 系统概述
- 使用 Gin 框架设计登录系统的接口与整体结构。
- 至少设计 `Login` `GetUser` `Logout` 三个接口,对 `GetUser` 接口鉴权。
- Login: 使用账号密码登录
- GetUser: 获取个人信息,具体信息有什么?请自由发挥~
- Logout: 登出注销
#### Gin
在 HTTP 小节中,“路由“接口” “鉴权” “请求” “响应”你一定或多或少地接触过Gin 就是一群 Gopher 大神帮你解决了这些问题,它十分轻量但五脏俱全,你只需要调用几个函数就将 cover 那些复杂的问题。
请运用你在第三小节中学习的 `Golang 包(依赖)管理` 正确地安装 Gin 并学习使用它。
**相关资料**
- [GitHub - gin-gonic/gin: Gin is a HTTP web framework written in Go (Golang)](https://github.com/gin-gonic/gin) - Gin 的官方仓库及权威文档。
- [Go Gin Example](https://github.com/eddycjy/go-gin-example) - 使用 Gin 的一个小项目,难度较高。
- [Gin 框架 | NX の 博客](https://www.nickxu.top/categories/Golang/Gin-%E6%A1%86%E6%9E%B6/) - NX 的学习笔记,可供参考
- ……
#### 鉴权
如果 `GetUser` 接口来者不拒,那么任意信息都可以被外部人员访问到,这将是一个严重的安全漏洞。所以在 `Login``GetUser` 之间,有着一种隐隐约约的联系:只有登录成功且对应的用户才能读取到他的个人信息。
好啦,总之,鉴权是每个 Web 系统的重要部分,不说太多 😛
#### 无限进步! (From [影视飓风](https://space.bilibili.com/946974/))
::: danger 🔔
发挥你的想象,让你的服务变得更加可靠、有趣、优雅~
:::
- 如果你的所有代码都在一个文件里,请尝试让他变得有模块感~
- 如果你的账号密码写死 (硬编码) 在程序中,请尝试让它能动态变化~
- 发现更多有趣的 Golang 第三方库,尝试将它加入你的程序~
- 如果你能想到任何方式丰富项目功能、优化代码结构,以及想加的内容,请尽情发挥~
- ……
不卷大家啦,发挥你的想象吧,想法是编写程序的关键。