Go 语言简介 -- 高效、简洁与现代化编程的完美结合

在现代软件开发领域,选择合适的编程语言对于项目的成功至关重要。Go 语言(又称 Golang )自 2009 年由Google发布以来,以其简洁的语法、高效的并发模型以及强大的性能,迅速成为开发者们的新宠。Go语言不仅融合了传统编译型语言的高效性和脚本语言的易用性,还专注于解决并发编程中的难题,提供了简洁而强大的解决方案。

Go语 言特别适合用于服务器端开发、大型软件开发以及支持云计算的网络服务。它的设计初衷是提高开发效率,简化代码维护,同时在高并发和分布式系统中表现卓越。越来越多的公司和开源项目选择Go语言作为开发基础,涵盖了从日志处理、虚拟机管理到区块链技术等广泛的应用领域。

本文将详细介绍 Go 语言的特点和优势,探讨其在服务器编程、网络编程、云平台和区块链等方面的应用场景,展示 Go 语言在现代软件开发中的重要性和潜力。无论你是初次接触 Go 语言,还是希望深入了解其在实际项目中的应用,本文都将为你提供有价值的参考


文章目录

      • 1、Go 语言简介与背景介绍
        • 1.1、Go 语言简介
        • 1.2、Go 语言的诞生
        • 1.3、Go 的设计与发展
          • 1.3.1、早期实现与团队扩展
          • 1.3.2、Go 语言的首次公开
          • 1.3.3、Go 语言的吉祥物
          • 1.3.4、Go 语言影响与发展
      • 2、Go 语言的特性
        • 2.1、语法简单
        • 2.2、并发模型
        • 2.3、内存分配
        • 2.4、垃圾回收
        • 2.5、静态链接
        • 2.6、标准库
        • 2.7、工具链
      • 3、Go 语言的应用
        • 3.1、使用 Go 语言的项目
        • 3.2、使用 Go 语言的公司
        • 3.3、Go 语言的应用场景
          • 3.3.1、服务器端开发
          • 3.3.2、网络编程
          • 3.3.3、云平台
          • 3.3.4、区块链技术
          • 3.3.5、底层开发


1、Go 语言简介与背景介绍

1.1、Go 语言简介

Go,也称为 Golang,是一种开源编程语言,由谷歌在 2007 年开始开发,并在 2009 年正式发布,是当下备受关注的后端开发主流语言之一。

Go 是一门强大且简洁的编程语言,适合构建高性能、可扩展的应用程序。它的设计理念和特性使其在现代软件开发中具有重要地位,尤其是在云计算、微服务和高并发系统领域。

1.2、Go 语言的诞生

Go 语言,是由肯·汤普森(Ken Thompson)、罗伯·派克(Rob Pike)和罗伯特·格瑞史莫(Robert Griesemer)三位计算机科学家共同设计的编程语言。这三位创始人都有着深厚的背景:

  • 肯·汤普森(Ken Thompson):图灵奖获得者、C 语言联合发明人、Unix 操作系统的创始人之一;
  • 罗伯·派克(Rob Pike):Plan 9 操作系统的领导者、UTF-8 编码的最初设计者;
  • 罗伯特·格瑞史莫(Robert Griesemer):Java 的 HotSpot 虚拟机和 Chrome 浏览器的 JavaScript V8 引擎的设计者之一。

Go 的诞生:在 2007 年 9 月 20 日下午,三位创始人在谷歌山景城总部的一次普通讨论中,萌生了设计一门新编程语言的想法。当时,谷歌内部主要使用 C++ 语言构建各种系统,但 C++ 的复杂性、编译构建速度慢以及对并发支持不足的问题,使他们感到十分不便。因此,他们决定设计一门能够给程序员带来快乐、匹配未来硬件发展趋势,并适合开发谷歌内部大规模网络服务程序的新语言。

