Go的Gin比java的Springboot更加的开箱即用?

前言

隔壁组的云计算零零后女同事,后文简称 云女士 ,非说 Go 的 Gin 框架比 Springboot 更加的开箱即用,我心想在 Java 里面 Springboot 已经打遍天下无敌手,这份底蕴岂是 Gin 能比。

但是云女士突出一个执拗,非我要 PK 一把, PK 内容就是她使用 Gin,而我使用 Springboot 快速搭建一个简单的 Crud 工程,最后让其他同事来评判哪个更开箱即用。我毫不犹豫就答应了,作为搭建 Springboot 学习工程的资深 Crud 选手,咱这份底气还是有的。

云女士选择使用 Gin + Gorm 来搭建,而我原本想选择 Springboot + MyBatis,后面转念一想,这 MyBatis 要写 XML 文件,指不定就因为这个被云女士嘲笑了,所以我把 MyBatis 替换为了 MyBatis-Plus,这就足够的简洁了吧。

正文

准备事项

既然是 Crud 工程,自然要准备好操作的表,我和云女士通过如下语句在各自的数据库中创建好了如下两张表。

CREATE TABLE people (id INT(11) PRIMARY KEY AUTO_INCREMENT,p_name VARCHAR(255) NOT NULL,p_age INT(11) NOT NULL
)CREATE TABLE book (id INT(11) PRIMARY KEY AUTO_INCREMENT,b_name VARCHAR(255) NOT NULL,b_price FLOAT NOT NULL
)

Gin快速搭建Crud工程

云女士的工程结构如下所示。

Gin目录结构

云女士的 go.mod 文件内容如下所示。

module gobasego 1.17require (github.com/gin-gonic/gin v1.6.0github.com/jinzhu/gorm v1.9.16github.com/sirupsen/logrus v1.9.3github.com/spf13/cast v1.5.1
)

云女士定义了两个结构体作为模型( Model ),book.go 文件内容如下所示。

package modelconst (BookTableName = "book"
)type Book struct {ID int64 `gorm:"column:id"`BookName string `gorm:"column:b_name"`BookPrice float64 `gorm:"column:b_price"`
}func (b *Book) TableName() string {return BookTableName
}

people.go 文件内容如下所示。

package modelconst (PeopleTableName = "people"
)type People struct {ID int64 `gorm:"column:id"`PeopleName string `gorm:"column:p_name"`PeopleAge int64 `gorm:"column:p_age"`
}func (p *People) TableName() string {return PeopleTableName
}

云女士补充道,TableName()方法是为模型指定对应的表名。

云女士为 book 表和 people 表分别定义了 Dao 接口,dao.go 文件内容如下所示。

package daoimport "gobase/model"type BookDao interface {AddBook(book *model.Book) errorUpdateBook(book *model.Book) errorDeleteBook(book *model.Book) errorListBookById(id uint) (*model.Book, error)
}type PeopleDao interface {AddPeople(book *model.People) errorUpdatePeople(book *model.People) errorDeletePeople(book *model.People) errorListPeopleById(id uint) (*model.People, error)
}

BookDao 接口对应的实现在book_dao_impl.go文件中,实现如下。

package daoimport ("github.com/jinzhu/gorm""gobase/model"
)type BookDaoImpl struct {DB *gorm.DB
}func (b *BookDaoImpl) AddBook(book *model.Book) error {if createResult := b.DB.Create(book); createResult.Error != nil {return createResult.Error}return nil
}func (b *BookDaoImpl) UpdateBook(book *model.Book) error {if saveResult := b.DB.Save(book); saveResult.Error != nil {return saveResult.Error}return nil
}func (b *BookDaoImpl) DeleteBook(book *model.Book) error {if deleteResult := b.DB.Delete(book); deleteResult.Error != nil {return deleteResult.Error}return nil
}func (b *BookDaoImpl) ListBookById(id uint) (*model.Book, error) {var book model.Bookif listResult := b.DB.Where("id = ?", id).First(&book); listResult.Error != nil {return nil, listResult.Error}return &book, nil
}

PeopleDao 接口对应的实现在people_dao_impl.go文件中,实现如下。

