为何每个开发者都在谈论Go?
目录
- 一、引言
- Go的历史回顾
- 关键时间节点
- 使用场景
- Go的语言地位
- 技术社群与企业支持
- 资源投入和生态系统
- 二、简洁的语法结构
- 基本组成元素
- 变量声明与初始化
- 代码示例
- 类型推断
- 函数与返回值
- 代码示例
- 输出
- 接口与结构体:组合而非继承
- 错误处理:明确而不是异常
- 小结
- 三、并发支持
- Goroutines:轻量级线程
- 基本用法
- 代码示例
- 输出
- Channels:并发安全的数据交流
- 基本用法
- 代码示例
- 输出
- Select:多路复用
- 内存模型和同步原语
- 小结
- 四、性能优势
- 高效的编译器
- 代码示例:编译时间
- 运行时性能
- Goroutine调度
- 垃圾回收与内存管理
- 代码示例:内存分配
- 内置的性能分析工具
- 小结
- 五、生态系统和社群
- 包管理和模块化
- Go Modules
- 标准库
- 代码示例:HTTP服务器
- 开源生态
- 社群和会议
- GopherCon
- 小结
- 六、Go在云原生领域的应用
- 容器化和微服务
- 代码示例:Dockerfile
- Kubernetes与云原生编排
- 代码示例:Kubernetes Client-Go
- Go在服务网格中的应用
- 代码示例:使用Istio进行流量控制
- Serverless和FaaS
- 小结
- 七、可移植性和跨平台支持
- 编译器的跨平台特性
- 跨平台编译
- 标准库的跨平台支持
- 代码示例:文件操作
- 体积小、依赖少
- C语言交互
- 代码示例:cgo
- 小结
- 八、总结
本文深入探讨了Go语言的多个关键方面,从其简洁的语法、强大的并发支持到出色的性能优势,进一步解析了Go在云原生领域的显著应用和广泛的跨平台支持。文章结构严谨,逐一分析了Go语言在现代软件开发中所占据的重要地位和其背后的技术原理。
关注TechLeadCloud,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。
一、引言
Go的历史回顾
Go语言(通常被称为Go或Golang)由Robert Griesemer、Rob Pike和Ken Thompson在2007年开始设计,并于2009年正式公开发布。这三位设计者都曾在贝尔实验室工作,拥有丰富的编程语言和操作系统研究经验。Go的诞生最初是为了解决Google内部的软件工程问题,特别是服务端软件的开发。
设计Go的主要目标包括:
- 简化现代软件复杂性
- 提高开发和编译速度
- 天然支持并发和网络编程
- 可移植性和跨平台支持
关键时间节点
- 2009年:Go语言首次公开发布。
- 2011年:Go版本1(Go1)发布,确立了API和主要规范。
- 2015年:Docker和Kubernetes等开源项目开始广泛采用Go,加速了其在工业界的普及。
使用场景
Go语言主要在以下场景中得到广泛应用:
- 后端开发:高性能API和微服务
- 云原生应用:如Docker和Kubernetes
- 网络编程:TCP/HTTP服务器、网络代理等
- 数据处理和分析:日志分析、数据抓取等
- 命令行工具:如Git操作工具、系统监控工具等
- 嵌入式系统和物联网
Go的语言地位
从RedMonk编程语言排名和Stack Overflow开发者调查来看,Go一直稳居前十强。特别值得注意的是,Go在服务端开发和云原生领域已经成为一门不可或缺的语言。
技术社群与企业支持
Go拥有活跃的社群和强大的企业支持,不仅包括Google,还有IBM、Microsoft、Dropbox等多个大型企业都在内部广泛使用Go。Go也有丰富的第三方库和框架,为开发者提供了强大的工具和资源。
资源投入和生态系统
Go拥有一个庞大和快速发展的生态系统,包括丰富的库、开发工具以及成熟的框架。这使得Go不仅仅是一门编程语言,更是一种解决问题和实现目标的全面工具集。
二、简洁的语法结构
Go语言是以简洁、明确和可维护为设计目标的。简洁的语法不仅让新手容易上手,也允许开发团队更加高效地进行大规模开发。
基本组成元素
Go语言的基本组成元素包括变量、常量、函数和控制结构等,但与其他语言相比,Go具有自己独特的简洁风格。
变量声明与初始化
Go语言在变量声明和初始化方面提供了多种简洁的方式。
// 常见的变量声明与初始化
var i int = 10
var j = 20
k := 30
代码示例
// 声明并初始化多个变量
var a, b, c = 1, 2.0, "three"
x, y, z := 4, 5.0, "six"
类型推断
Go编译器能进行强大的类型推断,这避免了冗余的类型声明。
var message = "Hello, World!" // 类型推断为string
count := 42 // 类型推断为int
函数与返回值
Go的函数可以返回多个值,并且支持命名返回值。
// 函数返回多个值
func swap(x, y string) (string, string) {return y, x
}
代码示例
// 带命名返回值的函数
func divide(dividend, divisor int) (quotient, remainder int) {quotient = dividend / divisorremainder = dividend % divisorreturn
}
输出
使用这个divide
函数,例如divide(5, 2)
将会返回(2, 1)
。
接口与结构体:组合而非继承
Go通过结构体(Structs)和接口(Interfaces)提供了强大的抽象机制,但它避免了像Java那样复杂的继承结构。
type Shape interface {Area() float64
}type Circle struct {Radius float64
}func (c Circle) Area() float64 {return 3.14159 * c.Radius * c.Radius
}
这里,Circle
结构体实现了Shape
接口,而没有显式声明。这种隐式接口实现减少了代码量,并提高了代码的可读性和可维护性。
错误处理:明确而不是异常
Go通过返回值进行错误处理,而非使用异常。这一点让代码的错误处理路径更加明确,易于理解。
if err != nil {// handle error
}
小结
Go语言通过其简洁而一致的语法结构,大大减少了编程的复杂性。不仅如此,它还通过类型推断、多返回值、接口和错误处理等机制,提供了高度的表达能力。
三、并发支持
Go语言对并发编程提供了一流的支持,这是它与其他编程语言最显著的不同之一。Go使用Goroutines和Channels来简化并发编程,并通过其运行时系统提供对低级并发控制的抽象。
Goroutines:轻量级线程
Goroutines是Go语言并发模型的核心。它们比操作系统线程更为轻量级,因为它们共享同一地址空间。
基本用法
go funcName(params)
简单地在函数调用前加上go
关键字,你就创建了一个新的Goroutine。
代码示例
// 使用goroutine执行异步任务
func printNumbers() {for i := 0; i < 10; i++ {fmt.Println(i)}
}func main() {go printNumbers()// do something else
}
输出
因为printNumbers
是在一个新的Goroutine中运行,主函数main
会与之并行执行。
Channels:并发安全的数据交流
Channel是Go中用于Goroutine间数据传输和同步的主要手段。
基本用法
ch := make(chan int)
代码示例
// 使用channel进行数据传输
func sum(a []int, ch chan int) {sum := 0for _, v := range a {sum += v}ch <- sum // send sum to ch
}func main() {a := []int{7, 2, 8, -9, 4, 0}ch := make(chan int)go sum(a[:len(a)/2], ch)go sum(a[len(a)/2:], ch)x, y := <-ch, <-ch // receive from chfmt.Println(x + y)
}
输出
该程序输出的是a
切片中所有元素的和。
Select:多路复用
Go提供了select
语句,它是一个强大的用于多个Channel操作的多路复用器。
select {
case msg1 := <-ch1:fmt.Println("Received", msg1)
case msg2 := <-ch2:fmt.Println("Received", msg2)
case ch3 <- 3:fmt.Println("Sent 3 to ch3")
default:fmt.Println("No communication")
}
这使得你可以同时等待多个Channel操作,只执行其中已准备好的那个。
内存模型和同步原语
Go也提供了传统的同步原语,如互斥锁(Mutex
)和读写锁(RWMutex
),但在实际开发中,优先推荐使用Channels进行并发控制。
小结
Go的并发模型主要围绕Goroutines和Channels展开,它们共同提供了一种高效、强大而安全的方式来进行并发编程。通过深入了解Go语言的并发模型,开发者可以构建高度并发的系统,而不必陷入复杂和容易出错的并发控制中。这也是Go语言在现代多核和分布式系统中日益流行的一个重要原因。
四、性能优势
Go语言不仅在语法和并发模型上具有优势,其性能也是其备受赞誉的一大特点。这一章节将深入探讨Go语言在性能方面的特性和优势。
高效的编译器
Go的编译器是为快速编译速度而设计的,这意味着你可以更快地从源代码到可执行文件。
代码示例:编译时间
time go build your_program.go
通过运行这个命令,你会发现Go编译器的速度通常要比其他编程语言快得多。
运行时性能
Go运行时极其高效,这主要得益于其轻量级的Goroutine和垃圾回收机制。
Goroutine调度
Go运行时有自己的调度器,它能在用户级别上进行Goroutine的调度,降低上下文切换的成本。
// 计算斐波那契数列
func Fibonacci(n int) int {if n < 2 {return n}return Fibonacci(n-1) + Fibonacci(n-2)
}
由于Go的运行时调度,这样的CPU密集型任务可以轻松地并发执行。
垃圾回收与内存管理
Go使用了一种并发垃圾回收算法,这大大减少了垃圾回收对性能的影响。
代码示例:内存分配
// 创建一个结构体实例
type Data struct {X intY float64Text string
}instance := &Data{X: 1,Y: 3.14,Text: "Text",
}
由于Go的高效内存管理,这样的操作通常会比在其他语言中更快。
内置的性能分析工具
Go提供了一系列性能分析工具,如pprof
,使得开发者可以深入了解代码的性能瓶颈。
import _ "net/http/pprof"
添加这一行,然后你就可以通过Web界面来进行实时的性能分析。
小结
Go语言在编译速度、运行时性能和内存管理方面都表现出色,这使得它非常适用于需要高性能的应用场景,如微服务、并发处理、数据处理等。通过了解Go语言在性能方面的优势,开发者可以更好地利用这些优点来构建高效、可扩展的系统。这也是为什么许多高性能需求的项目和公司选择Go作为他们的开发语言的原因之一。
五、生态系统和社群
除了语言特性和性能优势之外,一个编程语言的成功与否也高度依赖于其生态系统和社群的活跃度。Go在这方面有着不小的优势,本节将深入探讨Go的生态系统和社群。
包管理和模块化
Go语言从一开始就考虑到了包管理和代码复用。Go的包管理工具go get
和Go Modules为开发者提供了一个高效、直观的方式来管理依赖。
Go Modules
Go Modules是Go 1.11版引入的,用于依赖管理的官方解决方案。
go mod init
go get github.com/pkg/errors
通过简单的命令,开发者就能初始化一个新项目并添加依赖。
标准库
Go的标准库覆盖了网络编程、数据解析、文本处理等多个领域,大大降低了开发者需要依赖第三方库的需求。
代码示例:HTTP服务器
// 创建一个简单的HTTP服务器
package mainimport ("fmt""net/http"
)func hello(w http.ResponseWriter, req *http.Request) {fmt.Fprintf(w, "Hello, world!\n")
}func main() {http.HandleFunc("/hello", hello)http.ListenAndServe(":8080", nil)
}
这个例子展示了如何使用Go标准库中的net/http
包来创建一个HTTP服务器。
开源生态
Go拥有一个庞大的开源社群,GitHub上有大量的优质Go项目,如Kubernetes、Etcd和Terraform等。
社群和会议
Go社群活跃,拥有多个论坛、在线聊天室以及国际性和地方性的会议,如GopherCon。
GopherCon
GopherCon是Go开发者的年度聚会,汇集了世界各地的Go使用者,共同讨论Go的最佳实践和未来发展。
小结
Go的生态系统由高质量的包管理工具、全面的标准库、活跃的开源社群和丰富的学习资源组成。这一切都为开发者提供了良好的支持,有助于推动Go语言的快速发展和广泛应用。生态系统和社群是衡量一个编程语言健康状况的重要标准,Go在这方面的表现证明了它不仅仅是一门有潜力的新语言,更是一个成熟、可靠、拥有广泛应用前景的编程平台。
六、Go在云原生领域的应用
云原生领域的飞速发展也带动了Go语言的广泛应用。作为云原生技术的主力军之一,Go因其高性能、简洁的语法以及丰富的标准库,逐渐成为该领域的首选语言。本节将深入探讨Go在云原生应用开发中的关键角色和优势。
容器化和微服务
Go语言的高效编译和轻量级的运行环境使其非常适合构建容器化应用和微服务。
代码示例:Dockerfile
# 使用Go官方基础镜像
FROM golang:1.16
# 设置工作目录
WORKDIR /app
# 将Go模块复制到容器中
COPY go.mod ./
COPY go.sum ./
# 下载所有依赖
RUN go mod download
# 将源代码复制到容器中
COPY . .
# 编译应用
RUN go build -o main .
# 运行应用
CMD ["/app/main"]
这个简单的Dockerfile示例展示了如何容器化一个Go应用。
Kubernetes与云原生编排
Kubernetes是由Google设计并开源的容器编排平台,其底层主要是用Go语言编写的。
代码示例:Kubernetes Client-Go
import ("k8s.io/client-go/kubernetes""k8s.io/client-go/tools/clientcmd"
)// 初始化Kubernetes客户端
config, err := clientcmd.BuildConfigFromFlags("", "/path/to/kubeconfig")
clientset, err := kubernetes.NewForConfig(config)
这段代码展示了如何使用Kubernetes的Go客户端库进行集群操作。
Go在服务网格中的应用
Istio和Linkerd等主流服务网格项目也是用Go实现的,它们提供了复杂的流量管理、安全性和观测性能力。
代码示例:使用Istio进行流量控制
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: reviews
spec:hosts:- reviewshttp:- route:- destination:host: reviewssubset: v1
虽然这不是Go代码,但Istio的YAML配置文件控制着用Go编写的服务网格行为。
Serverless和FaaS
Go也在Serverless和FaaS(Function as a Service)领域取得了不小的成功,AWS Lambda、Google Cloud Functions等平台都提供了Go的一流支持。
小结
Go语言因其出色的性能和可扩展性,已经在云原生应用开发领域占据了一席之地。从容器编排到服务网格,再到无服务器架构,Go都有着广泛的应用场景。Go在云原生领域的广泛应用不仅证明了其作为一种现代编程语言的能力,更凸显了其在处理高并发、分布式、微服务架构等复杂场景下的优越性。因此,对于希望深入了解云原生应用开发的人来说,学习和掌握Go几乎成了一种必然。
七、可移植性和跨平台支持
Go语言在设计之初就强调了跨平台支持和高度的可移植性,这也是其逐渐受到开发者喜爱的一个重要原因。本节将详细解析Go在这方面的技术优势和应用场景。
编译器的跨平台特性
Go的编译器(gc)支持多种操作系统和架构。通过简单的环境变量或命令行参数,你可以轻易地为不同平台生成可执行文件。
跨平台编译
# 为Linux平台编译
GOOS=linux GOARCH=amd64 go build -o app-linux
# 为Windows平台编译
GOOS=windows GOARCH=amd64 go build -o app-windows.exe
上面的代码展示了如何利用Go的交叉编译功能为Linux和Windows平台分别生成可执行文件。
标准库的跨平台支持
Go的标准库提供了一套统一的API用于文件操作、网络编程等,屏蔽了底层操作系统的差异。
代码示例:文件操作
// 使用Go标准库进行文件操作
package mainimport ("io/ioutil""log"
)func main() {data := []byte("Hello, world!\n")// 写入文件err := ioutil.WriteFile("/tmp/hello.txt", data, 0644)if err != nil {log.Fatal(err)}
}
这个代码示例展示了如何使用ioutil
包进行文件操作,该操作在Unix和Windows平台上都是有效的。
体积小、依赖少
由于Go应用编译后是单一的可执行文件,无需外部依赖,这大大简化了在不同环境中的部署。
C语言交互
通过cgo工具,Go能够轻易地与C语言库进行交互,这一点大大增强了其可移植性。
代码示例:cgo
// #include <stdio.h>
import "C"func main() {C.puts(C.CString("Hello, world!"))
}
上面的代码示例展示了如何使用cgo调用C语言的puts
函数。
小结
Go通过其出色的跨平台编译器、丰富的标准库和与C语言的高度互操作性,展现了强大的可移植性和跨平台支持。在如今多元化和全球化的软件开发环境中,可移植性和跨平台支持是任何编程语言成功的关键因素之一。Go语言在这方面的表现使其成为了一个值得投资和使用的编程工具。
八、总结
Go语言,自2009年由Google推出以来,凭借其简洁的语法、出色的性能和高度的可移植性,迅速崭露头角。它为并发编程提供了一流的支持,同时拥有丰富而强大的标准库。在云原生、微服务、数据分析等多个前沿领域里,Go已经成为了一种不可或缺的编程工具。它的生态系统日渐完善,拥有大量的开源项目和活跃的社群。综上所述,无论你是希望构建高性能的服务端应用,还是寻求一种高效、可靠的通用编程语言,Go都是一个值得深入学习和使用的选择。
关注TechLeadCloud,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。
相关文章:

为何每个开发者都在谈论Go?
目录 一、引言Go的历史回顾关键时间节点 使用场景Go的语言地位技术社群与企业支持资源投入和生态系统 二、简洁的语法结构基本组成元素变量声明与初始化代码示例 类型推断函数与返回值代码示例输出 接口与结构体:组合而非继承错误处理:明确而不是异常小结…...

【Leetcode】 501. 二叉搜索树中的众数
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。 如果树中有不止一个众数,可以按 任意顺序 返回。 假定 BST 满足如下定义…...

怎样给Ubuntu系统安装vmware-tools
首先我要告诉你:Ubuntu无法安装vmware-tools,之所以这么些是因为我一开始也是这样认为的,vmware-tools是给Windows系统准备的我认为,毕竟Windows占有率远远高于Linux,这也可以理解。 那么怎么样实现Ubuntu虚拟机跟Wind…...

DDS信号发生器波形发生器VHDL
名称:DDS信号发生器波形发生器 软件:Quartus 语言:VHDL 要求: 在EDA平台中使用VHDL语言为工具,设计一个常见信号发生电路,要求: 1. 能够产生锯齿波,方波,三角波&…...

Python3操作SQLite3创建表主键自增长|CRUD基本操作
Win11查看安装的Python路径及安装的库 Python PEP8 代码规范常见问题及解决方案 Python3操作MySQL8.XX创建表|CRUD基本操作 Python3操作SQLite3创建表主键自增长|CRUD基本操作 anaconda3最新版安装|使用详情|Error: Please select a valid Python interpreter Python函数绘…...