初次讨论:那天下午,罗伯·派克启动了一个 C++ 工程的编译构建,预计需要一个小时。利用这段时间,罗伯·派克、罗伯特·格瑞史莫和肯·汤普森讨论了设计一门新编程语言的想法。第二天,他们又在谷歌总部的"雅温得(Yaounde)"会议室里进一步讨论了这门新语言的设计。

设计邮件:会后,罗伯特·格瑞史莫发出了一封题为"prog lang discussion"的电子邮件,对这门新编程语言的功能特性做了初步归纳总结。他们的主要思路是在 C 语言的基础上,修正一些明显的缺陷,删除一些被诟病较多的特性,增加一些缺失的功能,如使用 import 替代 include、去掉宏、增加垃圾回收、支持接口等。这封电邮成为了这门新语言的第一版特性设计稿,三位创始人在一些基础语法特性上达成了初步一致。

image-20240527092625213

命名为"Go":9月25日,罗伯·派克在一封回复电邮中提议将这门新编程语言命名为"Go"。在他看来,"Go"这个单词短小、容易输入,并且可以用于命名 Go 相关的工具,如编译器(goc)、汇编器(goa)、链接器(gol)等(早期版本曾如此命名 Go 工具链,但后续版本撤销了这种命名方式,仅保留 Go 这一统一的工具链名称)。

image-20240527092558702

关于"Golang"的误区:许多 Go 语言初学者经常称这门语言为 Golang,这实际上是不正确的。"Golang"仅用于命名 Go 语言的官方网站,因为当时 go.com 这个域名已经被占用了。

1.3、Go 的设计与发展

在早期讨论后,Go 语言的三位创始人肯·汤普森(Ken Thompson)、罗伯·派克(Rob Pike)和罗伯特·格瑞史莫(Robert Griesemer)开始了 Go 语言的迭代设计和实现过程。

1.3.1、早期实现与团队扩展

第一版编译器:2008 年初,肯·汤普森实现了第一版 Go 编译器。这个编译器将 Go 代码转换为 C 代码,再由 C 编译器编译成二进制文件。这一实现用于验证早期设计。

第二个编译器:2008 年中,同样在谷歌工作的伊恩·泰勒(Ian Lance Taylor)为 Go 语言实现了一个 GCC 的前端,这是 Go 语言的第二个编译器。这不仅证明了 Go 的可行性,也推动了 Go 语言规范和标准库的建立。随后,伊恩·泰勒正式加入 Go 语言开发团队,成为第四位成员,并在语言及工具设计和实现方面发挥了重要作用。

核心团队的扩展:罗斯·考克斯(Russ Cox)是 Go 核心开发团队的第五位成员,他于 2008 年加入。罗斯利用 Go 语言函数类型作为"一等公民"的特性,巧妙地设计了 http 包的 HandlerFunc 类型,使普通函数能够满足 http.Handler 接口。此外,他提出了 io.Readerio.Writer 接口的设计,这奠定了 Go 语言的 I/O 结构模型。后来,罗斯成为 Go 核心技术团队的负责人,推动 Go 语言的持续演化。

1.3.2、Go 语言的首次公开

2009 年 10 月 30 日,罗伯·派克在 Google Techtalk 上做了一次名为"The Go Programming Language"的演讲,这是 Go 语言第一次公之于众。十天后,即 2009 年 11 月 10 日,谷歌官方宣布 Go 语言项目开源,这一天也被确定为 Go 语言的诞生日。

1.3.3、Go 语言的吉祥物

在 Go 语言项目开源后,罗伯·派克的夫人芮妮·弗伦奇(Renee French)设计了一只地鼠(gopher)作为 Go 语言的吉祥物。从此,地鼠成为 Go 程序员的象征,Go 程序员也被昵称为 Gopher。

image-20240527093446690

1.3.4、Go 语言影响与发展