package daoimport ("github.com/jinzhu/gorm""gobase/model"
)type PeopleDaoImpl struct {DB *gorm.DB
}func (b *PeopleDaoImpl) AddPeople(people *model.People) error {if createResult := b.DB.Create(people); createResult.Error != nil {return createResult.Error}return nil
}func (b *PeopleDaoImpl) UpdatePeople(people *model.People) error {if saveResult := b.DB.Save(people); saveResult.Error != nil {return saveResult.Error}return nil
}func (b *PeopleDaoImpl) DeletePeople(people *model.People) error {if deleteResult := b.DB.Delete(people); deleteResult.Error != nil {return deleteResult.Error}return nil
}func (b *PeopleDaoImpl) ListPeopleById(id uint) (*model.People, error) {var people model.Peopleif listResult := b.DB.Where("id = ?", id).First(&people); listResult.Error != nil {return nil, listResult.Error}return &people, nil
}

要操作数据库,肯定需要数据库连接,云女士将数据库连接的管理实现在了mysql_connection_pool.go文件中,内容如下所示。

package mysqlimport ("fmt""github.com/jinzhu/gorm""gobase/dao""log""time"
)const (UserName     = "root"PassWord     = "root"Host         = "192.168.101.8"Port         = 3306Database     = "gotest"MaxLifetime  = 60 * time.SecondMaxIdletime  = 30 * time.SecondMaxOpenconns = 6MaxIdleconns = 2Dialect      = "mysql"
)type DataSouce struct {db      *gorm.DB
}func NewDataSource() *DataSouce {var db *gorm.DBdsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Asia%%2FShanghai",UserName, PassWord, Host, Port, Database)db, err := gorm.Open(Dialect, dsn)if err != nil {log.Fatal(err.Error())}db.DB().SetConnMaxLifetime(MaxLifetime)db.DB().SetConnMaxIdleTime(MaxIdletime)db.DB().SetMaxOpenConns(MaxOpenconns)db.DB().SetMaxOpenConns(MaxIdleconns)return &DataSouce{db: db,}
}// BookDao 操作book表
func (d *DataSouce) BookDao() dao.BookDao {return &dao.BookDaoImpl{DB: d.db,}
}// PeopleDao 操作people表
func (d *DataSouce) PeopleDao() dao.PeopleDao {return &dao.PeopleDaoImpl{DB: d.db,}
}

云女士将路由写在了webservice.go文件中,内容如下。

package adapterimport ("github.com/gin-gonic/gin""gobase/mysql"
)func Init() error {dataSouce := mysql.NewDataSource()bookController := NewBookController(dataSouce)propleController := NewPropleController(dataSouce)engine := gin.Default()routerGroupBook := engine.Group("/book")routerGroupBook.POST("/add", bookController.AddBook)routerGroupBook.POST("/update", bookController.UpdateBook)routerGroupBook.POST("/delete", bookController.DeleteBook)routerGroupBook.POST("/list", bookController.ListBookById)routerGroupPeople := engine.Group("/people")routerGroupPeople.POST("/add", propleController.AddPeople)routerGroupPeople.POST("/update", propleController.UpdatePeople)routerGroupPeople.POST("/delete", propleController.DeletePeople)routerGroupPeople.POST("/list", propleController.ListPeopleById)return engine.Run()
}

其实除了绑定路由,云女士还在Init()函数中进行了简单的服务注入,也就是创建数据库连接池,然后将数据库连接池给到对应的 web 服务。

云女士将操作 book 表对应的 web 服务写在了book_controller.go文件中,其实现如下所示。