B. Comparison String
题目: 样例: 输入 4 4 <<>> 4 >><< 5 >>>>> 7 <><><><输出 3 3 6 2 思路: 由题意,条件是 又因为要使用尽可能少的数字,这是一道贪心题,所以…...

python端口扫描
扫描所有端口 import socket, threading, os, timedef port_thread(ip, start, step, timeout):for port in range(start, start step):s socket.socket()s.settimeout(timeout)try:s.connect((ip, port))print(f"port[{port}] 可用")except Exception as e:# pri…...

国庆第二天
#include<th.h>#define ERR_MSG(msg) do{\fprintf(stderr,"__%d__",__LINE__);\perror(msg);\ }while(0)#define PORT 6666 #define IP "192.168.2.3"//键盘输入事件 int serverkeyboard(fd_set readfds) {char buf[128] "";int sndfd -…...

Java安全之servlet内存马分析
目录 前言 什么是中间键 了解jsp的本质 理解servlet运行机制 servlet的生命周期 Tomcat总体架构 查看Context 的源码 servlet内存马实现 参考 前言 php和jsp一句话马我想大家都知道,早先就听小伙伴说过一句话木马已经过时了,现在是内存马的天下…...

2023年第二十届中国研究生数学建模竞赛总结与分享
今天是国庆节,祝祖国繁荣富强。正好也学习不下去,就想着写写博客,总结一下自己在参加2023年第20届中国研究生数学建模比赛的一些感受。 目录 1.基本介绍 2.比赛分享 1.基本介绍 1. 竞赛时间:竞赛定于2023年9月22日8:00至2023年9…...

