Go语言加Vue3零基础入门全栈班10 Go语言+gRPC用户微服务项目实战 2024年07月31日 课程笔记
概述
如果您没有Golang的基础,应该学习如下前置课程。
- Golang零基础入门
- Golang面向对象编程
- Go Web 基础
- Go语言开发REST API接口_20240728
- Go语言操作MySQL开发用户管理系统API教程_20240729
- Redis零基础快速入门_20231227
- Go+Redis开发用户管理系统API实战_20240730
- MongoDB快速入门_20240411
- Go语言+MongoDB用户管理系统实战_20240730
基础不好的同学每节课的代码最好配合视频进行阅读和学习,如果基础比较扎实,则阅读本教程巩固一下相关知识点即可,遇到不会的知识点再看视频。
课程特色
本教程录制于2024年7月31日,使用Go1.22版本,基于Goland2024进行开发,采用的技术栈比较新。
每节课控制在十分钟以内,课时精简,每节课都是一个独立的知识点,如果有遗忘,完全可以当做字典来查询,绝不浪费大家的时间。
整个课程从如何搭建Go语言gRPC环境讲起,然后如何创建proto文件,如何实现基本的gRPC为辅,如何开发增删改查的用户微服务,层层递进,学习路径平缓。
Golang是当前国内越来越多的企业正在全面转的一门系统级别的高性能的编程语言,比C语言写法更加的简单,比Python性能更加的好,是新时代的C语言,建议每个程序员都掌握!
视频课程
最近发现越来越多的公司在用Golang了,所以精心整理了一套视频教程给大家,这个是其中的第10部,后续还会有很多。
视频已经录制完成,完整目录截图如下:
本套课程的特色是每节课都是一个核心知识点,每个视频控制在十分钟左右,精简不废话,拒绝浪费大家的时间。
课程目录
- 01 概述
- 02 搭建Go语言gRPC微服务开发环境
- 03 下载go-grpc官方的示例代码
- 04 编写简单的proto文件
- 05 根据proto文件自动生成Go代码
- 06 创建grpc的服务端
- 07 创建grpc的客户端
- 08 定义用户微服务的proto文件
- 09 生成用户微服务的go代码
- 10 开发用户微服务服务端基本代码
- 11 开发用户微服务客户端的基本代码
- 12 创建用户表
- 13 连接到MySQL数据库
- 14 实现新增用户的微服务方法并测试
- 15 实现查询所有用户的微服务方法并测试
- 16 实现根据ID查询用户的微服务方法并测试
- 17 实现修改用户的微服务方法并测试
- 18 实现删除用户的微服务方法并测试
- 19 总结
完整代码
04 编写简单的proto文件
syntax = "proto3";// go项目包的位置
option go_package = "grpc_demo/helloworld";// 包名
package helloworld;// 服务:微服务
service Greeter {// 方法rpc SayHello(HelloRequest) returns (HelloReply) {}
}// 请求对象
message HelloRequest{// 参数string name = 1; // 1 表示的是参数在第几个位置,从1开始
}// 响应对象
message HelloReply{string message = 1;
}
05 根据proto文件自动生成Go代码
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative helloworld/helloworld.proto
06 创建grpc的服务端
package mainimport ("context""fmt""google.golang.org/grpc"pb "grpc_demo/helloworld""net"
)// 服务对象
type server struct {pb.UnimplementedGreeterServer
}// SayHello 实现方法
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {fmt.Println("接收到的名字是:", in.Name)return &pb.HelloReply{Message: "你好 " + in.Name}, nil
}func main() {// 创建监听器lis, err := net.Listen("tcp", ":8080")if err != nil {fmt.Printf("failed to listen: %v", err)return}// 构建grpc服务grpcServer := grpc.NewServer()pb.RegisterGreeterServer(grpcServer, &server{})// 启动微服务err = grpcServer.Serve(lis)if err != nil {fmt.Printf("failed to serve: %v", err)}
}
07 创建grpc的客户端
package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure"pb "grpc_demo/helloworld""time"
)func main() {// 创建客户端conn, err := grpc.NewClient("localhost:8080", grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {fmt.Println(err)return}defer conn.Close()// 创建指定微服务的客户端client := pb.NewGreeterClient(conn)// 调用微服务的方法ctx, cancelFunc := context.WithTimeout(context.Background(), 5*time.Second)defer cancelFunc()helloReply, err := client.SayHello(ctx, &pb.HelloRequest{Name: "李四"})if err != nil {fmt.Println(err)return}// 处理响应fmt.Println(helloReply.GetMessage())}
08 定义用户微服务的proto文件
syntax = "proto3";// go项目包的位置
option go_package = "grpc_demo/c02_user/proto";// 包名
package proto;// 服务:微服务
service UserMicroService {rpc Add(AddRequest) returns (CommonReply) {}rpc Delete(IdRequest) returns (CommonReply) {}rpc Update(UpdateRequest) returns (CommonReply) {}rpc GetByID(IdRequest) returns (CommonReply) {}rpc GetAll(EmptyRequest) returns (CommonReply) {}
}message AddRequest{string name = 1;int64 age = 2;
}
message UpdateRequest{int64 id = 1;string name = 2;int64 age = 3;
}
message IdRequest{int64 id = 1;
}
message EmptyRequest{
}message CommonReply{bool status = 1; // 成功或者失败string message = 2; // 详细信息string data = 3; // 返回的数据,JSON格式
}
12 创建用户表
drop table if exists user;
create table user
(id int primary key auto_increment,name varchar(36),age int
);
14 实现新增用户的微服务方法并测试
这里是微服务服务端的完整代码,后续的只是客户端测试代码。
服务端代码:
package mainimport ("context""database/sql""encoding/json""fmt""github.com/zhangdapeng520/zdpgo_mcrud"_ "github.com/zhangdapeng520/zdpgo_mysql""google.golang.org/grpc"pb "grpc_demo/c02_user/proto""net""strconv"
)var (db *sql.DBerr error
)func initMySQL() {dbUrl := "root:root@tcp(127.0.0.1:3306)/test"db, err = sql.Open("mysql", dbUrl)if err != nil {fmt.Println(err)return}
}func closeMySQL() {db.Close()
}type User struct {Id int64 `json:"id"`Name string `json:"name"`Age int `json:"age"`
}// 服务对象
type server struct {pb.UnimplementedUserMicroServiceServer
}func (s *server) Add(ctx context.Context, in *pb.AddRequest) (*pb.CommonReply, error) {fmt.Println("接收到的名字是:", in.Name, in.Age)zdpgo_mcrud.Add(db,"user",[]string{"name", "age"},[]interface{}{in.Name, in.Age},)result := &pb.CommonReply{Status: true,Message: "success",}return result, nil
}func (s *server) GetAll(ctx context.Context, in *pb.EmptyRequest) (*pb.CommonReply, error) {data, _ := zdpgo_mcrud.GetBy(db,"user",[]string{"id", "name", "age"},nil,)jsonData, _ := json.Marshal(data)result := &pb.CommonReply{Status: true,Message: "success",Data: string(jsonData),}return result, nil
}func (s *server) GetByID(ctx context.Context, in *pb.IdRequest) (*pb.CommonReply, error) {data, _ := zdpgo_mcrud.GetBy(db,"user",[]string{"id", "name", "age"},map[string]interface{}{"id": in.Id},)jsonData, _ := json.Marshal(data)result := &pb.CommonReply{Status: true,Message: "success",Data: string(jsonData),}return result, nil
}func (s *server) Update(ctx context.Context, in *pb.UpdateRequest) (*pb.CommonReply, error) {zdpgo_mcrud.Update(db,"user",strconv.FormatInt(in.Id, 10),[]string{"name", "age"},[]interface{}{in.Name, in.Age},)result := &pb.CommonReply{Status: true,Message: "success",}return result, nil
}func (s *server) Delete(ctx context.Context, in *pb.IdRequest) (*pb.CommonReply, error) {zdpgo_mcrud.Delete(db,"user",strconv.FormatInt(in.Id, 10),)result := &pb.CommonReply{Status: true,Message: "success",}return result, nil
}func main() {initMySQL()defer closeMySQL()// 创建监听器lis, err := net.Listen("tcp", ":8080")if err != nil {fmt.Printf("failed to listen: %v", err)return}// 构建grpc服务grpcServer := grpc.NewServer()pb.RegisterUserMicroServiceServer(grpcServer, &server{})// 启动微服务err = grpcServer.Serve(lis)if err != nil {fmt.Printf("failed to serve: %v", err)}
}
客户端代码:
package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure"pb "grpc_demo/c02_user/proto""time"
)func main() {// 创建客户端conn, err := grpc.NewClient("localhost:8080", grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {fmt.Println(err)return}defer conn.Close()// 创建指定微服务的客户端client := pb.NewUserMicroServiceClient(conn)// 调用微服务的方法ctx, cancelFunc := context.WithTimeout(context.Background(), 5*time.Second)defer cancelFunc()commonReply, err := client.Add(ctx, &pb.AddRequest{Name: "张三", Age: 23})if err != nil {fmt.Println(err)return}// 处理响应fmt.Println(commonReply.GetStatus())fmt.Println(commonReply.GetMessage())
}
15 实现查询所有用户的微服务方法并测试
服务端代码看地14节课的。
客户端代码:
package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure"pb "grpc_demo/c02_user/proto""time"
)func main() {// 创建客户端conn, err := grpc.NewClient("localhost:8080", grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {fmt.Println(err)return}defer conn.Close()// 创建指定微服务的客户端client := pb.NewUserMicroServiceClient(conn)// 调用微服务的方法ctx, cancelFunc := context.WithTimeout(context.Background(), 5*time.Second)defer cancelFunc()commonReply, err := client.GetAll(ctx, &pb.EmptyRequest{})if err != nil {fmt.Println(err)return}// 处理响应fmt.Println(commonReply.GetStatus())fmt.Println(commonReply.GetMessage())fmt.Println(commonReply.GetData())
}
16 实现根据ID查询用户的微服务方法并测试
服务端代码看地14节课的。
客户端代码:
package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure"pb "grpc_demo/c02_user/proto""time"
)func main() {// 创建客户端conn, err := grpc.NewClient("localhost:8080", grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {fmt.Println(err)return}defer conn.Close()// 创建指定微服务的客户端client := pb.NewUserMicroServiceClient(conn)// 调用微服务的方法ctx, cancelFunc := context.WithTimeout(context.Background(), 5*time.Second)defer cancelFunc()commonReply, err := client.GetByID(ctx, &pb.IdRequest{Id: 1})if err != nil {fmt.Println(err)return}// 处理响应fmt.Println(commonReply.GetStatus())fmt.Println(commonReply.GetMessage())fmt.Println(commonReply.GetData())
}
17 实现修改用户的微服务方法并测试
服务端代码看地14节课的。
客户端代码:
package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure"pb "grpc_demo/c02_user/proto""time"
)func main() {// 创建客户端conn, err := grpc.NewClient("localhost:8080", grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {fmt.Println(err)return}defer conn.Close()// 创建指定微服务的客户端client := pb.NewUserMicroServiceClient(conn)// 调用微服务的方法ctx, cancelFunc := context.WithTimeout(context.Background(), 5*time.Second)defer cancelFunc()commonReply, err := client.Update(ctx, &pb.UpdateRequest{Id: 1,Name: "李四333",Age: 24,})if err != nil {fmt.Println(err)return}// 处理响应fmt.Println(commonReply.GetStatus())fmt.Println(commonReply.GetMessage())
}
18 实现删除用户的微服务方法并测试
服务端代码看地14节课的。
客户端代码:
package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure"pb "grpc_demo/c02_user/proto""time"
)func main() {// 创建客户端conn, err := grpc.NewClient("localhost:8080", grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {fmt.Println(err)return}defer conn.Close()// 创建指定微服务的客户端client := pb.NewUserMicroServiceClient(conn)// 调用微服务的方法ctx, cancelFunc := context.WithTimeout(context.Background(), 5*time.Second)defer cancelFunc()commonReply, err := client.Delete(ctx, &pb.IdRequest{Id: 1})if err != nil {fmt.Println(err)return}// 处理响应fmt.Println(commonReply.GetStatus())fmt.Println(commonReply.GetMessage())
}
总结
整个课程从如何搭建Go语言gRPC环境讲起,然后如何创建proto文件,如何实现基本的gRPC为辅,如何开发增删改查的用户微服务,层层递进,学习路径平缓。
通过本套课程,能帮你入门Go语言通过gRPC开发微服务项目的技术。
如果您需要完整的源码,打赏20元即可。
人生苦短,我用PyGo,我是您身边的Python私教~
相关文章:
Go语言加Vue3零基础入门全栈班10 Go语言+gRPC用户微服务项目实战 2024年07月31日 课程笔记
概述 如果您没有Golang的基础,应该学习如下前置课程。 Golang零基础入门Golang面向对象编程Go Web 基础Go语言开发REST API接口_20240728Go语言操作MySQL开发用户管理系统API教程_20240729Redis零基础快速入门_20231227GoRedis开发用户管理系统API实战_20240730Mo…...
ChatGPT能代替网络作家吗?
最强AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 当然可以!只要你玩写作AI玩得6,甚至可以达到某些大神的水平! 看看大神、小白、AI输出内容的区…...
Http自定义Header导致的跨域问题
最近写一个小项目,前后端分离,在调试过程中访问远程接口,出现了CORS问题,接口使用的laravel框架,于是添加了解决跨域的中间件,但是前端显示仍存在跨域问题,以为自己写的有问题,检查了…...
python 中 file.read(), file.readline()和file.readlines()区别和用法
python 中 file.read(), file.readline()和file.readlines()区别和用法 文章目录 python 中 file.read(), file.readline()和file.readlines()区别和用法1. file.read()2. file.readline()3. file.readlines()4. 总结5. 注意事项 file.read(), file.readline(), 和 file.readli…...
python 学习: np.pad
在NumPy中,np.pad函数用于对数组进行填充(padding),即在数组的边界处添加额外的值。这在图像处理、信号处理或任何需要扩展数据边界的场景中非常有用。 以下是np.pad函数的一些关键参数和使用示例: array:…...
等保2.0 | 人大金仓数据库测评
人大金仓数据库,全称为金仓数据库管理系统KingbaseES(简称:金仓数据库或KingbaseES),是北京人大金仓信息技术股份有限公司自主研制开发的具有自主知识产权的通用关系型数据库管理系统。以下是关于人大金仓数据库的详细…...
AIGC赋能智慧农业:用AI技术绘就作物生长新蓝图
( 于景鑫 国家农业信息化工程技术研究中心)随着人工智能技术的日新月异,AIGC(AI-Generated Content,AI生成内容)正在各行各业掀起一场革命性的浪潮。而在智慧农业领域,AIGC技术的应用也正迸发出耀眼的火花。特别是在作物生长管理方面,AIGC有望彻底改变传…...
yolov8蒸馏(附代码-免费)
首先蒸馏是什么? 模型蒸馏(Model Distillation)是一种用于在计算机视觉中提高模型性能和效率的技术。在模型蒸馏中,通常存在两个模型,即“教师模型”和“学生模型”。 为什么需要蒸馏? 在不增加模型计算…...
Flink-StarRocks详解:第五部分查询数据湖(第55天)
系列文章目录 4.查询数据湖 4.1 Catalog 4.1.1 概述 4.1.1.1 基本概念 4.1.1.2 Catalog 4.1.1.3 访问Catalog 4.1.2 Default catalog 4.1.3 External Catalog 4.2 文件外部表 4.2.1 使用限制 4.2.2 开源版本语法 4.2.3 阿里云版本 5. 查询及优化 文章目录 系列文章目录前言4.查…...
【MySQL】常用数据类型
目录 数据类型 数据类型分类 数值类型 tinyint类型 bit类型 小数类型 float decimal 字符串类型 char varchar 日期和时间类型 enum和set 数据类型 数据类型分类 数值类型 tinyint类型 tinyint类型只占用一个字节类似于编程语言中的字符char。有带符号和无符号两…...
创建第一个rust tauri项目
安装nodejs curl -sL https://deb.nodesource.com/setup_20.x | sudo bash node -vproxychains4 npm create tauri-applatest✔ Project name tauri-app ✔ Choose which language to use for your frontend TypeScript / JavaScript - (pnpm, yarn, npm, bun) ✔ Choose yo…...
【课程总结】day19(中):Transformer架构及注意力机制了解
前言 本章内容,我们将从注意力的基础概念入手,结合Transformer架构,由宏观理解其运行流程,然后逐步深入了解多头注意力、多头掩码注意力、融合注意力等概念及作用。 注意力机制(Attension) 背景 深度学…...
4.4 标准正交基和格拉姆-施密特正交化
本节的两个目标就是为什么和怎么做(why and how)。首先是知道为什么正交性很好:因为它们的点积为零; A T A A^TA ATA 是对角矩阵;在求 x ^ \boldsymbol{\hat x} x^ 和 p A x ^ \boldsymbol pA\boldsymbol{\hat x} pAx^ 时也会很简单。第二…...
spring事务的8种失效的场景,7种传播行为
Spring事务大部分都是通过AOP实现的,所以事务失效的场景大部分都是因为AOP失效,AOP基于动态代理实现的 1.方法没有被public修饰 原因:Spring会为方法创建代理、AOP添加事务通知前提条件是该方法时public的。 2.类没有被Spring容器所托管 …...
进程的虚拟内存地址(C++程序的内存分区)
严谨的说法: 一个C、C程序实际就是一个进程,那么C的内存分区,实际上就是一个进程的内存分区,这样的话就可以分为两个大模块,从上往下,也就是0地址一直往下,假如是x86的32位Linux系统,…...
英特尔移除超线程与AMD多线程性能对比
#### 英特尔Lunar Lake架构取消超线程 在英特尔宣布Lunar Lake架构时,一个令人惊讶的消息是下一代轻薄优化架构将移除Hyper-Threading(超线程,简称SMT)。而AMD最新的Zen 5/Zen5C多线程基准测试结果显示,该特性依然为A…...
定期自动巡检,及时发现机房运维管理中的潜在问题
随着信息化技术的迅猛发展,机房作为企业数据处理与存储的核心场所,其运维管理的复杂性和挑战性也与日俱增。为确保机房设备的稳定运行和业务的连续性,运维团队必须定期进行全面的巡检。然而,传统的手工巡检方式不仅效率低下&#…...
八股文(一)
1. 为什么不使用本地缓存,而使用Redis? Redis相比于本地缓存(如JVM中的缓存)有以下几个显著优势: 高性能与低延迟:Redis是一个基于内存的数据库,其读写性能非常高,通常可以达到几万…...
灵茶八题 - 子数组 ^w^
灵茶八题 - 子数组 w 题目描述 给你一个长为 n n n 的数组 a a a,输出它的所有连续子数组的异或和的异或和。 例如 a [ 1 , 3 ] a[1,3] a[1,3] 有三个连续子数组 [ 1 ] , [ 3 ] , [ 1 , 3 ] [1],[3],[1,3] [1],[3],[1,3],异或和分别为 1 , 3 , …...
git clone private repo
Create personal access token Clone repo $ git clone https://<user_name>:<personal_access_tokens>github.com/<user_name>/<repo_name>.git...
vue3+ts+pinia+vant-项目搭建
1.pnpm介绍 npm和pnpm都是JavaScript的包管理工具,用于自动化安装、配置、更新和卸载npm包依赖。 pnpm节省了大量的磁盘空间并提高了安装速度:使用一个内容寻址的文件存储方式,如果多个项目使用相同的包版本,pnpm会存储单个副本…...
自动化测试概念篇
目录 一、自动化 1.1 自动化概念 1.2 自动化分类 1.3 自动化测试金字塔 二、web自动化测试 2.1 驱动 2.2 安装驱动管理 三、selenium 3.1 ⼀个简单的web自动化示例 3.2 selenium驱动浏览器的工作原理 一、自动化 1.1 自动化概念 在生活中: 自动洒水机&am…...
Mojo值的生命周期(Life of a value)详解
到目前为止,我们已经解释了 Mojo 如何允许您使用 Mojo 的所有权模型构建内存安全的高性能代码而无需手动管理内存。但是,Mojo 是为 系统编程而设计的,这通常需要对自定义数据类型进行手动内存管理。因此,Mojo 允许您根据需要执行此操作。需要明确的是,Mojo 没有引用计数器…...
java对接kimi详细说明,附完整项目
需求: 使用java封装kimi接口为http接口,并把调用kimi时的传参和返回数据,保存到mysql数据库中 自己记录一下,以做备忘。 具体步骤如下: 1.申请apiKey 访问:Moonshot AI - 开放平台使用手机号手机号验证…...
鸿蒙媒体开发【基于AVCodec能力的视频编解码】音频和视频
基于AVCodec能力的视频编解码 介绍 本实例基于AVCodec能力,提供基于视频编解码的视频播放和录制的功能。 视频播放的主要流程是将视频文件通过解封装->解码->送显/播放。视频录制的主要流程是相机采集->编码->封装成mp4文件。 播放支持的原子能力规…...
django集成pytest进行自动化单元测试实战
文章目录 一、引入pytest相关的包二、配置pytest1、将django的配置区分测试环境、开发环境和生产环境2、配置pytest 三、编写测试用例1、业务测试2、接口测试 四、进行测试 在Django项目中集成Pytest进行单元测试可以提高测试的灵活性和效率,相比于Django自带的测试…...
48天笔试训练错题——day40
目录 选择题 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 编程题 1. 发邮件 2. 最长上升子序列 选择题 1. DNS 劫持又称域名劫持,是指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回…...
LabVIEW在DCS中的优势
DCS(Distributed Control System,分布式控制系统)是一种用于工业过程控制的自动化系统。它将控制任务分散到多个控制单元中,通过网络连接和协调这些单元来实现对整个过程的监控和控制。DCS通常用于大型工业设施,如化工…...
英特尔:从硅谷创业到全球科技巨头
在科技行业,英特尔不仅是一个品牌,更是一种精神的象征。自1968年成立以来,英特尔经历了从初创企业到全球半导体产业领导者的华丽转变,其发展历程是科技创新与市场战略完美结合的典范。本文将深入探讨英特尔的发展历程,…...
生物计算与纳米技术:交汇前沿的科学领域
在当今科技迅猛发展的时代,生物计算和纳米技术作为前沿科技领域的两个重要方向,正在逐渐融合并带来深远的影响。生物计算涉及使用生物系统进行计算和数据存储,而纳米技术则关注制造极小尺度的电子器件和材料科学。本文将深入探讨这两个领域的…...
哈尔滨营销型网站建设公司/信息流优化师是干什么的
B- 树 B-树又名B树,我们把所有的数据进行折半块查找,比如一共100条数据。在30和60的地方分一下,存放30和60的节点就是根节点。30和60就是该节点的关键字,100也就是分成了3份,这个节点自动创建三个指针。这三份就是根节…...
在谷歌上做外贸网站有用吗/买卖交易网
GO “非分代的、非紧缩、写屏障、并发标记清理” 并发清理: 垃圾回收(清理过程)与用户逻辑并发执行 三色并发标记 : 标记与用户逻辑并发执行 一般常用垃圾回收方法 引用计数 这是最简单的一种垃圾回收算法,和之前提到的智能指针异曲同工。对每个对象维护…...
做彩票网站代理违法吗/引擎搜索下载
在安装过UltraISO后,通常情况下,Windows 10中会多出一个或数个“CD驱动器”盘符。对很多仅用UltraISO来把Windows镜像制作成Windows安装介质的同学来讲,这个“CD驱动器”的盘符并没有什么实际的作用。那么这期教程。我们就来讨论如何将安装过…...
网站做编辑/长沙seo网站排名优化公司
点击查看:PythonOpenCV4.5实时人脸识别系统 文件大小:11M 操作系统:Windows10旗舰版 开发工具:Python、OpenCV 开发语言:.py 简要概述:输入你要识别人的图片到数据库文件夹,运行videoCaptu…...
番禺做网站公司哪家好/最好的网站优化公司
Queries for Number of Palindromes 我们可以设 dp[l][r]dp[l][r]dp[l][r] 为 [l,r][l,r][l,r] 中 的答案。那么我们可以找到转移方程: dp[l][r]dp[l1][r]dp[l][r−1]−dp[l1][r−1]check(l,r)(判断整个[l,r]是不是回文串)dp[l][r] dp[l1][r…...
给公司做网站销售怎样啦/群排名优化软件
大佬教学~链接如下 Log4j2 漏洞风险演示与个人看法_哔哩哔哩_bilibili...