package adapterimport ("github.com/gin-gonic/gin""github.com/sirupsen/logrus""github.com/spf13/cast""gobase/model""gobase/mysql""net/http"
)type BookController struct {dataSource *mysql.DataSouce
}func NewBookController(dataSource *mysql.DataSouce) BookController {return BookController{dataSource: dataSource,}
}func (b *BookController) AddBook(ctx *gin.Context) {var book model.Bookif err := ctx.ShouldBind(&book); err != nil {logrus.Error("读取Book信息失败")ctx.JSON(http.StatusInternalServerError, gin.H{"message": "failed",})return}bookDao := b.dataSource.BookDao()err := bookDao.AddBook(&book)if err != nil {logrus.Error("添加Book失败", err)ctx.JSON(http.StatusInternalServerError, gin.H{"message": "failed",})return}ctx.JSON(http.StatusOK, gin.H{"message": "success",})
}func (b *BookController) UpdateBook(ctx *gin.Context) {var book model.Bookif err := ctx.ShouldBind(&book); err != nil {logrus.Error("读取Book信息失败")ctx.JSON(http.StatusInternalServerError, gin.H{"message": "failed",})return}bookDao := b.dataSource.BookDao()err := bookDao.UpdateBook(&book)if err != nil {logrus.Error("更新Book失败", err)ctx.JSON(http.StatusInternalServerError, gin.H{"message": "failed",})return}ctx.JSON(http.StatusOK, gin.H{"message": "success",})
}func (b *BookController) DeleteBook(ctx *gin.Context) {var book model.Bookif err := ctx.ShouldBind(&book); err != nil {logrus.Error("读取Book信息失败")ctx.JSON(http.StatusInternalServerError, gin.H{"message": "failed",})return}bookDao := b.dataSource.BookDao()err := bookDao.DeleteBook(&book)if err != nil {logrus.Error("删除Book失败", err)ctx.JSON(http.StatusInternalServerError, gin.H{"message": "failed",})return}ctx.JSON(http.StatusOK, gin.H{"message": "success",})
}func (b *BookController) ListBookById(ctx *gin.Context) {id := cast.ToUint(ctx.Query("id"))bookDao := b.dataSource.BookDao()book, err := bookDao.ListBookById(id)if err != nil {logrus.Error("查询Book失败", err)ctx.JSON(http.StatusInternalServerError, gin.H{"message": "failed",})return}ctx.JSON(http.StatusOK, book)
}

云女士将操作 people 表对应的 web 服务写在了people_controller.go文件中,其实现如下所示。

package adapterimport ("github.com/gin-gonic/gin""github.com/sirupsen/logrus""github.com/spf13/cast""gobase/model""gobase/mysql""net/http"
)type PeopleController struct {dataSource *mysql.DataSouce
}func NewPropleController(dataSource *mysql.DataSouce) PeopleController {return PeopleController{dataSource: dataSource,}
}func (p *PeopleController) AddPeople(ctx *gin.Context) {var people model.Peopleif err := ctx.ShouldBind(&people); err != nil {logrus.Error("读取People信息失败")ctx.JSON(http.StatusInternalServerError, gin.H{"message": "failed",})return}peopleDao := p.dataSource.PeopleDao()err := peopleDao.AddPeople(&people)if err != nil {logrus.Error("添加People失败", err)ctx.JSON(http.StatusInternalServerError, gin.H{"message": "failed",})return}ctx.JSON(http.StatusOK, gin.H{"message": "success",})
}func (p *PeopleController) UpdatePeople(ctx *gin.Context) {var people model.Peopleif err := ctx.ShouldBind(&people); err != nil {logrus.Error("读取People信息失败")ctx.JSON(http.StatusInternalServerError, gin.H{"message": "failed",})return}peopleDao := p.dataSource.PeopleDao()err := peopleDao.UpdatePeople(&people)if err != nil {logrus.Error("更新People失败", err)ctx.JSON(http.StatusInternalServerError, gin.H{"message": "failed",})return}ctx.JSON(http.StatusOK, gin.H{"message": "success",})
}func (p *PeopleController) DeletePeople(ctx *gin.Context) {var people model.Peopleif err := ctx.ShouldBind(&people); err != nil {logrus.Error("读取People信息失败")ctx.JSON(http.StatusInternalServerError, gin.H{"message": "failed",})return}peopleDao := p.dataSource.PeopleDao()err := peopleDao.DeletePeople(&people)if err != nil {logrus.Error("删除People失败", err)ctx.JSON(http.StatusInternalServerError, gin.H{"message": "failed",})return}ctx.JSON(http.StatusOK, gin.H{"message": "success",})
}func (p *PeopleController) ListPeopleById(ctx *gin.Context) {id := cast.ToUint(ctx.Query("id"))peopleDao := p.dataSource.PeopleDao()people, err := peopleDao.ListPeopleById(id)if err != nil {logrus.Error("查询People失败", err)ctx.JSON(http.StatusInternalServerError, gin.H{"message": "failed",})return}ctx.JSON(http.StatusOK, people)
}

最后,云女士简单的展示了一下对 book 表和 prople 表的 Crud 操作。

book 表和 people 表的增删改成功时返回内容如下所示。

Gin-增删改成功

book 表和 people 表的查询成功时返回内容如下所示。

Gin-查询图书

Gin-查询人物

Spring boot 快速搭建Crud工程

Spring Boot 基础就不介绍了

云女士基于 Gin 和 Gorm 搭建的 Crud 工程,我看完后内心扑哧一笑:不过如此。