Web前端-Vue2+Vue3基础入门到实战项目-Day1(初始Vue, Vue指令, 小黑记事本)
Web前端-Vue2Vue3基础入门到实战项目-Day1 Vue快速上手创建一个Vue实例插值表达式Vue响应式特性 Vue指令指令初识 和 v-htmlv-show 和 v-ifv-else 和 v-else-ifv-on内联语句methods处理函数调用传参 v-bind案例 - 波仔的学习之旅v-forv-for基本使用案例 - 小黑的书架v-for的key…...

Sentinel学习(2)——sentinel的使用,引入依赖和配置 对消费者进行流控 对生产者进行熔断降级
前言 Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 本篇博客介绍sentinel的使用&#x…...

springboot 简单配置mongodb多数据源
准备工作: 本地mongodb一个创建两个数据库 student 和 student-two 所需jar包: # springboot基于的版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>&l…...

西门子S7-1200使用LRCF通信库与安川机器人进行EthernetIP通信的具体方法示例
西门子S7-1200使用LRCF通信库与安川机器人进行EthernetIP通信的具体方法示例 准备条件: PLC:S7-1200 1214C DC/DC/DC 系统版本4.5及以上。 机器人控制柜:安川YRC1000。 软件:TIA V17 PLC做主站,机器人做从站。 具体方法可参考以下内容: 使用的库文件为西门子 1200系列…...