Go 语言的开源吸引了全球开发者的关注。凭借创始人在业界的影响力和谷歌的支持,更多有才华的程序员加入了 Go 核心开发团队,更多贡献者开始为 Go 语言项目做出贡献。在2009年,Go 成为了著名编程语言排行榜 TIOBE 的年度最佳编程语言。

2012年3月28日,Go 1.0 版本正式发布。Go 官方发布了“Go 1 兼容性”承诺:只要符合 Go 1 语言规范的源代码,Go 编译器将保证向后兼容。这意味着使用新版编译器也可以正确编译用老版本语法编写的代码。

自开源以来,Go 语言发展迅猛,发布了多个大版本更新,逐渐成熟。在过去的十余年里,Go 语言在现代软件开发中占据了重要地位,广泛应用于云计算、微服务和高并发系统等领域。


2、Go 语言的特性

Go 语言是一种静态强类型、编译型、并发型、并具有垃圾回收功能的编程语言。 接下来从几个方面来具体介绍一下 G o语言的特性。

2.1、语法简单

抛开语法样式不谈,单就类型和规则而言,Go 与 C99、C11 相似之处颇多,这也是 Go 语言被冠以"NextC"名号的重要原因。

Go 语言的语法处于简单和复杂的两极。C 语言简单到你每写下一行代码,都能在脑中想象出编译后的模样,指令如何执行,内存如何分配,等等。而 C 的复杂在于,它有太多隐晦而不着边际的规则,着实让人头疼。相比较而言,Go 从零开始,没有历史包袱,在汲取众多经验教训后,可从头规划一个规则严谨、条理简单的世界。

Go 语言的语法规则严谨,没有歧义,更没什么黑魔法变异用法。任何人写出的代码都基本一致,这使得 Go 语言简单易学。放弃部分”灵活"和"自由",换来更好的维护性,我觉得是值得的。

++--从运算符降级为语句,保留指针,但默认阻止指针运算,带来的好处是显而易见的。还有,将切片和字典作为内置类型,从运行时的层面进行优化,这也算是一种"简单"。

2.2、并发模型

Go 语言做了件极大胆的事,即从根本上将一切并发化,采用 Goroutine 处理并发,运行时用 Goroutine 运行所有的一切,包括 main.main 入口函数。

可以说,Goroutine 是 Go 最显著的特征,这是一种类似协程的并发单元,但在运行时层面进行了深度优化。通过 Goroutine 和 channel 实现的 CSP 模型(Communicating Sequential Processes),使得并发编程变得简单自然,无需处理回调和线程切换。Goroutine 和 channel 的结合,拆解了并发单元间的数据耦合,使得内存共享和锁粒度的问题得到了解决

2.3、内存分配

Go 语言采用 tcmalloc 内存分配器,这是一个为并发设计的高性能内存分配组件。

tcmalloc 使用 cache 为当前执行线程提供无锁分配,多个 central 在不同线程间平衡内存单元复用,而 heap 则管理大块内存,切分成不同等级的复用内存块。这种快速分配和二级内存平衡机制,让内存分配器在高并发下也能高效运行。编译器还会尽量将对象分配在栈上,减少垃圾回收的压力,提高执行性能。

2.4、垃圾回收

Go 语言的垃圾回收器经过不断优化,从并发清理到降低 STW(Stop-The-World)时间,再到并发标记、三色标记和写屏障的引入,都是为了能让垃圾回收在不显著影响用户逻辑的情况下更好地工作。

相比 Java,Go 面临的困难要更多。因指针的存在,所以回收内存不能做收缩处理。幸好,指针运算被阻止,否则要做到精确回收都难。

每次升级,垃圾回收器必然是核心组件里修改最多的部分。从并发清理,到降低 STW 时间,直到 Go 的 1.5 版本实现并发标记,逐步引入三色标记和写屏障等等,都是为了能让垃圾回收在不影响用户逻辑的情况下更好地工作。尽管有了努力,当前版本的垃圾回收算法也只能说堪用,离好用尚有不少距离。

