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

如何基于 Go-kit 开发 Web 应用:从接口层到业务层再到数据层

使用GoModules管理项目依赖在前面的文章中我们演示的Go例子基本都是一个简单的main函数运行一小段逻辑代码并没有涉及引l入包外代码和组织Go项目内包依赖的方法。为了在编写项目代码时能够引I入其他开发者开源的优秀工具包。因此在进行具体的项目开发之前我们有必要先介绍下G○语言的依赖包管理工具一一Go Modules .在Go Modules被正式推出之前我们一般是在工作目录下组织Go项目的开发代码。工作目录一般由3个子目录组成src项目的源代码或者外部依赖的源代码以包的形式存放于此一个目录即一个包pkg编译后产生的类库存放于此;bin编译后产生的可执行文件存放于此。我们一般通过GOPATH环境变量指定Go项目的工作目录。GOPATH默认是与GOROOT的值一致指向G○的安装目录在实际开发中可以根据项目需求指定不同的GOPATH从而隔离不同项目之间的开发空间。Go在1.11之后推出了依赖包管理工具GoModules使得开发者可以在GOPATH指定的目录外组织项目代码。使用GoModulesGo项目中无须包含工作目录中固定的3个子目录。通过go mod 命令即可创建一个新的Modulego mod init moduleName比如我们在micro-go-course 目录下创建一个新的Moudule:go mod init github.com/longjoy/micro-go-course output go: creating new go.mod: module github.com/longjoy/micro-go-course后续的输出告诉我们名为 github.com/longjoy/micro-go-course 的 Module 生成成功在 micro-g0-course目录下会生成一个go.mod的文件内容如下module github.com/longjoy/micro-go-course go 1.14go.mod 文件生成之后会被 go toolchain 掌控维护在我们执行 go run、go build、gO get、go mod等各类命令时自动修改和维护 go.mod 文件中的依赖内容。我们可以通过 Go Modules 引I入远程依赖包如 Git Hub 中开源的 Go 开发工具包。但可能会由于网络环境问题我们在拉取GitHub中的开发依赖包时有时会失败在此我推荐使用七牛云搭建的GOPROXY可以方便我们在开发中更好地拉取远程依赖包。在项目目录下执行以下命令即可配置新的GOPROXY:go env -w GOPROXYhttps://goproxy.cn,direct比如我们的项目需要引I入 gorm 依赖连接 My SQL 数据库这时可以在 micro-go-course 目录下执行如下的 go get 命令go get github.com/jinzhu/gormg0 get 命令将会使用 Git 等代码工具远程获取代码包并自动完成编译和安装到 GOPATH/bin 和GOPATH/pkg 目录下。命令执行结束后我们会发现go.mod 文件发生如下改变:module github.com/longjoy/micro-go-course go 1.14 require github.com/jinzhu/gorm v1.9.14 // indirect上述require 关键字为项目引l入版本是v1.9.14 的 gorm 依赖包该依赖包可以在开发中引l入使用。在go.mod 文件中还存在replace 和 exclude 关键字它们分别用于替换依赖模块和忽略依赖模块。除了go mod init还有go mod download和go mod tidy两个 Go Modules 常用命令。其中g0mod download 命令可以在我们手动修改go.mod 文件后手动更新项目的依赖关系go mod tidy与 go mod download 命令类似但不同的是它会移除掉 go.mod 中没被使用的 require 模块。一个基于Go-kit简单的User应用接下来我们就基于 Go-kit 框架开发一个简单的 User 应用提供用户注册、登录等 HTTP 接口项目详细代码我已经放到 GitHub 上了longjoy/micro-go-course: 拉勾教育课程源码 《Go 微服务实战 38 讲》你可以参考下。在前面的文章中我们介绍过Go-kit是一套强大的微服务开发工具集用于指导开发人员解决分布式系统开发过程中所遇到的问题帮助开发人员更专注于业务开发。Go-kit 推荐使用transport、endpoint和 service 3层结构来组织项目它们的作用分别为transport层指定项目提供服务的方式比如HTTP 或者gRPC等。endpoint层负责接收请求并返回响应。对于每一个服务接口endpoint层都使用一个抽象的Endpoint 来表示我们可以为每一个Endpoint 装饰Go-kit 提供的附加功能如日志记录、限流、熔断等。service 层提供具体的业务实现接口endpoint层中的 Endpoint 通过调用 service 层的接口方法处理请求。User应用的项目结构如下图所示由图我们可以看到User应用的项目结构分别由以下包组成:dao包提供MySQL数据层持久化能力endpoint 包负责接收请求并调用service 包中的业务接口处理请求后返回响应;redis包提供Redis数据层操作能力service 包提供主要业务实现接口transport包对外暴露项目的服务接口main应用主入口。在具体进行开发之前建议你使用 go mod 初始化项目并使用 go get引l入以下依赖包:github.com/go-kit/kitv0.10.0 // Go -k it 框架 github.com/go-redsync/redsyncv1.4.2 // Redis 分布式锁 github.com/go-sql-driver/mysqlv1.5.0 / / mysql 驱动 github.com/gomodule/redigov2.0.0incompatible // redis 客户端 github.com/gori1la/muxv1.7.4 // mux 路由 github.com/jinzhu/gormv1.9.14 / / gorm mysql orm 框架接下来我们就按照 service、endpoint、transport和 main 的顺序构建整个项目。service包中主要提供用户服务的业务接口方法。Go 中可以通过type 和interface 关键字定义接口接口代表了调用方和实现方共同遵守的协议其内定义一系列将要被实现的函数。在Go中一般使用结构体实现接口如 service 包中定义的 UserService 接口由 UserServicelmpl 结构体实现:type UserService interface { //登录接口 Login(ctx context.Context, email, password string) (*UserInfoDTo, error) //注册接口 Register(ctx context.Context, vo *RegisterUserVo)(*UserInfoDTo, error) { type UserInfoDTo struct { ID int64 json:id Username string json:username Email string json:email } type UserServiceImpl struct { userDAO dao.UserDAO } func (userService *UserServiceImpl) Login(ctx context.Context, email, password string)(*UserInfoDTo, error) { // ... } func (userService *UserServiceImpl) Register(ctx context.Context, vo *RegisterUserVo) (*UserInfoDTo, error){ // ... }在Go中我们可以为一个函数指定其唯一的接收器接收器可以为任意类型具备接收器的函数在Go中被称作方法。接收器类似面向对象语言中的this或者selIf我们可以在方法内部直接使用和修改接收器中的相关属性。接收器可以分为指针类型和指针类型在方法内部对指针类型的接收器修改将会直接反馈到原接收器而非指针类型的接收器在方法中被操作的数据为原接收器的值拷贝对其修改并不会影响到原接收器的数据。在具体使用时可以根据需要指定接收器的类型比如当接收器占用内存较大或者需要对原接收器的属性进行修改时可以使用指针类型接收器当接收器占用内存较小且方法只会读取接收器内的属性时可以采用非指针类型接收器。在上面 UserService 接口的实现中我们指定了 UserServicelmpl 接收器类型为指针类型。Go 中接口属于非侵入式设计要实现接口仅需满足以下两个条件接口中所有方法均被实现接收器添加的方法签名和接口的方法签名完全一致。在上述代码中UserServicelmpl 结构体就完全实现了UserService 接口中定义的方法因此可以说UserServicelmpl 结构体实现了 UserService 接口。在UserlnfoDTO 结构体的定义中我们还使用了 StructTag为结构体内的字段添加额外的信息。StructTag一般由一个或者多个键值对组成用来表述结构体中字段可携带的额外信息。UserlnfoDTO中 json 键类的 StructTag 说明了该字段在JSON 序列化时的名称比如 ID 在序列化时会变为 id。在endpoint包中我们需要构建 RegisterEndpoint 和 LoginEndpoint将请求转化为 UserService 接口可以处理的参数并将处理的结果封装为对应的response 结构体返回给transport 包。如下代码所示type UserEndpoints struct { RegisterEndpoint endpoint.Endpoint LoginEndpoint endpoint.Endpoint } type LoginRequest struct { Email string Password string } type LoginResponse struct { UserInfo *service.UserInfoDTO} } func MakeLoginEndpoint(userService service.UserService) endpoint.Endpoint { // ... 解析LoginRequest中的参数传递给 UserService.Login 方法处理并将处理结果封装为 LoginResponse 返回 } type RegisterRequest struct { Username string Email string Password string } type RegisterResponse struct { UserInfo *service.UserInfoDTO} } func MakeRegisterEndpoint(userService service.UserService) endpoint.Endpoint { //.... 解析RegisterRequest中的参数传递给 UserService.Register 方法处理并将处理结果封装为 RegisterResponse 返回 }Endpoint代表了一个通用的函数原型负责接收请求处理请求并返回结果。因为Endpoint的函数形式是固定的所以我们可以在外层给 Endpoint 装饰一些额外的能力比如熔断、日志、限流、负载均衡等能力这些能力在 Go-kit 框架中都有相应的Endpoint 装饰器。在transport包中我们需要将构建好的 Endpoint 通过 HTTP 或者 RPC 的方式暴露出去。如下代码所示:func MakeHttpHandler(ctx context.Context, endpoints *endpoint.UserEndpoints) http.Handler { r : mux.NewRouter() // ... 日志和错误处理相关配置 r.Methods(PosT) .Path(/register) .Handler(kithttp.NewServer( endpoints.RegisterEndpoint, decodeRegisterRequest, encodeJSONResponse, options..., )) r.Methods(posT) .Path(/login).Handler(kithttp. NewServer( endpoints.LoginEndpoint, decodeLoginRequest, encodeJSONResponse, options..., )) return r func decodeRegisterRequest(_ context.Context, r *http.Request) (interface{}, error) { //···读取 HTTP 请求体中的注册名、注册邮箱和注册密码封装为 RegisterRequest 请求体 } func decodeLoginRequest(_ context.Context, r *http.Request) (interface{}, error) { //··读取 HTTP 请求体中的登录邮箱和密码封装为LoginRequest 请求体 } func encodeJsoNResponse(ctx context.Context, w http.ResponseWriter, response interface{}) error { w.Header() .Set(Content-Type, application/json; charsetutf-8) return json.NewEncoder(w) .Encode(response) }在上述代码中我们使用muX作为HTTP请求的路由和分发器相比Go中原生态的HTTP路由包mux的路由代码可读性高、路由规则更清晰。上述代码分别将 RegisterEndpoint和 LoginEndpoint 暴露到HTTP 的/register和/login 路径下并指定对应的解码方法和编码方法。解码方法会将HTTP 请求体中的请求数据解析封装为XXXRequest结构体传给对应的Endpoint处理而编码方法会将Endpoint处理返回的XXXResponse 结构体编码为HTTP 响应返回客户端。最后是在main函数中依次组建service、endpoint 和 transport并启动Web 服务器代码如下所示:func main() var ( //服务监听端口 servicePort flag.Int(service.port, 10086, service port)) flag. Parse() ctx : context.Background() errchan : make(chan error) err : dao.InitMysql(127.0.0.1, 3306, root, root, user) if err ! nil{ log.Fatal(err) } err redis.InitRedis(127.0.0.1,6379, ) if err ! nil{ log.Fatal(err) } userService : service.MakeUserServiceImpl(dao.UserDAoImpl{}) userEndpoints : endpoint.UserEndpoints{ endpoint.MakeRegisterEndpoint(userService) , endpoint.MakeLoginEndpoint(userService) , } r : transport.MakeHttpHandler(ctx, userEndpoints) go func() { errchan - http.ListenAndserve(: strconv.Itoa(*servicePort), r) }() go func() { // 监控系统信号等待ctrc 系统信号通知服务关闭 c : make(chan os.Signal, 1) signal.Notify(c, SyScall.SIGINT, SyScall.SIGTERM) errchan - fmt.Errorf(%s, -c) }() error : -errchan log. Println(error) }在上述代码中我们依次构建了 service、endpoint和transport并在 10086 端口启动了Web 服务器最后通过监听对应的 ctrl c 系统信号关闭服务。通过上述流程我们就详细介绍完了如何基于Go-kit开发一个Web项目在配置好相应的GoModules 代理、MySQL 数据库和 Redis数据库后即可通过gorun 命令启动启动后可以通过请求相应的HTTP接口验证效果如下curI命令例子所示// 注册 curl -X POST \ http://localhost:10086/register -H content-type: application/x-www-form-urlencoded \ -d emailaoho%40mail. compasswordaohousernameaoho // 登录 curl -X POST \ http://ocalhost:10086/login \ -H content-type: application/x-www-form-urlencoded \ -d emailaoho%40mail.compasswordaoho使用gorm连接MySQL数据库在日常的业务开发中使用数据库对业务数据进行持久化操作是必不可少的。在前面的User服务中我们使用了Go中流行的gorm ORM库为服务提供MySQL数据库操作能力。gorm是采用Go实现的几乎全功能的ORM通过它我们可以将数据库中的表结构与Go中的结构体进行映射这样既提升了开发的便利性也降低了 SQL注入攻击的可能性。在使用gorm 前可以使用 Go Modules 或者 go get 引I入相应的依赖 github.com/jinzhu/gorm。gorm的使用十分简单通过gorm.Open函数即可建立一个相关数据库连接池如下代码所示package dao import ( fmt _ github.com/go-sql-driver/mysgl github.com/jinzhu/gorm log ) var db *gorm.DB func InitMysql(host, port, user, password, dbName string) (err error) { db, err gorm.Open(mysqI, fmt.Sprintf(%s :%s(%s:%s)/%s? charsetutf8parseTimeTruelocLocal, user, password, host, port, dbName)) if err ! nil{ log. Println(err) return } db.SingularTable(true) return }这里需要指定数据库地址、端口、用户、密码和数据库名等基本信息。在建立好相应数据库的连接池后即可通过面向对象的方式操作数据库中的表数据我们需要首先定义相关的表结构体如UserEntity结构体它对应数据库中的user 表type UserEntity struct { ID int64 Username string Password string Email string CreatedAt time.Time }gorm 同样支持 StructTag可以使用 StructTag 为结构体中的字段添加相应的表字段限制如指定映射表字段名称、类型等。gorm 中直接调用gorm.DB.Create 方法即可插入新的数据如下例子所示func (userDAO *UserDAOImpl) Save(user *UserEntity) error { return db.Create(user).Error }gorm 提供了丰富的查询方法基本可以实现所有的复杂查询功能如下面例子所示的使用Where 查询语句根据email查询用户信息func (userDAO *UserDAoImpl) SelectByEmail(email string)(*UserEntity, error) { user : UserEntity{} err : db.where(email ?, email).First(user).Error return user, err }小结项目开发是作为开发人员必须掌握的能力虽然Go的工程化能力不及」ava、C等老大哥”但是也提供了相当大的工程项目开发便捷性。我们主要介绍了如何进行Go项目的开发主要包含GoModules项目依赖管理基于 Go-kit开发 User Web 应用;使用gormORM库操作MySQL数据库。随着Go的快速发展和应用Go被越来越多地应用到大型项目的开发中Go的工程化经验和能力也在不断积累和提升。