pytorch第一天(tensor数据和csv数据的预处理)lm老师版
tensor数据: import torch import numpyx torch.arange(12) print(x) print(x.shape) print(x.numel())X x.reshape(3, 4) print(X)zeros torch.zeros((2, 3, 4)) print(zeros)ones torch.ones((2,3,4)) print(ones)randon torch.randn(3,4) print(randon)a …...

CSP-J第二轮试题-2021年-1.2题
文章目录 参考:总结 [CSP-J 2021] 分糖果题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 提示答案1答案2-优化 [CSP-J 2021] 插入排序题目描述输入格式输出格式样例 #1样例输入 #1样…...

怒刷LeetCode的第16天(Java版)
目录 第一题 题目来源 题目内容 解决方法 方法一:迭代 方法二:模拟 方法三:循环模拟 方法四:传递 第二题 题目来源 题目内容 解决方法 方法一:回溯 方法二:枚举优化 第三题 题目来源 题目…...

让大脑自由
前言 作者写这本书的目的是什么? 教会我们如何让大脑更好地为自己工作。 1 大脑的运行机制是怎样的? 大脑的基本运行机制是神经元之间通过突触传递信息,神经元的兴奋和抑制状态决定了神经网络的运行和信息处理,神经网络可以通过…...

Arcgis克里金插值报错:ERROR 010079: 无法估算半变异函数。 执行(Kriging)失败。
Arcgis克里金插值报错:ERROR 010079: 无法估算半变异函数。 执行(Kriging)失败。 问题描述: 原因: shape文件的问题,此图可以看出,待插值的点有好几个都超出了地理范围之外,这个不知道是坐标系配准的问…...