那现在该轮到我表演了。首先给出整个工程结构图如下所示。

Springboot目录结构

POM 文件内容如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.1</version></parent><groupId>com.lee.javabase</groupId><artifactId>javabase</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies></project>

同样,定义 book 表和 people 表对应的实体类 Book 和 People,如下所示。

@Getter
@Setter
public class Book {@TableField("id")private int id;@TableField("b_name")private String bookName;@TableField("b_price")private float bookPrice;}@Getter
@Setter
public class People {@TableField("id")private int id;@TableField("p_name")private String peopleName;@TableField("p_age")private int peopleAge;}

然后定义定义接口,如下所示。

@Mapper
public interface BookMapper extends BaseMapper<Book> {
}@Mapper
public interface PeopleMapper extends BaseMapper<People> {
}

最后是对应的 Controller 实现, BookController 实现如下。

@Slf4j
@RestController
@RequestMapping("/book")
public class BookController {@Autowiredprivate BookMapper bookMapper;@PostMapping("/add")public ResponseEntity<String> addBook(@RequestBody Book book) {try {bookMapper.insert(book);return new ResponseEntity<>("添加图书成功", HttpStatus.OK);} catch (Exception e) {log.error("添加图书失败", e);return new ResponseEntity<>("添加图书失败", HttpStatus.INTERNAL_SERVER_ERROR);}}@PostMapping("/update")public ResponseEntity<String> updateBook(@RequestBody Book book) {try {bookMapper.updateById(book);return new ResponseEntity<>("更新图书成功", HttpStatus.OK);} catch (Exception e) {log.error("更新图书失败", e);return new ResponseEntity<>("更新图书失败", HttpStatus.INTERNAL_SERVER_ERROR);}}@PostMapping("/delete")public ResponseEntity<String> deleteBook(@RequestParam("id") int id) {try {bookMapper.deleteById(id);return new ResponseEntity<>("删除图书成功", HttpStatus.OK);} catch (Exception e) {log.error("删除图书失败", e);return new ResponseEntity<>("删除图书失败", HttpStatus.INTERNAL_SERVER_ERROR);}}@PostMapping("/list")public ResponseEntity<Book> listBook(@RequestParam("id") int id) {try {Book book = bookMapper.selectById(id);return new ResponseEntity<>(book, HttpStatus.OK);} catch (Exception e) {log.error("查询图书失败", e);return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);}}
}

PeopleController 实现如下所示。

@Slf4j
@RestController
@RequestMapping("/people")
public class PeopleController {@Autowiredprivate PeopleMapper peopleMapper;@PostMapping("/add")public ResponseEntity<String> addPeople(@RequestBody People people) {try {peopleMapper.insert(people);return new ResponseEntity<>("添加人物成功", HttpStatus.OK);} catch (Exception e) {log.error("添加人物失败", e);return new ResponseEntity<>("添加人物失败", HttpStatus.INTERNAL_SERVER_ERROR);}}@PostMapping("/update")public ResponseEntity<String> updatePeople(@RequestBody People people) {try {peopleMapper.updateById(people);return new ResponseEntity<>("更新人物成功", HttpStatus.OK);} catch (Exception e) {log.error("更新人物失败", e);return new ResponseEntity<>("更新人物失败", HttpStatus.INTERNAL_SERVER_ERROR);}}@PostMapping("/delete")public ResponseEntity<String> deletePeople(@RequestParam("id") int id) {try {peopleMapper.deleteById(id);return new ResponseEntity<>("删除人物成功", HttpStatus.OK);} catch (Exception e) {log.error("删除人物失败", e);return new ResponseEntity<>("删除人物失败", HttpStatus.INTERNAL_SERVER_ERROR);}}@PostMapping("/list")public ResponseEntity<People> listPeople(@RequestParam("id") int id) {try {People people = peopleMapper.selectById(id);return new ResponseEntity<>(people, HttpStatus.OK);} catch (Exception e) {log.error("查询人物失败", e);return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);}}
}

启动应用程序, book 表的 Crud 操作结果如下所示。

prople 表的 Crud 操作结果如下所示。

总结

我宣布,Springboot 就是快速搭建 Crud 工程的

其实,在基于 Gin 和 Gorm 搭建 Crud 工程时,云女士还是写得复杂了一点,但是我有幸看过她们云平台的项目的代码,云女士写得也没毛病,虽然是个简化版,但也是严格遵从她们项目的代码结构来实现的。