相关文章:

如何基于 Go-kit 开发 Web 应用:从接口层到业务层再到数据层

使用GoModules管理项目依赖 在前面的文章中,我们演示的Go例子基本都是一个简单的main函数,运行一小段逻辑代码,并没有涉及引l入包外代码和组织Go项目内包依赖的方法。为了在编写项目代码时,能够引I入其他开发者开源的优秀工具包。…...

OpenClaw多模型切换:Qwen3.5-4B-Claude与本地小模型协同工作方案

OpenClaw多模型切换:Qwen3.5-4B-Claude与本地小模型协同工作方案 1. 为什么需要多模型协同工作? 去年我在尝试用OpenClaw自动化处理日常工作时,发现一个有趣的现象:当我用同一个大模型处理所有任务时,Token消耗就像漏…...

微信小程序二进制包逆向工程工具unwxapkg架构深度解析

微信小程序二进制包逆向工程工具unwxapkg架构深度解析 【免费下载链接】unwxapkg WeChat applet .wxapkg decoding tool 项目地址: https://gitcode.com/gh_mirrors/un/unwxapkg 微信小程序作为移动端轻量化应用的代表,其封闭的.wxapkg格式长期阻碍着开发者进…...

零基础搭建Qwen3-Embedding-4B向量服务:SGlang部署实战指南