2.5、静态链接

Go 刚发布时,静态链接被当作优点宣传。只须编译后的一个可执行文件,无须附加任何东西就能部署。这似乎很不错,只是后来风气变了。连着几个版本,编译器都在完善动态库 buildmode 功能,场面一时变得有些尴尬。

暂不说未完工的 buildmode 模式,静态编译的好处显而易见。将运行时、依赖库直接打包到可执行文件内部,简化了部署和发布操作,无须事先安装运行环境和下载诸多第三方库。这种简单方式对于编写系统软件有着极大好处,因为库依赖一直都是个麻烦。

2.6、标准库

Go 语言的标准库功能完善、质量可靠,可以完成大部分基础功能开发,降低了学习和使用成本。特别是 net/http 包,只需简单几条语句即可实现高性能的 Web 服务器,这也是 Go 语言在 Web 和微服务开发中广受欢迎的重要原因。丰富的第三方资源和框架进一步扩展了 Go 语言的应用场景

2.7、工具链

Go 语言提供了完整的工具链,包括编译、格式化、错误检查、帮助文档生成、第三方包下载和更新等工具。此外,Go 语言内置了完整的测试框架,包括单元测试、性能测试、代码覆盖率检测和数据竞争检测工具。通过环境变量输出的运行时监控信息(如垃圾回收和并发调度跟踪)进一步帮助开发者改进算法和优化性能。

总的来说,Go 语言通过简洁的语法、强大的并发模型、高效的内存分配和优化的垃圾回收机制,成为现代软件开发中的重要工具。其完善的标准库和工具链,以及广泛的社区支持,使其在云计算、微服务和高并发系统等领域得到了广泛应用。


3、Go 语言的应用

3.1、使用 Go 语言的项目

所有的编程语言都反映了语言设计者对编程哲学的反思,通常包括之前的语言所暴露的一些不足地方的改进。Go 语言从发布 1.0 版本以来备受众多开发者关注并得到广泛使用,Go 语言的简单、高效、并发特性吸引了众多传统语言开发者的加入,而且人数越来越多。

使用 Go 语言开发的开源项目非常多。早期的 Go 语言开源项目只是通过 Go 语言与传统项目进行 C 语言库绑定实现,例如 Qt、Sqlite 等;后期的很多项目都使用 Go 语言进行重新原生实现,这个过程相对于其他语言要简单一些,这也促成了大量使用Go语言原生开发项目的出现。

下面列举的是原生使用 Go 语言进行开发的部分项目:

  • Docker: Docker 是一种操作系统层面的虚拟化技术,允许在一台物理服务器上快速运行多个实例,实现操作系统和应用程序的隔离;

  • Go 语言: Go 语言自身的源码,从Go 1.5版本后,完全使用Go语言编写,对了解Go语言的底层调度有很大帮助;

  • Kubernetes: 由 Google 开发的基于 Docke r的容器编排服务,管理云端容器集群,自动选择合适的节点来执行容器调度;

  • etcd: 一个分布式的、可靠的键值存储系统,由 CoreOS 开发,通过 Raft 一致性算法处理日志复制以保证强一致性;

  • beego: 类似于 Python 的 Tornado 框架,是一个轻量级、高可伸缩性和高性能的 Web 应用框架;

  • martini: 一个快速构建模块化 Web 应用的 Go语 言框架;

  • codis: 一种国产的分布式 Redis 解决方案,实现了对 Redis 的反向代理和负载均衡;

  • delve: Go 语言的强大调试器,被许多集成开发环境和编辑器整合使用。

3.2、使用 Go 语言的公司

