当前位置: 首页 > news >正文

GO 语言基础语法一 (快速入门 Go 语言)

Go语言基础语法

  • 一. golang 标识符,关键字,命名规则
  • 二. golang 变量
  • 三. golang 常量
  • 四. golang 数据类型
  • 五. golang 布尔类型
  • 六. golang 数字类型
  • 七. golang 字符串
    • 1. go语言字符串字面量
    • 2. go语言字符串连接
      • (1). 使用加号
      • (2). 使用 fmt.Sprintf() 函数
      • (3). strings.Join()
      • (4). buffer.WriteString()
    • 3. go语言字符串转义字符
    • 4. go语言字符串切片操作
    • 5. go语言字符串常用方法
  • 八. golang格式化输出
  • 九. golang运算符
    • 1. 算术运算符
    • 2. 关系运算符
    • 3. 逻辑运算符
    • 4. 位运算符
    • 5. 赋值运算符
  • 十. golang流程控制
    • 1. if 语句
    • 2. if else 语句
    • 3. if else if 语句
    • 4. 嵌套 if 语句
    • 4. switch语句
    • 5. for 循环语句
    • 6. for range 循环语句

一. golang 标识符,关键字,命名规则

在这里插入图片描述

二. golang 变量

在这里插入图片描述

三. golang 常量

在这里插入图片描述

四. golang 数据类型

在这里插入图片描述

五. golang 布尔类型

在这里插入图片描述

六. golang 数字类型

在这里插入图片描述

七. golang 字符串

1. go语言字符串字面量

在Go语言中,字符串字面量使用双引号 “” 或者反引号 ’ 来创建。双引号用来创建可解析的字符串,支持转义,但不能用来引用多行;反引号用来创建原生的字符串字面量,可能由多行组成,但不支持转义,并且可以包含除了反引号外其他所有字符。双引号创建可解析的字符串应用最广泛,反引号用来创建原生的字符串则多用于书写多行消息,HTML以及正则表达式。

package mainimport ("fmt"
)func main() {var s1 string = "hello world"var s2 string = `<html><head><title> hello world </title></html>`fmt.Printf("s1: %v\n", s1)fmt.Printf("s2: %v\n", s2)
}

运行结果

s1: hello world
s2: <html><head><title> hello world </title></html>

2. go语言字符串连接

(1). 使用加号

package mainimport ("fmt"
)func main() {name := "lyp"age := "20"msg := name + " is " + agefmt.Printf("msg: %v\n", msg)msg = ""msg += namemsg += " is "msg += agefmt.Printf("msg: %v\n", msg)}

运行结果

msg: lyp is 20
msg: lyp is 20

(2). 使用 fmt.Sprintf() 函数

package mainimport ("fmt"
)func main() {name := "lyp"age := "20"msg := fmt.Sprintf("%s is %s", name, age)fmt.Printf("msg: %v\n", msg)}

运行结果

msg: lyp is 20

(3). strings.Join()

package mainimport ("fmt""strings"
)func main() {name := "lyp"age := "20"msg := strings.Join([]string{name, age}, " is ")fmt.Printf("msg: %v\n", msg)}

运行结果

msg: lyp is 20

(4). buffer.WriteString()

package mainimport ("bytes""fmt"
)func main() {var buffer bytes.Bufferbuffer.WriteString("lyp")buffer.WriteString(" is ")buffer.WriteString("20")fmt.Printf("buffer.String(): %v\n", buffer.String())}

运行结果

buffer.String(): lyp is 20

3. go语言字符串转义字符

Go 语言的字符串常见转义符包含回车、换行、单双引号、制表符等,如下表所示
在这里插入图片描述

package mainimport "fmt"func main() {fmt.Printf("hello\tworld\n")fmt.Printf("\"c:\\test\\\"")}

运行结果

hello   world
"c:\test\"

4. go语言字符串切片操作