零基础搭建Qwen3-Embedding-4B向量服务:SGlang部署实战指南 1. Qwen3-Embedding-4B模型简介 1.1 模型核心能力 Qwen3-Embedding-4B是阿里通义千问团队推出的新一代文本嵌入模型,专为高效生成高质量文本向量而设计。作为Qwen3系列的重要成员&#xff0…...

ESP32S3 变身网络魔术师:从零打造你的专属 Wi-Fi 共享神器

1. 为什么你需要一个ESP32S3 Wi-Fi共享神器? 想象一下这样的场景:你正在郊外露营,手机信号时断时续,但营地有个公共Wi-Fi只能单设备连接;或者你在酒店房间,Wi-Fi需要网页认证但你的智能音箱死活连不上网&am…...

用docker安装测试crate数据库

官方网站:https://crate.io ,存储库:https://github.com/crate/crate 拉取镜像 aaakylin-pc:~/桌面$ sudo docker pull docker.1ms.run/crate/crate 输入密码 Using default tag: latest Error response from daemon: no matching…...

PPTist:提升演示文稿制作效率的三大核心功能解析

PPTist:提升演示文稿制作效率的三大核心功能解析 【免费下载链接】PPTist 基于 Vue3.x TypeScript 的在线演示文稿(幻灯片)应用,还原了大部分 Office PowerPoint 常用功能,实现在线PPT的编辑、演示。支持导出PPT文件。…...