Docker Compose安装
title: “Docker Compose安装” createTime: 2022-01-04T19:08:1508:00 updateTime: 2022-01-04T19:08:1508:00 draft: false author: “name” tags: [“docker”,“docker-compose”] categories: [“install”] description: “测试的” docker-compose安装步骤 1.下载 u…...

机器人过程自动化(RPA)入门 7. 处理用户事件和助手机器人
在UiPath中,有两种类型的Robot用于自动化任何流程。一个是后台机器人,它在后台工作。它独立工作,这意味着它不需要用户的输入或任何用户交互。另一个是前台机器人,也被称为助理机器人。 本章介绍前台机器人。在这里,我们将了解自动化过程中通过简单按键、单击鼠标等触发事…...

在linux下预览markdown的方法,转换成html和pdf
背景 markdown是一种便于编写和版本控制的格式,但却不便于预览——特别是包含表格等复杂内容时,单纯的语法高亮是远远不够的——这样就不能边预览边调整内容,需要找到一种预览方法。 思路 linux下有个工具,叫pandoc,…...

AIOT入门指南:探索人工智能与物联网的交汇点
AIOT入门指南:探索人工智能与物联网的交汇点 1. 引言 随着技术的快速发展,人工智能(AI)和物联网(IoT)已经成为当今最热门的技术领域。当这两个领域交汇时,我们得到了AIOT - 一个结合了AI的智能…...