Go 语言自 2009 年由 Google 发布以来,以其高效的开发效率和卓越的运行速度迅速风靡全球,被誉为"21 世纪的 C 语言"。越来越多的公司开始采用 Go 语言来开发自己的服务,以下是一些使用Go语言的大公司和他们的应用实例:

  1. Google:作为 Go 语言的创造者,Google 在多个项目中使用了 Go 语言。例如,Kubernetes 和 Docker 都是使用 Go 语言开发的。Google 通过这些项目展示了 Go 语言在构建大规模分布式系统方面的强大能力;

  2. Facebook:Facebook 也在其多个项目中使用了 Go 语言,并在 GitHub 上建立了 facebookgo 组织。最著名一个的项目是 grace,一个用于实现服务平滑重启的工具;

  3. 腾讯:腾讯在 2015 年已经在 Docker 大规模应用上进行实践,腾讯主要使用 Go 语言进行新业务的开发,例如一些内部的工具和服务;

  4. 百度:百度在运维方面广泛使用了 Go 语言,例如 BFE(前端流量接入项目)和消息通讯系统的服务器端;

  5. 七牛云:七牛云是国内第一家选择 Go 语言作为服务端开发的公司。早在 2011 年,七牛云就使用 Go 语言来开发其存储服务;

  6. 京东:京东使用 Go 语言开发了云消息推送系统、云存储以及商城的列表页等;

  7. 小米:小米在其运维监控系统(Open-Falcon)中使用了 Go 语言,此外,小米互娱、小米商城、小米视频和小米生态链等团队也在使用 Go 语言;

  8. 360:360 公司在多个项目中使用了 Go 语言,例如开源的日志搜索系统 Poseidon 和推送团队的服务。

除了上述公司外,还有很多公司开始尝试使用 Go 语言,如美团、滴滴和新浪等。Go语 言在开发高并发网络服务(如消息推送、监控和容器)方面表现优异,因此成为许多公司在相关项目中的首选开发语言。

Go 语言的强项使其在构建高性能、可靠性和可伸缩性的网络服务中广受欢迎,并逐步成为现代软件开发中的重要工具。

3.3、Go 语言的应用场景

Go 语言以其高效性、易用性和良好的并发支持,适合用于多种场景。以下是 Go 语言的主要应用领域:

3.3.1、服务器端开发

Go 语言专为服务器端开发而设计,适合于开发大型软件和支持云计算的网络服务。其并发模型和性能优势使其在以下方面表现出色:

  • 日志处理:高效处理和分析大量日志数据;
  • 数据打包:快速处理和打包数据;
  • 虚拟机处理:管理和优化虚拟机的运行;
  • 文件系统:构建高性能文件系统;
  • 分布式系统:开发和维护分布式系统;
  • 数据库代理:实现高效的数据库代理服务。
3.3.2、网络编程

Go 语言在网络编程方面表现卓越,常用于以下应用:

  • Web应用:开发高性能的 Web 服务器和应用;
  • API应用:构建 RESTful API 和微服务架构;
  • 下载应用:实现高效的下载和文件传输应用。
3.3.3、云平台

Go 语言被广泛应用于云计算领域,其并发特性和性能使其成为开发云平台的理想选择:

  • 内存数据库:开发高效的内存数据库;
  • 云平台服务:构建和管理云平台服务。
3.3.4、区块链技术

在区块链技术领域,Go 语言也备受青睐,许多去中心化应用(DApps)和工具都使用Go语言实现:

  • 以太坊:以太坊的部分组件是用 Go 语言开发的;
  • 超级账本:超级账本(Hyperledger)项目中也使用了 Go 语言;
  • 区块链工具:各种区块链相关工具和应用。
3.3.5、底层开发

Go 语言还适合用于底层开发,例如网络协议、操作系统组件等。

综上所述,Go 语言的设计使其特别适合于高并发、分布式系统和网络服务的开发。其简洁的语法、强大的标准库以及高效的并发模型,使其成为现代软件开发中的重要工具。无论是服务器端开发、网络编程、云平台、还是区块链技术,Go 语言都能提供高效、可靠的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/648761.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