掌握这7个技巧,让PDF处理效率提升300%

掌握这7个技巧,让PDF处理效率提升300% 【免费下载链接】PDFPatcher PDF补丁丁——PDF工具箱,可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档,探查文档结构,提取图片、转成图片等等 项目地址: https://gitcode.com/GitHu…...

Nanbeige4.1-3B多场景落地指南:代码生成/创意写作/技术问答/智能体开发四合一实践

Nanbeige4.1-3B多场景落地指南:代码生成/创意写作/技术问答/智能体开发四合一实践 你是不是也遇到过这样的问题:想找一个开源的AI模型来帮忙写代码、回答技术问题,或者开发个智能小助手,结果发现要么模型太大跑不动,要…...

如何用Bypass Paywalls Clean工具突破150+网站的付费墙限制?

如何用Bypass Paywalls Clean工具突破150网站的付费墙限制? 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在信息获取日益重要的今天,你是否曾遇到过这样的困…...

老式糖果厂里那套手动包装设备早该升级了!今天带大家看看用西门子S7-200PLC+MCGS组态搞的糖果包装线,主打一个“甜过初恋“的自动化体验

西门子S7-200PLC和MCGS组态糖果包装控制系统71#先上硬货,包装线核心逻辑就三条: 称重模块到位信号触发糖纸卷材定位校准热封温度PID控制 S7-200的程序里藏着个骚操作——用高速计数器HSC0抓传送带编码器脉冲。看这段梯形图: Network 1 LD SM0…...

