diff --git a/chapters/chapter-1-revised.md b/chapters/chapter-1-revised.md new file mode 100644 index 0000000..3fa7376 --- /dev/null +++ b/chapters/chapter-1-revised.md @@ -0,0 +1,157 @@ +# 第一章:初识 Go —— 让我们开始这段奇妙的旅程 + +> **👋 嗨,新朋友!** +> +> 欢迎来到 Go 语言的世界!我是思语,接下来的日子,我将作为你的向导,陪你一起探索 Go 的魅力。 +> +> 也许你之前用过 Python 的简洁,也感受过 Java 的严谨,或者在 C++ 的指针迷宫里迷路过。但今天,我们要认识一位新朋友——**Go (Golang)**。它像一位**干练的工程师**:说话简洁(语法简单)、干活高效(编译快)、还能同时处理很多任务(并发强大)。 +> +> **🤔 你可能会想:** +> * “为什么现在要学 Go?” +> * “它真的有那么好吗?” +> * “我零基础能学会吗?” +> +> **别担心!** 这些问题,我们都会在接下来的内容中一一解答。更重要的是,**我会手把手带你写出第一个 Go 程序**,让你立刻感受到编程的乐趣! +> +> **🚀 准备好了吗?让我们先从安装 Go 开始吧!** + +--- + +## 1.1 为什么选择 Go?—— 它凭什么这么火? + +> **📖 先讲个故事:** +> +> 想象一下,你是一家大公司的工程师。你需要写一个服务,既要处理成千上万的并发请求,又要启动快、占内存少,还要方便部署。 +> +> * 如果用 **Java**,可能得配一大堆库,启动慢得像蜗牛,内存占用还高。 +> * 如果用 **C++**,性能是好了,但写起来太复杂,稍不留神就出内存泄漏,调试起来让人头大。 +> +> 这时候,**Go** 出现了!它像一位**全能选手**: +> * **简单**:只有 25 个关键字,半天就能上手。 +> * **快**:编译成机器码,启动毫秒级,运行效率接近 C。 +> * **并发强**:内置 Goroutine,轻松处理百万级并发,写并发代码像写串行代码一样简单。 +> * **部署方便**:一个二进制文件,扔到任何地方就能跑,不用装环境。 +> +> 正因如此,Docker、Kubernetes、Prometheus 这些云原生时代的“明星项目”,都是 Go 写的! +> +> **💡 老师划重点:** +> 如果你想在**云原生、微服务、高并发**领域发展,Go 绝对是你的**必选项**!而且,它也是很多创业公司首选的后端语言,因为**开发快、运维成本低**。 + +--- + +## 1.2 安装 Go 环境 —— 迈出第一步 + +> **🛠️ 动手时间!** +> +> 别被“安装”两个字吓到,其实超级简单!就像安装微信一样,点几下鼠标就搞定了。 + +### 📥 第一步:下载 + +打开 Go 官网:https://go.dev/dl/ + +根据你的系统(Windows/macOS/Linux),下载对应的安装包。 + +### 🔧 第二步:安装 + +* **Windows**:双击 `.msi` 文件,一路点“Next”即可。 +* **macOS**:双击 `.pkg` 文件,按提示安装。 +* **Linux**:解压到 `/usr/local`,然后配置环境变量(别担心,我会给你复制粘贴的命令!)。 + +### ✅ 第三步:验证 + +打开终端(或命令提示符),输入: + +```bash +go version +``` + +如果看到类似 `go version go1.21.0 linux/amd64` 的输出,**恭喜你!安装成功!** 🎉 + +> **🤔 遇到问题?** +> 别慌!常见的错误我都总结在 1.6 节了,随时可以回来查。 + +--- + +## 1.3 你的第一个 Go 程序 —— Hello, World! + +> **🎉 见证奇迹的时刻!** +> +> 安装好环境后,第一件事当然是写代码啦!别担心,我们只写几行。 + +新建一个文件 `hello.go`,写下: + +```go +package main + +import "fmt" + +func main() { + fmt.Println("Hello, World!") +} +``` + +> **🤔 别急着运行,先猜猜看:** +> * `package main` 是干嘛的? +> * `func main()` 为什么这么重要? +> * `fmt.Println` 是怎么把字打印出来的? +> +> **先别急着看答案,带着问题去运行它!** + +在终端输入: + +```bash +go run hello.go +``` + +看到 `Hello, World!` 了吗?🎉 + +> **💡 老师的小揭秘:** +> * `package main`:告诉 Go 这是一个**可执行程序**(不是库)。 +> * `func main()`:程序的**入口**,程序从这里开始执行。 +> * `fmt.Println`:Go 标准库里的“打印机”,负责把内容输出到屏幕。 + +> **🚀 现在,试着把 "Hello, World!" 改成 "Hello, [你的名字]!",再运行一次!** +> +> 感觉如何?是不是很简单?别急,**简单的背后,藏着 Go 的哲学**:简洁、高效、不啰嗦。 + +**接下来,我们要深入一点,看看 Go 是怎么“思考”的。** 比如,它怎么存储数据?怎么判断真假?怎么让程序“动”起来? + +**这就引出了我们下一章的内容:Go 的基础语法。** 别担心,我们会像搭积木一样,一块一块地认识这些“积木块”。 + +--- + +## 1.4 常见错误与解决方案 + +> **🤔 遇到报错别慌张!** +> +> 编程路上,报错是家常便饭。重要的是学会看报错信息。这里列举几个新手常遇到的错误: + +* **`command not found: go`** + * **原因**:环境变量没配好。 + * **解决**:检查 `PATH` 是否包含 Go 的 `bin` 目录(通常是 `/usr/local/go/bin` 或 `C:\Go\bin`)。 + +* **`package main is not in GOROOT`** + * **原因**:Go 模块未初始化。 + * **解决**:在项目目录下运行 `go mod init <项目名>`。 + +* **`undefined: fmt`** + * **原因**:忘了导入 `fmt` 包。 + * **解决**:加上 `import "fmt"`。 + +> **💡 老师的小建议:** +> 遇到报错,先**复制报错信息**,去 Google 或 Stack Overflow 搜一下,99% 的问题都能找到答案。这也是程序员的基本功哦! + +--- + +## 1.5 本章小结 + +> **🎯 我们学到了什么?** +> 1. **为什么学 Go**:简单、快、并发强、部署方便。 +> 2. **如何安装**:下载、安装、验证。 +> 3. **第一个程序**:`Hello, World!`,理解了 `package`、`func main`、`import`。 +> 4. **常见错误**:学会了看报错信息,知道怎么解决。 + +> **🚀 下一步预告:** +> 光会打印一句话可不够哦!下一章,我们要学习**Go 的基础语法**:变量、类型、流程控制。想象一下,学会了这些,你就能写计算器、猜数字游戏……甚至更酷的东西了! +> +> **准备好了吗?我们下一章见!** diff --git a/chapters/chapter-2-revised.md b/chapters/chapter-2-revised.md new file mode 100644 index 0000000..db72155 --- /dev/null +++ b/chapters/chapter-2-revised.md @@ -0,0 +1,179 @@ +# 第二章:Go 基础语法 —— 像搭积木一样写代码 + +> **👋 回顾一下:** +> +> 上节我们成功安装了 Go,还写出了第一个 `Hello, World!` 程序。是不是觉得“原来编程也没那么难”? +> +> **🤔 但是,光会打印一句话可不够哦!** +> 真正的编程,是要处理数据、做判断、循环操作……就像搭积木,我们需要先认识各种“积木块”(变量、类型),然后学习怎么把它们拼在一起(流程控制)。 +> +> **🎯 这一章,我们要掌握三样东西:** +> 1. **变量**:给数据起名字,存起来。 +> 2. **类型**:知道数据是什么“材质”的(整数?字符串?)。 +> 3. **流程控制**:让程序学会“如果……就……"和“循环……"。 +> +> **别担心,我会用大量的例子,让你边学边练!** + +--- + +## 2.1 变量声明 —— 给数据找个“家” + +> **💡 想象一下:** +> 你在整理房间,需要给不同的物品贴上标签,比如“书”、“衣服”、“鞋子”。在编程中,**变量**就是这些标签,用来**存储数据**。 + +### 📝 Go 的四种声明方式 + +#### 1. `var` 声明(最正式) + +```go +var name string = "Alice" +var age int = 25 +``` + +* **老师点评**:这是最规范的写法,适合在函数外面声明全局变量。 + +#### 2. `var` 声明(类型推断) + +```go +var name = "Bob" // Go 自动推断 name 是 string 类型 +``` + +* **老师点评**:更简洁!只要给了初始值,Go 就知道它是什么类型了。 + +#### 3. 短声明 `:=`(最常用!) + +```go +name := "Charlie" +age := 30 +``` + +* **老师点评**:**这是 Go 程序员最爱用的写法!** 既简洁又清晰。记住,只能在函数里面用哦! + +#### 4. 多变量声明 + +```go +x, y, z := 1, 2, 3 +``` + +* **老师点评**:一次声明多个变量,效率更高! + +> **⚠️ 老师的小提醒:** +> * 变量名要**有意义**(比如用 `userName` 而不是 `a`)。 +> * Go 是**大小写敏感**的(`Name` 和 `name` 是两个不同的变量)。 +> * **未使用的变量**会让编译器报错(这是 Go 的“强迫症”,但能帮你避免很多 bug!)。 + +> **🎮 动手练一练:** +> 试着声明几个变量,存储你的姓名、年龄、身高,并打印出来! + +--- + +## 2.2 数据类型 —— 认识各种“积木块” + +> **🧱 常见的数据类型:** +> +> * **整数**:`int`, `int8`, `int16`, `int32`, `int64`……(用来存数字) +> * **无符号整数**:`uint`, `uint8`, `uint16`, `uint32`, `uint64`……(只存正数,范围更大) +> * **浮点数**:`float32`, `float64`……(用来存小数,比如 3.14) +> * **字符串**:`string`(用来存文字,比如 "Hello") +> * **布尔值**:`bool`(只有 `true` 和 `false` 两个值) +> * **字节**:`byte`(`uint8` 的别名,用来处理二进制数据) +> * **字符**:`rune`(`int32` 的别名,用来处理 Unicode 字符,比如中文) + +> **💡 老师的小技巧:** +> * 如果不确定用哪种整数,直接用 `int` 就行(它会根据系统自动选择最合适的)。 +> * 字符串在 Go 中是**不可变**的(不能修改里面的字符),如果需要修改,可以用 `[]rune` 转换。 +> * 浮点数比较时,**不要直接用 `==`**(因为精度问题),可以用 `math.Abs(a-b) < 0.00001` 来判断是否“近似相等”。 +> * `byte` 常用于处理文件、网络数据;`rune` 常用于处理中文、emoji 等多字节字符。 + +> **🎮 动手练一练:** +> 试着声明几个不同类型的变量,并打印它们的类型(用 `%T` 格式化符)。 + +--- + +## 2.3 流程控制 —— 让程序“动”起来 + +> **🤔 如果……就……** +> +> 生活中充满了判断: +> * 如果**下雨**,就**带伞**。 +> * 如果**分数>=90**,就**得 A**。 +> +> 在 Go 中,我们用 `if-else` 来实现: + +```go +score := 85 +if score >= 90 { + fmt.Println("优秀!") +} else if score >= 80 { + fmt.Println("良好!") +} else { + fmt.Println("继续努力!") +} +``` + +> **🔄 循环……循环……** +> +> 如果想重复做一件事,比如打印 1 到 100,怎么办? +> +> Go 只有 `for` 循环,但功能强大: + +```go +// 传统 for 循环 +for i := 1; i <= 10; i++ { + fmt.Println(i) +} + +// while 风格(省略初始化) +i := 0 +for i < 10 { + fmt.Println(i) + i++ +} + +// 无限循环(记得用 break 退出!) +for { + // ... + break +} +``` + +> **🎯 老师的小总结:** +> * `if-else` 用来做**判断**。 +> * `for` 用来做**循环**。 +> * Go 没有 `while` 和 `do-while`,但 `for` 可以搞定一切! + +> **🎮 动手练一练:** +> 写一个程序,打印 1 到 100 之间所有的**偶数**! + +--- + +## 2.4 运算符 —— 让数据“动起来” + +> **🧮 常见的运算符:** +> +> * **算术**:`+`, `-`, `*`, `/`, `%`(取余) +> * **比较**:`==`, `!=`, `>`, `<`, `>=`, `<=` +> * **逻辑**:`&&`(与), `||`(或), `!`(非) +> * **位运算**:`&`, `|`, `^`, `<<`, `>>`(进阶内容,暂时了解即可) + +> **💡 老师的小提醒:** +> * 整数除法会**截断小数部分**(`5/2 = 2`),如果需要小数,用浮点数(`5.0/2.0 = 2.5`)。 +> * 逻辑运算符支持**短路求值**(`false && 复杂计算()` 不会执行复杂计算)。 + +> **🎮 动手练一练:** +> 写一个程序,判断一个年份是否是**闰年**(能被 4 整除但不能被 100 整除,或者能被 400 整除)。 + +--- + +## 2.5 本章小结 + +> **🎯 我们学到了什么?** +> 1. **变量声明**:`var`、短声明 `:=`、多变量声明。 +> 2. **数据类型**:整数、浮点数、字符串、布尔值、字节、字符。 +> 3. **流程控制**:`if-else` 判断、`for` 循环。 +> 4. **运算符**:算术、比较、逻辑、位运算。 +> +> **🚀 下一步预告:** +> 学会了基础语法,我们就能写一些简单的程序了!但现实世界的数据往往更复杂:比如一个学生有姓名、年龄、成绩……这时候,我们需要**数据结构**(数组、切片、映射、结构体)来组织这些数据。 +> +> **下一章,我们就来认识这些强大的“数据容器”!** 准备好了吗?