统计每个活动的用户访问量,且每个用户仅统计一次

场景:统计每个活动的用户访问量,且每个用户仅统计一次。 首先活动表是已经存在了的,一般情况下,我们都会在创建一个用户访问表,其中唯一主键是用户ID活动ID作为唯一主键 create table user_visist_activity_record(i…

Latex:newcommand

参考文献&#xff1a; latex中自定义的命令———\newcommand-CSDN博客LaTeX技巧924&#xff1a;详解newcommand的参数和默认值 - LaTeX工作室 (latexstudio.net) 文章目录 (re)newcommand自定义的一些命令 (re)newcommand ”定义命令“ 的定义&#xff1a; \newcommand{<…

GTX IP生成及参数详解(高速收发器九)

如下图所示&#xff0c;在IP Catalog中搜索gt&#xff0c;然后双击7 Series FPGAs Transcelvers Wizard打开IP配置界面。 图1 打开7 Series FPGAs Transcelvers Wizard IP 1、配置GT Selection界面 首先进入GT Selection配置界面&#xff0c;这个界面主要关注红框部分。从前文对…

AOP、注解、EL表达、若依权限,Security原理综合分析

AOP、注解、EL表达、若依权限&#xff0c;Security原理综合分析 案例一&#xff1a;更新、创建增强 需求产生 每个表中均有创建时间、创建人、修改时间、修改人等字段。 在操作时候手动赋值&#xff0c;就会导致编码相对冗余、繁琐&#xff0c;那能不能对于这些公共字段在某…

Vue3学习-用 vite@latest 初始化项目后,遇到无法识别 .vue 文件

引入app界面遇到 我的解决方案 1.根目录创建 env.d.ts&#xff0c;添加 declare module "*.vue" {import type { DefineComponent } from "vue"const vueComponent: DefineComponent<{}, {}, any>export default vueComponent }2.在 tsconfig.json…

iCloud 照片到 Android 指南:帮助您快速将照片从 iCloud 传输到安卓手机

​ 概括 iOS 和 Android 之间的传输是一个复杂的老问题。将 iCloud 照片传输到 Android 似乎是不可能的。放心。现在的高科技已经解决了这个问题。尽管 Apple 和 Android 不提供传输工具&#xff0c;但您仍然有其他有用的选项。这篇文章与您分享了 5 个技巧。因此&#xff0c;…

⌈ 传知代码 ⌋ 实现沉浸式交互故事体验

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

左极限与右极限

左极限与右极限 1. 前言 极限描述了函数在一个定点附近的行为&#xff0c;具体说就是当函数的自变量&#xff08;例如 x x x&#xff09;趋近于某一个值时&#xff0c;函数的因变量&#xff08;例如 y y y&#xff09;会产生什么样的特性&#xff08;或结果&#xff09;。 …

降价!免费!AI大模型开启价格战,企业如何“薅”出绿色财富?

近期&#xff0c;国内大模型技术供应商之间的价格战&#xff0c;使得这项原本成本较高的技术变得更加亲民&#xff0c;极大降低了企业的技术采用门槛。这不仅为企业提供了经济实惠的技术解决方案&#xff0c;更为他们的绿色低碳转型之路带来了新的机遇。 随着全球气候变化问题…

社区矫正程序管理端和小程序(支持人脸识别)

社区矫正作为我国刑事处罚执行方式中独特的种类&#xff0c;从2003年进行试点至今已有近20年的时间&#xff0c;在罪犯改造方面取得了突出成就&#xff0c;在法治国家建设过程中具有十分重要的意义。相较于监狱内服刑的执行方式&#xff0c;社区矫正更加侧重于对服刑人员进行教…

力扣刷题--747. 至少是其他数字两倍的最大数【简单】

题目描述 给你一个整数数组 nums &#xff0c;其中总是存在 唯一的 一个最大整数 。 请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是&#xff0c;则返回 最大元素的下标 &#xff0c;否则返回 -1 。 示例 1&#xff1a; 输入&#xff1a;n…

AI+低代码,打通企业大模型应用最后一公里!

一、AI的趋势与发展 一夜之间&#xff0c;微软的AI全宇宙似乎已成型。 5月22日凌晨&#xff0c;在一年一度的2024微软Build大会上&#xff0c;微软CEO萨蒂亚纳德拉一口气宣布了50多项AI能力更新&#xff0c;涵盖GPT-4o上云、自研Cobalt芯片、团队版Copilot、SOTA小模型等。 此…

element el-table表格表头某一列表头文字或者背景修改颜色

效果如下 整体代码 &#xff0c;具体方法在最下面&#xff01; <el-table v-loading"listLoading" :data"sendReceivList" element-loading-text"Loading" border fit ref"tableList" :header-cell-class-name"addClass&quo…

大模型应用之基于Langchain的测试用例生成

一 用例生成实践效果 在组内的日常工作安排中&#xff0c;持续优化测试技术、提高测试效率始终是重点任务。近期&#xff0c;我们在探索实践使用大模型生成测试用例&#xff0c;期望能够借助其强大的自然语言处理能力&#xff0c;自动化地生成更全面和高质量的测试用例。 当前…

延迟重平衡优化(Deferred Re-balancing Optimization Schedule)

DRW 论文代码 elif args.train_rule DRW:train_sampler Noneidx epoch // 160betas [0, 0.9999]effective_num 1.0 - np.power(betas[idx], cls_num_list)print(f"\neffective_num:{effective_num}")per_cls_weights (1.0 - betas[idx]) / np.array(effective…

【stm32/CubeMX、HAL库】嵌入式实验六:定时器(2)|PWM输出

参考&#xff1a; 【【正点原子】手把手教你学STM32CubeIDE开发】 https://www.bilibili.com/video/BV1Wp42127Cx/?p13&share_sourcecopy_web&vd_source9332b8fc5ea8d349a54c3989f6189fd3 《嵌入式系统基础与实践》刘黎明等编著&#xff0c;第九章定时器&#xff0c…

更适合国内的远程访问方法:自建根服务器基于节点小宝虚拟内网

网盘限速&#xff1f;异地出差忘文件&#xff1f;出差异地办公&#xff0c;访问公司OA、ERP、CRM系统、文件服务器等&#xff0c;快速组建个人局域网&#xff0c;家庭影院共享&#xff0c;享受高质量的视听体验。等等这样的场景&#xff0c;稳定靠谱的远程访问能力显得就更加至…

VGG论文解析—Very Deep Convolutional Networks for Large-Scale Image Recognition

VGG论文解析—Very Deep Convolutional Networks for Large-Scale Image Recognition -2015 研究背景 大规模图像识别的深度卷积神经网络 VGG&#xff08;牛津大学视觉几何组&#xff09; 认识数据集&#xff1a;ImageNet的大规模图像识别挑战赛 LSVRC-2014&#xff1a;Image…

FreeRTOS队列之向队列发送消息

本篇文章记录我学习FreeRTOS队列相关的知识&#xff0c;主要是关于向队列发送消息的部分。 一、函数原型 创建好队列以后就可以向队列发送消息了,FreeRTOS提供了8个向队列发送消息的API函数。 1、函数xQueueSend()、xQueueSendToBack()和xQueueSendToFront() 这三个函数都是用于…

windows11下,使用工具验证下载的iso文件完整性

windows11下&#xff0c;要验证下载的iso文件是否正常&#xff0c;可以使用工具生成md5值&#xff0c;再与下载源提供的md5值进行比较&#xff0c;相同&#xff0c;说明下载的正常。 命令如下&#xff1a; certutil -hashfile iso文件名 md5 如下面的例子&#xff0c;生成d…