无刷直流电机无霍尔传感器Simulink模型

无刷直流电机无霍尔传感器simulink模型无刷直流电机甩掉霍尔传感器这事儿最近越来越常见了。传统方案在电机里塞几个霍尔元件检测转子位置,虽然简单直接,但遇到高温、震动这些工况就容易翻车。今天咱们直接在Simulink里搞个无霍尔方案,重点看…...

前端最 “丑“ 的 UI 组件,Chrome 痛下杀手!

在前端世界里,有一个长期被吐槽却又不得不忍受的存在——滚动条。它无处不在,却几乎无法优雅定制。想改颜色?只能写一堆 ::-webkit-scrollbar 私有前缀。想跨浏览器一致?基本没戏。但现在,这个问题终于解决了。scrollb…...

DeepSeek 三大版本怎么选?从智能客服到代码生成,手把手教你匹配业务需求

DeepSeek三大版本实战选型指南:从智能客服到边缘计算的精准匹配 在AI技术快速迭代的今天,选择合适的模型版本往往比模型本身更重要。DeepSeek作为当前最受关注的开源大模型系列,其基础版、满血版和蒸馏版分别针对不同场景进行了深度优化。本文…...

Llama-3.2V-11B-cot企业落地实践:电商商品图智能分析实战案例

Llama-3.2V-11B-cot企业落地实践:电商商品图智能分析实战案例 1. 项目背景与价值 在电商行业,每天需要处理海量商品图片的审核、分类和标注工作。传统人工审核方式不仅效率低下,还容易因主观因素导致标准不一致。Llama-3.2V-11B-cot作为支持…...

APF SAPF的重复控制策略:pi+双环重复控制

APF SAPF重复控制重复控制重复控制 pi重复控制双环 可提供部分指导电力滤波器的控制策略这两年越来越卷了,特别是APF(有源电力滤波器)和SAPF(并联型有源电力滤波器)这对兄弟。今天咱们就扒一扒重复控制这个老演员是…...

虚拟同步发电机(VSG)单电流环控制,生成电流源信号,以电流幅值作为给定,最终形成单电流环控制...

虚拟同步发电机(VSG)单电流环控制,生成电流源信号,以电流幅值作为给定,最终形成单电流环控制,中点电位平衡控制,SPWM调制。 1.VSG电流环控制 2.中点电位平衡控制,SPWM调制 3.提供相关…...

RTL8812AU无线网卡驱动进阶配置指南:从安装到性能优化的完整解决方案

RTL8812AU无线网卡驱动进阶配置指南:从安装到性能优化的完整解决方案 【免费下载链接】rtl8812au RTL8812AU/21AU and RTL8814AU driver with monitor mode and frame injection 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8812au 一、认识RTL8812AU驱…...