package mainimport "fmt"func main() {str := "hello world"n := 3m := 5fmt.Println(str[n])   //获取字符串索引位置为n的原始字节fmt.Println(str[n:m]) //截取得字符串索引位置为 n 到 m-1 的字符串fmt.Println(str[n:])  //截取得字符串索引位置为 n 到 len(s)-1 的字符串fmt.Println(str[:m])  //截取得字符串索引位置为 0 到 m-1 的字符串}

运行结果

108
lo
lo world
hello

5. go语言字符串常用方法

在这里插入图片描述

package mainimport ("fmt""strings"
)func main() {s := "hello world!"fmt.Printf("len(s): %v\n", len(s))fmt.Printf("strings.Split(s, \"\"): %v\n", strings.Split(s, " "))fmt.Printf("strings.Contains(s, \"hello\"): %v\n", strings.Contains(s, "hello"))fmt.Printf("strings.HasPrefix(s, \"hello\"): %v\n", strings.HasPrefix(s, "hello"))fmt.Printf("strings.HasSuffix(s, \"world!\"): %v\n", strings.HasSuffix(s, "world!"))fmt.Printf("strings.Index(s, \"l\"): %v\n", strings.Index(s, "l"))fmt.Printf("strings.LastIndex(s, \"l\"): %v\n", strings.LastIndex(s, "l"))
}

运行结果

len(s): 14
strings.Split(s, ""): [hello world!]
strings.Contains(s, "hello"): true
strings.HasPrefix(s, "hello"): true
strings.HasSuffix(s, "world!"): true
strings.Index(s, "l"): 2
strings.LastIndex(s, "l"): 9

八. golang格式化输出

在这里插入图片描述

package mainimport "fmt"type WebSite struct {Name string
}func main() {site := WebSite{Name: "lyp"}fmt.Printf("site: %v\n", site)fmt.Printf("site: %#v\n", site)fmt.Printf("site: %T\n", site)fmt.Println("%%")b := truefmt.Printf("b: %t\n", b)i := 8fmt.Printf("i: %v\n", i)fmt.Printf("i: %b\n", i)i = 96fmt.Printf("i: %c\n", i)fmt.Printf("i: %x\n", i)x := 100p := &xfmt.Printf("p: %v\n", p)}

运行结果

site: {lyp}
site: main.WebSite{Name:"lyp"}
site: main.WebSite
%%
b: true
i: 8
i: 1000
i: `
i: 60
p: 0xc000016120

九. golang运算符

1. 算术运算符

在这里插入图片描述

++(自增)和–(自减)在Go语言中是单独的语句,并不是运算符(不能用在表达式中)

package mainimport "fmt"func main() {a := 100b := 10fmt.Printf("(a + b): %v\n", (a + b))fmt.Printf("(a - b): %v\n", (a - b))fmt.Printf("(a * b): %v\n", (a * b))fmt.Printf("(a / b): %v\n", (a / b))fmt.Printf("(a %% b): %v\n", (a % b))a++fmt.Printf("a: %v\n", a)b--fmt.Printf("b: %v\n", b)
}

2. 关系运算符

在这里插入图片描述

package mainimport "fmt"func main() {a := 1b := 2fmt.Printf("(a > b): %v\n", (a > b))fmt.Printf("(a < b): %v\n", (a < b))fmt.Printf("(a >= b): %v\n", (a >= b))fmt.Printf("(a <= b): %v\n", (a <= b))fmt.Printf("(a == b): %v\n", (a == b))fmt.Printf("(a != b): %v\n", (a != b))
}

3. 逻辑运算符

在这里插入图片描述

package mainimport "fmt"func main() {a := trueb := falsefmt.Printf("(a && b): %v\n", (a && b))fmt.Printf("(a || b): %v\n", (a || b))fmt.Printf("(!a): %v\n", (!a))fmt.Printf("(!b): %v\n", (!b))
}

4. 位运算符

在这里插入图片描述

package mainimport "fmt"func main() {a := 4 // 二进制 100fmt.Printf("a: %b\n", a)b := 8 // 二进制 1000fmt.Printf("b: %b\n", b)fmt.Printf("(a & b): %v, %b \n", (a & b), (a & b))fmt.Printf("(a | b): %v, %b\n", (a | b), (a | b))fmt.Printf("(a ^ b): %v, %b\n", (a ^ b), (a ^ b))fmt.Printf("(a << 2): %v, %b\n", (a << 2), (a << 2))fmt.Printf("(b >> 2): %v, %b\n", (b >> 2), (b >> 2))
}

5. 赋值运算符

在这里插入图片描述

package mainimport "fmt"func main() {var a inta = 100fmt.Printf("a: %v\n", a)a += 1 // a = a + 1fmt.Printf("a: %v\n", a)a -= 1 // a = a -1fmt.Printf("a: %v\n", a)a *= 2 // a = a * 2fmt.Printf("a: %v\n", a)a /= 2 // a = a / 2fmt.Printf("a: %v\n", a)
}

十. golang流程控制

1. if 语句

if 布尔表达式 {/* 在布尔表达式为 true 时执行 */
}

(1). 不需使用括号将条件包含起来
(2). 大括号{}必须存在,即使只有一行语句
(3). 左括号必须在if或else的同一行
(4). 在if之后,条件语句之前,可以添加变量初始化语句,使用;进行分隔
(5). 不能使用0或非0表示真假

func test3() {if age := 20; age > 18 {fmt.Println("你是成年人")}fmt.Printf("程序运行结束")
}func main() {// test1()// test2()test3()
}
func test4() {var i = 1if i { // 编译失败fmt.Println("here")}fmt.Printf("程序运行结束")
}

2. if else 语句

if 布尔表达式 {/* 在布尔表达式为 true 时执行 */
} else {/* 在布尔表达式为 false 时执行 */
}
func f2() {var s intfmt.Println("输入一个数字:")fmt.Scan(&s)if s%2 == 0 {fmt.Print("s 是偶数\n")} else {fmt.Print("s 不是偶数\n")}fmt.Print("s 的值是:", s)
}

3. if else if 语句

if 布尔表达式1 {// do something
} else if 布尔表达式2 {// do something else
}else {// catch-all or default
}
func f5() {if score := 80; score >= 60 && score <= 70 {fmt.Println("C")} else if score > 70 && score <= 90 {fmt.Println("B")} else {fmt.Println("A")}
}

4. 嵌套 if 语句

if 布尔表达式 1 {/* 在布尔表达式 1 为 true 时执行 */if 布尔表达式 2 {/* 在布尔表达式 2 为 true 时执行 */}
}
func f2() {// 判断男女生及年龄gender := "女生"age := 16if gender == "男生" {fmt.Println("男生")if age > 18 {fmt.Println("成年")} else {fmt.Println("未成年")}} else {fmt.Println("女生")if age > 18 {fmt.Println("成年")} else {fmt.Println("未成年")}}
}

4. switch语句

switch var1 {case val1:...case val2:...default:...
}
func f() {grade := "A"switch grade {case "A":fmt.Println("优秀")case "B":fmt.Println("良好")default:fmt.Println("一般")}
}

多条件匹配

func f() {day := 3switch day {case 1, 2, 3, 4, 5:fmt.Println("工作日")case 6, 7:fmt.Println("休息日")}
}

case 可以是条件表达式

func f() {score := 90switch {case score >= 90:fmt.Println("享受假期")case score < 90 && score >= 80:fmt.Println("好好学习吧!")default:fmt.Println("玩命学习!")}
}

fallthrough 强制执行后面的一个 case 代码
fallthrough 不能用在switch的最后一个分支

switch {case false:fmt.Println("The integer was <= 4")fallthroughcase true:fmt.Println("The integer was <= 5")fallthroughcase false:fmt.Println("The integer was <= 6")fallthroughcase true:fmt.Println("The integer was <= 7")fallthroughcase false:fmt.Println("The integer was <= 8")default:fmt.Println("default case")
}

5. for 循环语句

go语言中的 for 循环,只有 for 关键字,去除了像其他语言中的 while 和 do while

for 初始语句;条件表达式;结束语句{循环体语句
}
func f() {for i := 1; i <= 10; i++ {fmt.Printf("i: %v\n", i)}
}func f() {i := 1for ; i <= 10; i++ {fmt.Printf("i: %v\n", i)}
}func f() {i := 1 // 初始条件for i <= 10 {fmt.Printf("i: %v\n", i)i++ // 结束条件}
}

for循环可以通过 break goto return panic 语句强制退出循环。

6. for range 循环语句

Go语言中可以使用 for range 遍历数组、切片、字符串、map 及通道(channel)。通过for range遍历的返回值有以下规律

1.数组、切片、字符串返回索引和值。
2.map返回建和值。
3.通道(channel)只返回通道内的值。

// 循环数组
func f() {var a = [5]int{1, 2, 3, 4, 5}for i, v := range a {fmt.Printf("i: %d, v: %v\n", i, v)}
}func main() {f()
}// 循环字符串
func f() {var s = "多课网,go教程"for i, v := range s {fmt.Printf("i: %d, v: %c\n", i, v)}// %c 按照字符输出
}func main() {f()
}// 循环切片
func f() {var s = []int{1, 2, 3, 4, 5}for i, v := range s {fmt.Printf("i, %d, v: %v\n", i, v)}
}func main() {f()
}// 循环 map
func f() {m := make(map[string]string)m["name"] = "tom"m["age"] = "20"m["email"] = "tom@gmail.com"for k, v := range m {fmt.Printf("k: %v, v: %v\n", k, v)}
}func main() {f()
}

相关文章:

GO 语言基础语法一 (快速入门 Go 语言)

Go语言基础语法一. golang 标识符&#xff0c;关键字&#xff0c;命名规则二. golang 变量三. golang 常量四. golang 数据类型五. golang 布尔类型六. golang 数字类型七. golang 字符串1. go语言字符串字面量2. go语言字符串连接(1). 使用加号(2). 使用 fmt.Sprintf() 函数(3…...

Java高效率复习-SpringMVC[SpringMVC-2]

SpringMVC获取请求参数 SpringMVC获取请求参数的两种方式↓ 通过ServletAPI获取请求参数 将HttpServletRequest作为控制器方法的形参&#xff0c;此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象 通过request的API——getParameter(String s)方法来获取…...

【前端】一个更底层库-React基础知识点

目录Reat是什么&#xff1f;为什么要使用React类库比较容易学习&#xff0c;API非常少。组件内聚&#xff0c;容易组合原生组件和自定义组件融合渲染状态/属性驱动全局更新commonjs生态圈/工具栏完善React基础知识JSX概述JSX嵌入变量Event事件组合组合CHILDREN总结大家好&#…...

C++ 之枚举类型

文章目录参考描述枚举类型枚举类型枚举变量的声明及定义细节枚举常量的默认初始值枚举常量不可被修改赋值运算枚举常量与数据类型为枚举常量指定数据类型可选择的数据类型特殊的 Bool强枚举类型命名冲突强枚举类型参考 项目描述菜鸟教程C 枚举类型详解精通C &#xff08;第九版…...

软件测试用例(3)

按照测试对象划分: 一)界面测试: 1)软件只是一种工具&#xff0c;软件和人的信息交流是通过界面来进行的&#xff0c;界面是软件和用户交流的最直接的一层&#xff0c;界面的设计决定了用户对于我们设计软件的第一映像&#xff0c;界面如同人的面孔&#xff0c;具有最吸引用户的…...

Spring——Bean管理-注解方式进行属性注入

Spring针对Bean管理中创建对象提供的注解有哪些&#xff1f;Component&#xff1a;普通Service&#xff1a;业务逻辑层Controller&#xff1a;controller层Repository&#xff1a;dao层用注解的方式是为什么&#xff1f;简化xml方式开发&#xff0c;只需要注解就可以完成在配置…...

【设计模式之美 设计原则与思想:设计原则】20 | 理论六:我为何说KISS、YAGNI原则看似简单,却经常被用错?

上几节课中&#xff0c;我们学习了经典的 SOLID 原则。今天&#xff0c;我们讲两个设计原则&#xff1a;KISS 原则和 YAGNI 原则。其中&#xff0c;KISS 原则比较经典&#xff0c;耳熟能详&#xff0c;但 YAGNI 你可能没怎么听过&#xff0c;不过它理解起来也不难。 理解这两个…...

Java代码弱点与修复之——Copy-paste error(复制粘贴错误)

弱点描述 Copy-paste error,复制粘贴错误。 是指在复制和粘贴代码时产生的错误。这种错误通常是由于程序员在复制代码时未正确编辑所复制的代码或编辑复制后的代码时忘记更改一些值或参数而导致的。复制粘贴错误可能会导致程序逻辑错误、编译错误或运行时错误。 示例代码 …...

Editor.md 的使用方法及图片处理

目录1. 资源下载2. 生成页面2.1 编辑和预览页面2.2 文本渲染页面3. 图片上传3.1 前端配置3.2 后端接口4. 图片粘贴[^2]1. 资源下载 官网下载 gitee 下载 2. 生成页面 2.1 编辑和预览页面 将资源&#xff08;精简后 Editor.md 资源1&#xff09;导入项目&#xff1a; 按照官…...

剑指 Offer II 018. 有效的回文

题目链接 剑指 Offer II 018. 有效的回文 easy 题目描述 给定一个字符串 s&#xff0c;验证 s是否是 回文串 &#xff0c;只考虑字母和数字字符&#xff0c;可以忽略字母的大小写。 本题中&#xff0c;将空字符串定义为有效的 回文串 。 示例 1: 输入: s “A man, a plan, …...

Elasticsearch分析器(Analyzer)

Elasticsearch分析器&#xff08;Analyzer&#xff09; 文章目录Elasticsearch分析器&#xff08;Analyzer&#xff09;分析器概念内置分析器&#xff08;8.6版本&#xff09;自定义分析器elasticsearch-analysis-ik&#xff08;简称ik&#xff0c;&#x1f495;14.8k&#xff…...

P6入门:了解P6 Professional 工具栏及地图分享

目录 引言 相关分享 引言 凭借更大的灵活性和增强的自定义功能&#xff0c;最新版本的 Oracle Primavera P6 Professional 的界面比早期版本有了巨大改进。对于有经验的伙伴来说&#xff0c;它仍然是熟悉的领域&#xff0c;几乎所有预期的功能都显示在前面。该界面可以更好地…...

习题30 if elif else 语句

people 30#变量people赋值30 cars 40#变量cars赋值40 buses 15#变量buses赋值 if cars > people:#如果出租车比人多print("We should take the cars")#我们坐出租车 elif cars < people:#elif后面必须跟条件&#xff0c;print("We should not take the…...

32 openEuler使用LVM管理硬盘-管理卷组

文章目录32 openEuler使用LVM管理硬盘-管理卷组32.1 创建卷组32.2 查看卷组32.3 修改卷组属性32.4 扩展卷组32.5 收缩卷组32.6 删除卷组32 openEuler使用LVM管理硬盘-管理卷组 32.1 创建卷组 可在root权限下通过vgcreate命令创建卷组。 vgcreate [option] vgname pvname ...…...

Jackson CVE-2017-17485 反序列化漏洞

0x00 前言 同CVE-2017-15095一样&#xff0c;是CVE-2017-7525黑名单绕过的漏洞&#xff0c;主要还是看一下绕过的调用链利用方式。 可以先看&#xff1a; Jackson 反序列化漏洞原理 或者直接看总结也可以&#xff1a; Jackson总结 涉及版本&#xff1a;2.8.10和2.9.x至2.…...

十大排序(C++版)

测试排序的题目&#xff1a; 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 堕落的做法&#xff1a; class Solution { public:vector<int> sortArray(vector<int>& nums) {sort(nums.begin(),nums.end());return nums;} };视频推荐&#xff1a; …...

SpringMVC中的常用注解

Java知识点总结&#xff1a;想看的可以从这里进入 目录3.2、常用的注解3.2、常用的注解 Controller&#xff1a;代表此类是一个控制器&#xff0c;需要配置包的扫描。Spring MVC 是通过组件扫描机制查找应用中的控制器类的 在Spring6.0之后要求控制层必须添加该注解才会被识别成…...

English Learning - L2-3 英音地道语音语调 小元音 [ʌ] [ɒ] [ʊ] [ɪ] [ə] [e] 2023.02.27 周一

English Learning - L2-3 英音地道语音语调 小元音 [ʌ] [ɒ] [ʊ] [ɪ] [ə] [e] 2023.02.27 周一课前活动练习方法大小元音总结小元音准备工作[ʌ] 中元音发音技巧对应单词的发音对应句子的发音常见的字母组合[ɒ] 后元音发音技巧对应单词的发音对应句子的发音常见的字母组合…...

fastadmin后台登录页修改

直接替换就行 <!DOCTYPE html> <html lang"{$config.language}"> <head>{include file"common/meta" /}<style type"text/css">body {color: #999;background-color: #f1f4fd;background-size: cover;}a {color: #444;…...

Java 面向对象(OOP)的三大特性

封装 所谓封装&#xff0c;意思就是隐藏内部细节&#xff0c;在编程中&#xff0c;指利用抽象数据类型将数据和基于数据的操作封装在一起&#xff0c;使其构成一个不可分割的独立实体&#xff0c;并尽可能地隐藏内部的细节&#xff0c;只保留一些对外接口使之与外部发生联系。…...

误删Anaconda?4招紧急救援方案

问题背景与常见场景Anaconda被误删可能由误操作、系统崩溃、病毒攻击等原因导致&#xff0c;涉及环境、包、配置等关键数据丢失。抢救前的准备工作立即停止对Anaconda所在磁盘的写入操作&#xff0c;避免数据被覆盖。 确认删除方式&#xff08;回收站、ShiftDelete、格式化等&a…...

【ROS2小白入门】从 ROS 1 到 ROS 2 的跨越:实战重构机器人底盘 Manager 节点

文章目录一、 构建系统的蜕变&#xff1a;CMakeLists.txt 的优雅转身1. 告别 target_link_libraries&#x1f6a8; 避坑指南 1&#xff1a;找不到 serial 串口库&#xff1f;二、 C 源码大换血&#xff1a;彻底消灭 NodeHandle三、 通信机制迁移&#xff1a;发布、订阅与异步服…...

研发物料管理新思路:巧用SAP预留功能实现打样耗材精准管控

研发物料管理新思路&#xff1a;巧用SAP预留功能实现打样耗材精准管控 在制造业研发部门&#xff0c;物料管理一直是令人头疼的难题。不同于生产线的标准化流程&#xff0c;研发活动往往伴随着频繁的设计变更、小批量试制和突发性物料需求。传统的手工台账或Excel表格管理方式&…...

Vivo Xplay6专用降级刷机工具AFTool|支持1.15.1/1.16.6/1.16.14等多版本线刷|含教程+驱动+工具包

温馨提示&#xff1a;文末有联系方式【适用机型精准说明】 本工具包专为Vivo Xplay6&#xff08;型号V317A/V317K&#xff09;深度适配&#xff0c;非Xplay6机型&#xff08;含其他Vivo手机&#xff09;请勿购买——不同机型Bootloader锁机制与分区结构差异极大&#xff0c;强行…...

Python程序员转战Mojo的最后1公里:自动转换工具mojoify上线首周已修复89%语法迁移阻塞点(限时开源)

第一章&#xff1a;Mojo与Python混合编程全景概览Mojo 是一种为 AI 系统量身打造的现代系统编程语言&#xff0c;兼具 Python 的易用性与 C/Rust 的执行效率。它原生兼容 Python 生态&#xff0c;允许开发者在同一个项目中无缝调用 Python 模块、复用 NumPy/Torch 接口&#xf…...

Ubuntu 23.04 避坑指南:pip install virtualenv 报错 extern-managed-environment 的3种解决方案

Ubuntu 23.04 Python包管理新规深度解析&#xff1a;安全与灵活性的平衡之道 最近升级到Ubuntu 23.04的Python开发者们可能遇到了一个令人困惑的新错误——当尝试使用pip install安装包时&#xff0c;系统会抛出"externally-managed-environment"的警告并拒绝执行。这…...

西门子1200水处理程序全解析

西门子1200水处理程序 包含1200PLC通讯点表&#xff0c;CAD原理图&#xff0c;操作说明。 触摸屏包含了组态画面&#xff0c;操作画面&#xff0c;参数设置画面&#xff0c;报警记录等。 V16以上可以打开最近在搞西门子1200的水处理程序项目&#xff0c;今天来和大家分享一下其…...

数值分析实战指南:北航研究生大作业解析与代码实现

1. 数值分析大作业的核心价值 第一次接触北航研究生数值分析大作业时&#xff0c;我和大多数同学一样感到无从下手。直到在实验室熬了三个通宵后&#xff0c;我才真正明白这份作业的独特价值——它完美架起了理论与实践的桥梁。这份大作业最精妙之处在于&#xff0c;它不仅仅是…...

3步学会BilibiliDown:零基础掌握B站视频下载的终极指南

3步学会BilibiliDown&#xff1a;零基础掌握B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/…...

【项目实战】ESP8266 WiFi模块从零接入物联网 - 硬件连接、固件烧录与云端通信

1. ESP8266 WiFi模块入门指南 第一次拿到ESP8266这个小玩意儿时&#xff0c;我完全没想到它能在物联网领域掀起这么大风浪。这个比硬币大不了多少的模块&#xff0c;内置了完整的WiFi功能&#xff0c;价格还不到一杯奶茶钱。记得去年帮学弟调试毕业设计时&#xff0c;我们用ESP…...