From 0761778363e7d43fdfde8f59fbd84e1926cd3b3e Mon Sep 17 00:00:00 2001 From: yumaojun03 <719118794@qq.com> Date: Sun, 28 Dec 2025 15:53:05 +0800 Subject: [PATCH] =?UTF-8?q?```=20docs(day01):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=BF=90=E7=AE=97=E7=AC=A6=E5=92=8C=E5=8F=98=E9=87=8F=E4=BD=9C?= =?UTF-8?q?=E7=94=A8=E5=9F=9F=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增运算符文档,详细介绍Go语言的算术、关系、逻辑、位、赋值等运算符 - 添加变量作用域文档,涵盖局部变量、全局变量、作用域嵌套和可见性规则 - 补充相关代码示例和实践案例 - 更新README目录结构,添加新章节链接 ``` --- day01/README.md | 2 +- day01/operate/README.md | 166 ++++++++++++++++++++++++++++++++++ day01/operate/main.go | 14 +++ day01/scope/README.md | 79 ++++++++++++++++ day01/scope/demo/go.mod | 3 + day01/scope/demo/main.go | 16 ++++ day01/scope/demo/pkg1/vars.go | 14 +++ day01/scope/main.go | 31 +++++++ 8 files changed, 324 insertions(+), 1 deletion(-) create mode 100644 day01/operate/README.md create mode 100644 day01/operate/main.go create mode 100644 day01/scope/demo/go.mod create mode 100644 day01/scope/demo/main.go create mode 100644 day01/scope/demo/pkg1/vars.go create mode 100644 day01/scope/main.go diff --git a/day01/README.md b/day01/README.md index 525ddd4..27197b5 100644 --- a/day01/README.md +++ b/day01/README.md @@ -21,4 +21,4 @@ + [基础语法](./syntax/README.md) + [基础类型](./base_type/README.md) + [变量作用域](./scope/README.md) -+ 运算符 ++ [运算符](./operate/README.md) diff --git a/day01/operate/README.md b/day01/operate/README.md new file mode 100644 index 0000000..cbbb27e --- /dev/null +++ b/day01/operate/README.md @@ -0,0 +1,166 @@ +# 语言运算符 + +Go 语言内置的运算符有: + ++ 算术运算符 ++ 关系运算符 ++ 逻辑运算符 ++ 位运算符 ++ 赋值运算符 ++ 其他运算符 + +## 算术运算符 + ++ \+ 加法运算 ++ \- 减法运算 ++ \* 乘法运算 ++ / 除法运算 ++ % 求余运算 + +由于Go是强类型语言, 因此要求参与运算的对象类型必须相同,比如下面就是不可以的 + +```go +// var ( +// a = 10 +// b = 20 +// ) +var a, b uint = 10, 20 + +a + b // 30 +a - b // 18446744073709551606 +``` + +```go +a * b // 200 +a / b // 0 +a % b // 10 +``` + +浮点型的运算 + +```go +var a, b float64 = 10, 20 +a + b // 30 +a - b // -10 +a * b // 200 +a / b // 0.5 +``` + +## 关系运算符 + +用于对2个值进行比较的运算符, 比较结果为真(True) 或者 假(False) + ++ == 判断两个值是否相等 ++ != 判断两个值是否不相等 ++ \> 左边值是否大于右边值 ++ \>= 左边值是否大于等于右边值 ++ < 左边值是否小于右边值 ++ <= 左边值是否小于等于右边值 + +```go +a, b := 10, 20 +a > b +a >= b +a < b +``` + +常见的用法是用于条件语句: 我们进行一个a b 的简单排序 + +```go +a, b := 20, 10 +if a > b { + a, b = b, a +} +``` + +## 逻辑运算符 + +用于对布尔表达式进行逻辑计算, 有如下3种: + ++ && 与(ADD), 如果两边的操作数都是 True,则条件 True,否则为 False。 ++ || 或(OR), 如果两边的操作数有一个 True,则条件 True,否则为 False ++ ! 非(NOT), 如果条件为 True,则逻辑 NOT 条件 False,否则为 True + +```go +age := 90 +gender := "male" + +if age > 80 && gender == "male" { + fmt.Println("old boy") +} else { + fmt.Println("too young,too simple") +} +``` + +## 位运算符 + +位运算符对整数在内存中的二进制位进行操作, 运算符有: + ++ & 按位与, 参与运算的两数各对应的二进位相与 当两对应的二进位, 都为1时, 结果为1 ++ | 按位或, 参与运算的两数各对应的二进位相或, 当两对应的二进位, 有1方为1,结果为1 ++ ^ 按位异或, 参与运算的两数各对应的二进位相异或, 当两对应的二进位相异时,结果为1 ++ 左移 高位丢弃,低位补0, 左移n位就是乘以2的n次方 ++ 右移 高位丢弃,低位补0, 移n位就是除以2的n次方 + +```go +var ( + a uint = 60 // 0011 1100 2^5 + 2^4 + 2^3 + 2^2 + b uint = 85 // 0101 0101 2^6 + 2^4 + 2^2 + 2^0 +) +fmt.Println("a & b = %d", a&b) // 0001 0100 2^4 + 2^2 +fmt.Println("a | b = %d", a|b) // 0111 1101 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^0 +fmt.Println("a ^ b = %d", a^b) // 0110 1001 2^6 + 2^5 + 2^3 + 2^0 +fmt.Println("a >> 2 = %d", a>>2) // 0000 1111 15 +fmt.Println("a << 2 = %d", a<<2) // 1111 0000 240 +``` + +常用与协议定义, 比如一个byte 8位 + +```go +0000 0000 + -- + 标识性别: 00: 未知, 01: 男 10: 女 11: 保留 + -- + 保留 +---- +标识城市: 0000: 未知, 0001: A, 0010: B +``` + +byte 0x17 表示什么? (十进制: 23, 二进制: 0001 0111) + +## 赋值运算符 + +最基本用法: + ++ = 简单的赋值运算符,将一个表达式的值赋给一个左值 + +```go +a := 10 // 把10赋值给变量a +``` + ++ += 相加后再赋值 ++ -= 相减后再赋值 ++ *= 相乘后再赋值 ++ /= 相除后再赋值 ++ %= 求余后再赋值 ++ <<= 左移后赋值 ++ \>\>= 右移后赋值 ++ &= 按位与后赋值 ++ |= 按位异或后赋值 ++ ^= 按位或后赋值 + +```go +a := 10 +a += 5 // a = a + 5 +``` + +## 其他运算符 + ++ & 返回变量存储地址 ++ \* 取出地址对应的值 + +```go +a := 10 +b := &a +*b += 5 +``` \ No newline at end of file diff --git a/day01/operate/main.go b/day01/operate/main.go new file mode 100644 index 0000000..d9ce73f --- /dev/null +++ b/day01/operate/main.go @@ -0,0 +1,14 @@ +package main + +import "fmt" + +func main() { + a := 10.0 + b := 20 + // + 算数运算符 + c := float64(a) / float64(b) + fmt.Println("a / b = ", c) + + // 相同类型 + c = 10 / 0.1 +} diff --git a/day01/scope/README.md b/day01/scope/README.md index 2683b46..7c01b67 100644 --- a/day01/scope/README.md +++ b/day01/scope/README.md @@ -1,2 +1,81 @@ # 变量作用域 +作用域: 这个变量在哪个范围内可以被访问到 + ++ 基础作用域: 块作用域, {}, 在块作用域下的变量都是局部变量 + +## 局部变量 + +### 父作用域 不能访问子作用域的变量 + +```go +{ + { + var a string + a = "local var" + fmt.Println(a) + } + // fmt.Println(a) +} + +``` + +### 子作用域可以访问父作用域的变量 + +```go +{ + var a string + a = "parent scope" + { + fmt.Println(a) + } +} +``` + +### 变量值覆盖 + +子作用域的优先级是高于父作用域的优先级的, 因此子作用域可以覆盖父作用域的变量的值, 但是同一个变量不能声明2次 + +```go +package main + +import "fmt" + +func main() { + var a = "parent" + fmt.Println("outer:", a) // parent + { + a := "child" // 子作用域声明了同名新变量(遮蔽外层 a) + fmt.Println("inner:", a) // child + } + fmt.Println("outer again:", a) // 仍为 parent +} +``` + +## 全局变量 + +在函数体外声明的变量称之为全局变量,全局变量可以在整个包甚至外部包(被导出后)使用, 全局变量相当于所有函数的父级变量, 所有函数都能访问 + +```go +var ( + a = "global parent scope var" +) + +func main() { + fmt.Println(a) +} +``` + +## 导出与不可导出(可见性) + +约定:标识符以大写字母开头表示可导出(可被其他包访问),以小写字母开头表示仅包内可见。 + +```go +// 包内文件 a.go +package demo + +var Exported = "可导出" +var internal = "包内可见" + +// 其他包:import demo 后只能访问 demo.Exported +``` \ No newline at end of file diff --git a/day01/scope/demo/go.mod b/day01/scope/demo/go.mod new file mode 100644 index 0000000..41e99c4 --- /dev/null +++ b/day01/scope/demo/go.mod @@ -0,0 +1,3 @@ +module demo + +go 1.25.5 diff --git a/day01/scope/demo/main.go b/day01/scope/demo/main.go new file mode 100644 index 0000000..05b5164 --- /dev/null +++ b/day01/scope/demo/main.go @@ -0,0 +1,16 @@ +package main + +import ( + "demo/pkg1" + "fmt" +) + +func main() { + println("Hello, World!") + + fmt.Println(pkg1.GetVar3()) + + // 函数是一种类型 + // fn := pkg1.GetVar3 + // fn() +} diff --git a/day01/scope/demo/pkg1/vars.go b/day01/scope/demo/pkg1/vars.go new file mode 100644 index 0000000..e5c6fe6 --- /dev/null +++ b/day01/scope/demo/pkg1/vars.go @@ -0,0 +1,14 @@ +package pkg1 + +// 导出变量 首字母大写(public) +var ( + Var1 = "This is Var1" + Var2 = "This is Var2" + + // 未导出变量 首字母小写(private) + var3 = "This is var3" // unexported variable +) + +func GetVar3() string { + return var3 +} diff --git a/day01/scope/main.go b/day01/scope/main.go new file mode 100644 index 0000000..e7f1b1b --- /dev/null +++ b/day01/scope/main.go @@ -0,0 +1,31 @@ +package main + +import "fmt" + +var ( + // main 包里面的变量 + age = 18 +) + +func main() { + var a = "parent" + fmt.Println("outer:", a) // parent + { + a = "child" // 子作用域声明了同名新变量(遮蔽外层 a) + fmt.Println("inner:", a) // child + } + fmt.Println("outer again:", a) // 仍为 child + + // 局部变量 + var b = "parent" + fmt.Println("outer:", b) // parent + { + // var b = "child" + // 新的局部变量b + b := "child" // 子作用域声明了同名新变量(遮蔽外层 a) + fmt.Println("inner:", b) // child + } + fmt.Println("outer again:", b) // 仍为 parent + + fmt.Println(age) +}