别再只加依赖了!Spring Boot Actuator 端点 404?检查这3个配置项(以/prometheus为例)

Spring Boot Actuator端点404问题深度排查指南:从依赖到访问的全链路分析 当你兴奋地在Spring Boot项目中添加了Micrometer和Prometheus的依赖,准备大展身手时,却发现访问/actuator/prometheus端点时只得到一个冷冰冰的404错误页面。这种挫败…...

咱们今天聊点硬核的——如何从流体仿真一路杀到声场计算。射流噪声这玩意儿在航空发动机和工业排气里都是个磨人的小妖精,直接上操作流程

射流气动噪声近场远场计算(3节) 包括 fluent流场求解导出Lms近场声辐射计算Lms远场声辐射计算 可以解决:射流仿真基本步骤,四极子声源导出设置等问题,可以绘制各阶频率下的声压云图,噪声频谱图等。先…...

家庭实验室方案:树莓派5部署OpenClaw轻量版+百川2-13B量化模型

家庭实验室方案:树莓派5部署OpenClaw轻量版百川2-13B量化模型 1. 为什么选择树莓派OpenClaw组合 去年冬天,当我试图用旧笔记本搭建家庭自动化控制中心时,持续运转的风扇噪音和30W的待机功耗让我开始寻找更优雅的解决方案。直到在树莓派5上成…...

ofa_image-caption商业应用:跨境电商平台商品图英文描述批量生成

ofa_image-caption商业应用:跨境电商平台商品图英文描述批量生成 1. 项目背景与价值 跨境电商卖家每天面临一个共同挑战:需要为大量商品图片编写专业的英文描述。传统人工编写方式效率低下,成本高昂,且难以保证描述的一致性和专…...

告别Arcmap导出烦恼:手把手教你用Photoshop拼接多数据框透明PNG

告别Arcmap导出烦恼:手把手教你用Photoshop拼接多数据框透明PNG 在地图制作过程中,我们经常遇到这样的困扰:精心设计的多数据框地图在Arcmap中显示完美,但导出为透明PNG后却出现各种显示异常。特别是当我们需要在学术论文或报告中…...

OpenTherm嵌入式协议栈:HVAC系统电流环通信实现

1. OpenTherm Library 深度技术解析:面向HVAC系统的嵌入式通信协议栈实现OpenTherm Library(barbieri.pro)是一个专为暖通空调(HVAC)系统设计的轻量级、高可靠性的嵌入式通信协议栈,其核心目标是在资源受限…...

【3维度优化】Win11Debloat让Windows系统性能提升60%的实战指南

【3维度优化】Win11Debloat让Windows系统性能提升60%的实战指南 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其他更改以简化和改善…...

终极指南:如何免费将3D视频转换成2D格式,享受沉浸式观影体验

终极指南:如何免费将3D视频转换成2D格式,享受沉浸式观影体验 【免费下载链接】VR-reversal VR-Reversal - Player for conversion of 3D video to 2D with optional saving of head tracking data and rendering out of 2D copies. 项目地址: https://…...

3步解锁B站缓存视频:m4s-converter让你永久珍藏心爱内容

3步解锁B站缓存视频:m4s-converter让你永久珍藏心爱内容 【免费下载链接】m4s-converter 将bilibili缓存的m4s转成mp4(读PC端缓存目录) 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾遇到过这样的情况:在B站收藏了无数精彩…...

FPGA时序优化实战:如何用IDELAY精准调节RGMII接口的时钟与数据对齐

FPGA时序优化实战:RGMII接口时钟与数据对齐的IDELAY精密调节技术 在千兆以太网硬件设计中,RGMII接口的时序对齐一直是工程师面临的典型挑战。当PCB走线长度差异导致建立时间和保持时间违例时,Xilinx UltraScale架构提供的IDELAY功能成为解决问…...

3步实现自然语言控制机器人:ROS-LLM从入门到实践指南

3步实现自然语言控制机器人:ROS-LLM从入门到实践指南 【免费下载链接】ROS-LLM ROS-LLM is a framework designed for embodied intelligence applications in ROS. It allows natural language interactions and leverages Large Language Models (LLMs) for decis…...

为什么Hunyuan模型部署总失败?GPU适配问题实战解析

为什么Hunyuan模型部署总失败?GPU适配问题实战解析 1. 问题背景:部署失败的常见现象 最近很多开发者在部署腾讯混元的HY-MT1.5-1.8B翻译模型时遇到了各种问题,特别是GPU相关的适配问题。你可能也遇到过这样的情况: 模型加载到一…...