说回 Springboot,毫无疑问,无论是天然自带 Tomcat 或 Jetty ,还是和三方框架整合的各种 Starter 包,Springboot 都将开箱即用做到了极致,但是转念又一想,其实 Springboot 和 Gin 严格来说做比较没啥意义,就像 Java 和 Go 的比较一样,我觉得也没啥意义,各自的优势区间不一样,并且各自也都在相关的领域叱咤风云。

各位看官,你们觉得呢。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神经网络中的过拟合问题及其解决方案

目录 ​编辑 过拟合的定义与影响 过拟合的成因 1. 模型复杂度过高 2. 训练数据不足 3. 训练时间过长 4. 数据特征过多 解决方案 1. 数据增强 2. 正则化 3. Dropout 4. 提前停止 5. 减少模型复杂度 6. 集成学习 7. 交叉验证 8. 增加数据量 9. 特征选择 10. 使…

Pull down筛靶策略丨筛选药物与潜在靶蛋白之间相互作用的体外技术

小分子药靶筛选的Pull down实验是一种有效的筛选药物与潜在靶蛋白之间相互作用的体外技术。利用生物分子之间的亲和力原理&#xff0c;将生物素标记的小分子化合物固定在链霉亲和素的磁珠上&#xff0c;与蛋白裂解液进行孵育&#xff0c;孵育结束后与小分子结合的蛋白可以通过质…

文件上传下载性能优化

客户端与服务器之间数据交换的效率取决于文件传输的性能。通过数据压缩和断点续传可以实现文件传输和网络请求中的性能优化。这两种方式可以减少宽带占用&#xff0c;提高传输效率&#xff0c;从而达到提升数据交换性能。 上传下载接口 request模块主要给应用提供上传下载文件…

通过交叉相关性在大估计误差存在的情况下进行时间延迟估计

这篇论文的主要结论包括以下几点&#xff1a; 阈值效应&#xff1a;随着后向积分信噪比&#xff08;SNR&#xff09;的降低&#xff0c;互相关器在时间延迟估计中表现出阈值效应&#xff0c;即大估计误差&#xff08;异常估计&#xff09;的概率迅速增加。这表明在低信噪比条件…

PULSE测量系统——示波器结合matlab

由上篇文章可知PULSE测量系统原理&#xff0c;以及在双传声器法传递函数中的作用。但是当没有PULSE测量系统时&#xff0c;我们应该用什么硬件设备与软件进行替换呢&#xff1f; 示波器与MATLAB的功能对比 示波器的作用&#xff1a; 与传声器连接&#xff0c;用于实时显示传声器…

Certimate自动化SSL证书部署至IIS服务器

前言&#xff1a;笔者上一篇内容已经部署好了Certimate开源系统&#xff0c;于是开始搭建部署至Linux和Windows服务器&#xff0c;Linux服务器十分的顺利&#xff0c;申请证书-部署证书很快的完成了&#xff0c;但是部署至Windows Server的IIS服务时&#xff0c;遇到一些阻碍&a…

PTA 输出三角形字符阵列

本题要求编写程序&#xff0c;输出n行由大写字母A开始构成的三角形字符阵列。 输入格式&#xff1a; 输入在一行中给出一个正整数n&#xff08;1≤n<7&#xff09;。 输出格式&#xff1a; 输出n行由大写字母A开始构成的三角形字符阵列。格式见输出样例&#xff0c;其中…

UnityShaderLab 实现黑白着色器效果

实现思路&#xff1a;取屏幕像素的RGB值&#xff0c;将三个通道的值相加&#xff0c;除以一个大于值使颜色值在0-1内&#xff0c;再乘上一个强度值调节黑白强度。 在URP中实现需要开启Opaque Texture ShaderGraph实现&#xff1a; ShaderLab实现&#xff1a; Shader "Bl…

开发者如何使用GCC提升开发效率 Windows下Cmake + NDK 交叉编译 Libyuv

最近在导入其他项目的libyuv库,编译时发现如下问题,刚好想做一期libyuv编译与安装到AS中的文章,故记录集成的全过程 报错如下 error: no member named ABGRToNV21 in namespace libyuv; did you mean ARGBToNV21? error: no member named UYVYToY in namespace libyuv; d…

EDI系统与业务系统集成:选择中间数据库还是REST API方案?