CCC数字钥匙设计【NFC】 --车主配对流程介绍
1、车主配对流程介绍 车主配对流程可以通过车内NFC进行,若支持UWB测距,也可以通过蓝牙/UWB进行,本文主要介绍通过NFC进行车主配对的流程。 整个配对流程相对较为复杂,本文主要梳理整体的步骤流程,其中的每个细节流程未…...

一站式开源持续测试平台 MerterSphere 之测试跟踪操作详解
一、MeterSphere平台介绍 MeterSphere是一站式的开源持续测试平台,遵循 GPL v3 开源许可协议,涵盖测试跟踪、接口测试、UI 测试和性能测试等功能,全面兼容JMeter、Selenium 等主流开源标准,有效助力开发和测试团队充分利用云弹性进…...

自然语言处理状况简介
一、说明 自然语言处理已经进入大模型时代,然而从业人员必须了解整个知识体系、发展过程、知识结构,应用范围等一系列知识。本篇将报道此类概况。 二、自然语言处理简介 自然语言处理,或简称NLP,是处理和转换文本的计算机科学学科…...

python爬虫基于管道持久化存储操作
文章目录 基于管道持久化存储操作scrapy的使用步骤1.先转到想创建工程的目录下:cd ...2.创建一个工程3.创建之后要转到工程目录下4.在spiders子目录中创建一个爬虫文件5.执行工程setting文件中的参数 基于管道持久化存储的步骤:持久化存储1:保…...

【MySQL】数据类型(二)
文章目录 一. char字符串类型二. varchar字符串类型2.1 char和varchar比较 三. 日期和时间类型四. enum和set类型4.1 set的查询 结束语 一. char字符串类型 char (L) 固定长度字符串 L是可以存储的长度,单位是字符,最大长度是255 MySQL中的字符ÿ…...

基于Matlab实现连续模型求解方法
本文介绍了如何使用Matlab实现连续模型求解方法。首先,我们介绍了连续模型的概念,并明确了使用ODE和PDE求解器来求解常微分方程和偏微分方程的步骤。然后,我们通过一个简单的例子演示了如何将问题转化为数学模型,并使用Matlab编写…...

Tomcat 与 JDK 对应版本关系
对应关系 Tomcat版本 jdk版本11.0.x JDK 21及以后10.1.x JDK11及以后10.0.xJDK1.8及以后9.0.x JDK1.8及以后8.5.xJDK1.7及以后8.0.x JDK1.7及以后 查看对应关系方法: 登陆Tomcat官网:Apache Tomcat - Welcome! 结果:...