EDI项目中&#xff0c;对外企业可以借助专业的EDI系统&#xff0c;基于AS2、OFTP等国际通用的EDI传输协议搭建传输通道&#xff0c;并基于这些传输通道实现安全、可靠地数据传输。对内企业如何实现业务系统和EDI系统之间的数据同步呢&#xff1f; 企业可以通过中间数据库、RES…

ASP.NET Core实现鉴权授权的几个库

System.IdentityModel.Tokens.Jwt 和 Microsoft.AspNetCore.Authentication.JwtBearer 是两个常用的库&#xff0c;分别用于处理 JWT&#xff08;JSON Web Token&#xff09;相关的任务。它们在功能上有一定重叠&#xff0c;但侧重点和使用场景有所不同。 1. System.IdentityM…

No.4 笔记 探索网络安全:揭开Web世界的隐秘防线

在这个数字时代&#xff0c;网络安全无处不在。了解Web安全的基本知识&#xff0c;不仅能保护我们自己&#xff0c;也能帮助我们在技术上更进一步。让我们一起深入探索Web安全的世界&#xff0c;掌握那些必备的安全知识&#xff01; 1. 客户端与WEB应用安全 前端漏洞&#xff1…

LeetCode 热题 100_环形链表(25_141_简单_C++)(哈希表;快慢指针)

LeetCode 热题 100_环形链表&#xff08;25_141&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;哈希表&#xff09;&#xff1a;思路二&#xff08;快慢指针&#xff09;&#xff1a; 代码实现代码实现&…

GTC2024 回顾 | 优阅达携手 HubSpot 亮相上海,赋能企业数字营销与全球业务增长

从初创企业入门到成长型企业拓展&#xff0c;再到 AI 驱动智能化运营&#xff0c;HubSpot 为企业的每步成长提供了全方位支持。 2024 年 11 月下旬&#xff0c;备受瞩目的 GTC2024 全球流量大会&#xff08;上海&#xff09;成功举办。本次大会汇聚了全国内多家跨境出海领域企业…

在VSCode 的终端或虚拟环境中运行git --version 无法识别,但是在电脑上已经装了git

刚刚在我的电脑上安装了 Git&#xff0c;装完最后有个报错弹窗&#xff0c;之后在 VSCode 的终端或虚拟环境中无法识别 git&#xff0c;上网查阅了资料&#xff0c;发现通常是由于以下原因引起的: 一. Git 未添加到系统的 PATH 环境变量 问题描述 安装 Git 后&#xff0c;系…

Text2SQL(NL2sql)对话数据库:设计、实现细节与挑战

Text2SQL&#xff08;NL2sql&#xff09;对话数据库&#xff1a;设计、实现细节与挑战 前言1.何为Text2SQL&#xff08;NL2sql&#xff09;2.Text2SQL结构与挑战3.金融领域实际业务场景4.注意事项5.总结 前言 随着信息技术的迅猛发展&#xff0c;人机交互的方式也在不断演进。…

Tongweb7049M4有关SSL/TLS 服务器瞬时 Diffie-Hellman 公共密钥过弱的处理方案(by lqw)

前提条件&#xff1a;Tongweb7049M4已在http通道里配置了https&#xff08;如何配置https可以参考这个帖子&#xff1a;东方通TongWEB添加Https证书&#xff0c;开启SSL&#xff09; 遇到客户在配置了https后&#xff0c;扫描漏洞提示&#xff1a; 有关SSL/TLS 服务器瞬时 Dif…

Jenkins部署svn项目

下载 Jenkins 的安装和设置 加载插件太慢&#xff0c;更换镜像地址 http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json 安装svn插件 安装Deploy to container Plugin 工具配置jdk和maven 后端部署 源码管理添加svn地址和认证 增加构建步骤 Invoke to…

嵌入式入门Day27

IO day3 文件IO文件描述符分配过程 相关函数 作业 文件IO 文件IO&#xff1a;基于系统调用的API函数接口特点&#xff1a;每一次调用文件IO&#xff0c;系统都会从用户态到内核态之间切换&#xff0c;效率很低作用&#xff1a;后期学习进程间通信&#xff0c;管道&#xff0c;…

复现论文:PromptTA: Prompt-driven Text Adapter for Source-freeDomain Generalization

github&#xff1a;zhanghr2001/PromptTA: Source-free Domain Generalization 论文&#xff1a;[2409.14163] PromptTA: Prompt-driven Text Adapter for Source-free Domain Generalization 自己标注&#xff1a;PromptTA: Prompt-driven Text Adapter for Source-free Domai…