Golang Gin系列-5:数据模型和数据库
在这篇Gin教程的博客中,我们将探索如何将模型和数据库与Gin框架无缝集成,使你能够构建健壮且可扩展的web应用程序。通过利用流行的库并遵循最佳实践,你将学习如何定义模型、建立数据库连接、执行CRUD操作以及确保基于gin的项目中的数据完整性。
使用Gin连接数据库
Gin让事情变得轻量级和简单,但不要让它欺骗了你——它在处理数据方面非常强大。通过利用正确的数据库驱动程序和库,只需几行代码就可以连接到PostgreSQL、MySQL或SQLite等流行的数据库。最好的部分是什么?Gin允许你从一开始就配置数据库设置,这样就可以开始运行并专注于构建令人惊叹的功能,而不是纠结于复杂的设置过程。
在本指南中,我们将逐步完成整个过程,向你展示如何定义模型,连接到数据库,并执行构建坚如磐石的web应用程序所需的所有基本CRUD操作。因此,让我们深入了解并解锁Gin的真正力量!
让我们用PostgreSQL示例进行说明:
package mainimport ("github.com/gin-gonic/gin""gorm.io/driver/postgres""gorm.io/gorm"
)func main() {r := gin.Default()// Initialize PostgreSQL connectiondsn := "host=localhost user=postgres password=passw0rd dbname=northwind port=5432 sslmode=disable TimeZone=Asia/Shanghai"db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})if err != nil {panic("failed to connect database")}// Register routes and handlers// ...db.Begin()db.Commit()r.Run(":8080")
}
使用ORM和GORM
使用Gin最好的部分之一是它与强大的对象关系映射(Object-Relational Mapping, ORM)工具(如GORM)的无缝集成。这种神奇的组合消除了与数据库交互时的许多头痛问题。GORM使您能够在更高的抽象层次上工作,而不是陷入数据库管理的基本细节中。想映射一个Go结构直接到数据库表?GORM会掩护你的。需要自动处理迁移?没有问题。构建复杂的查询?GORM让它变得轻而易举。
通过为您处理所有这些低级任务,Gin和GORM的动态组合使您能够专注于应用程序逻辑的真正内容。这是一个巨大的生产力提升,并且在长期维护干净、可读的代码方面是一个真正的游戏规则改变者。相信我,一旦您体验到这种集成的强大功能,您就再也不想回到以前的做事方式。
GORM简化了CRUD操作和对象关系映射。下面是如何整合GORM和Gin:
type User struct {gorm.ModelName stringEmail string `gorm:"uniqueIndex"`
}func main() {r := gin.Default()// Initialize PostgreSQL connectiondsn := "host=localhost user=postgres password=passw0rd dbname=northwind port=5432 sslmode=disable TimeZone=Asia/Shanghai"// Initialize GORM with PostgreSQLdb, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})if err != nil {panic("failed to connect database")}// Migrate the schemadb.AutoMigrate(&User{})// Register routes and handlers// ...r.Run(":8080")
}
模型CRUD操作实现
Gin的真正优势之一是其优雅的路由系统,这使得在模型上实现那些基本的CRUD(创建、读取、更新、删除)操作变得轻而易举。通过定义一组RESTful端点,并将每个端点与相应的处理程序函数关联起来,你可以构建出管理模型数据所需的所有功能,而无需过多的麻烦。
但Gin的路由功能仅仅是个开始。由于其灵活的中间件系统,你可以轻松地添加其他功能,如身份验证、授权和输入验证。简而言之,Gin为你提供了确保数据安全并保持完整性所需的所有工具,而不会将你束缚在复杂的实现中。
这里真正的美在于所有的东西是如何无缝地结合在一起的。你可以快速设置路由、定义处理逻辑并插入必要的中间件——同时保持代码的干净、可读和可维护。这让开发者的梦想成真!
因此,无论你是在构建简单的CRUD应用程序还是具有高级数据管理需求的更复杂的系统,Gin都会负责帮你断后。凭借其强大的路由和中间件支持,你可以专注于编写出色的代码和交付杀手级功能,并知道你的数据会被妥善保管。
func main() {// Initialize Gin and GORMr.GET("/users", func(c *gin.Context) {var users []Userdb.Find(&users)c.JSON(200, users)})r.POST("/users", func(c *gin.Context) {var user Userif err := c.ShouldBindJSON(&user); err != nil {c.JSON(400, gin.H{"error": err.Error()})return}db.Create(&user)c.JSON(201, user)})// Implement other CRUD operations (GET, PUT, DELETE)// ...r.Run(":8080")
}
数据验证和序列化
验证传入数据
在构建坚如磐石的web应用程序时,数据验证绝对是至关重要的。毕竟,你最不希望看到的是垃圾数据潜入系统并导致各种各样的麻烦。幸运的是,Gin提供了强大的验证中间件实现数据验证。
这个方便的特性允许你为所有传入请求定义一组验证规则,确保进入应用程序的任何数据在处理之前符合特定标准。这就像在门口有一个保镖,阻止任何不速之客(或者在本例中是无效数据)进入。
最好的部分是什么?设置验证规则非常简单。你所要做的就是用特殊的验证标签注释你的请求结构,比如 binding:"required"
。Gin将根据这些标签自动检查传入的数据,如果有任何不符合要求的内容,它将在引起任何麻烦之前被退回。
说到内心的平静!有了Gin的验证中间件,你就可以确信应用程序只处理干净、有效的数据——不必再担心垃圾输入会导致错误、崩溃或安全漏洞。这只是Gin帮助简化开发过程并保持代码安全、可靠和可维护的另一种方式。
Gin的验证中间件简化了数据验证:
type CreateUserRequest struct {Name string `json:"name" binding:"required"`Email string `json:"email" binding:"required,email"`
}func main() {r.POST("/users", func(c *gin.Context) {var req CreateUserRequestif err := c.ShouldBindJSON(&req); err != nil {c.JSON(400, gin.H{"error": err.Error()})return}// Process valid requestc.JSON(201, gin.H{"message": "User created successfully"})})// Other routes and handlers
}
序列化和反序列化JSON数据
不必再纠结于复杂的第三方库或陷入繁琐的样板代码中。Gin的JSON处理非常简单和优雅,支持将精力集中在构建杀手级功能上,而不是为小事而烦恼。
无论你是在制作RESTful API,与外部服务集成,还是只是在客户端和服务器之间来回传递数据,Gin的JSON功能都可以满足需求。这只是这个奇妙的框架如何简化开发过程并能够以最少的麻烦构建令人惊叹的应用程序的又一个示例。
所以,如果你正在用Go语言处理JSON数据(老实说,现在谁不是呢?),一定要充分利用Gin的JSON超能力。它提升了生产力和可维护性以及开发人员的整体幸福感。
func main() {type UserResponse struct {ID uint `json:"id"`Name string `json:"name"`Email string `json:"email"`}r.GET("/users/:id", func(c *gin.Context) {var user Userif err := db.First(&user, c.Param("id")).Error; err != nil {c.JSON(404, gin.H{"error": "User not found"})return}// Serialize user datauserResp := UserResponse{ID: user.ID, Name: user.Name, Email: user.Email}c.JSON(200, userResp)})// Other routes and handlers
}
处理表格提交
在web开发中,处理表单提交是一项常见的任务,Gin通过它的“form”和“Bind”方法简化了这个过程。开发人员可以轻松地将表单数据绑定到Go struct中,从而实现无缝处理和验证。此外,Gin的中间件生态系统允许集成CSRF保护,在不增加复杂性的情况下增强应用程序安全性。
type CreateUserForm struct {Name string `form:"name" binding:"required"`Email string `form:"email" binding:"required,email"`
}func main() {r.POST("/users", func(c *gin.Context) {var form CreateUserFormif err := c.ShouldBind(&form); err != nil {c.JSON(400, gin.H{"error": err.Error()})return}// Process valid form submissionc.JSON(201, gin.H{"message": "User created successfully"})})// Other routes and handlers
}
最后总结
Gin框架与GORM相结合,为Go应用程序中的模型和数据库管理提供了强大的解决方案。通过将GORM的ORM功能无缝地集成到Gin中,开发人员可以在更高的抽象级别上工作,抽象掉低级别的数据库细节。Gin优雅的路由系统简化了CRUD操作,而其中间件生态系统可以无缝集成输入验证和CSRF保护等基本功能。理解和实现这些概念使开发人员能够以最小的努力创建可伸缩、高效和安全的web应用程序。通过参考Gin文档和GORM文档,读者可以进一步深入探索。
相关文章:
Golang Gin系列-5:数据模型和数据库
在这篇Gin教程的博客中,我们将探索如何将模型和数据库与Gin框架无缝集成,使你能够构建健壮且可扩展的web应用程序。通过利用流行的库并遵循最佳实践,你将学习如何定义模型、建立数据库连接、执行CRUD操作以及确保基于gin的项目中的数据完整性…...
Android系统开发(十九):无缝拉伸的艺术——9-Patch 可绘制对象详解
引言 在移动开发中,背景、标题以及其他界面元素的设计质量直接影响用户体验。然而,如何让图片适应不同分辨率设备,成为开发者常常头疼的问题。这时,9-Patch 闪亮登场!它不仅可以无缝拉伸,还能保持视觉效果…...
物联网网关Web服务器--CGI开发实例BMI计算
本例子通一个计算体重指数的程序来演示Web服务器CGI开发。 硬件环境:飞腾派开发板(国产E2000处理器) 软件环境:飞腾派OS(Phytium Pi OS) 硬件平台参考另一篇博客:国产化ARM平台-飞腾派开发板…...
计算机网络 (51)鉴别
前言 计算机网络鉴别是信息安全领域中的一项关键技术,主要用于验证用户或信息的真实性,以及确保信息的完整性和来源的可靠性。 一、目的与重要性 鉴别的目的是验明用户或信息的正身,对实体声称的身份进行唯一识别,以便验证其访问请…...
Mellanox ConnectX 系列网卡的双驱动架构:以太网与 InfiniBand 的协同设计
在现代数据中心和高性能计算(HPC)环境中,网络硬件的性能和功能至关重要。Mellanox ConnectX 系列网卡以其卓越的性能和多功能性而闻名,支持从传统的以太网到高性能的 InfiniBand 网络协议。这种多功能性使得 Mellanox 网卡能够满足不同应用场景的需求,从常规的数据中心网络…...
【Java】阿里环球Antom支付对接
阿里环球Antom支付对接 线上文档地址: GitHub:https://github.com/alipay/global-open-sdk-java 文档:https://global.alipay.com/docs/ac/ams_zh-cn/session_cashier maven: <!--阿里国际支付--><dependency><g…...
【vim】vim编辑器如何设置行号
vim编辑器如何设置行号 一、**临时设置行号**二、永久设置行号2.1. **用户配置文件方式(针对当前用户)**2.2. **全局配置文件方式(谨慎使用,会影响所有用户)** 在Vim中设置行号有以下两种常见的方法: 一、…...
爬虫基础之爬取某站视频
目标网址:为了1/4螺口买小米SU7,开了一个月,它值吗?_哔哩哔哩_bilibili 本案例所使用到的模块 requests (发送HTTP请求)subprocess(执行系统命令)re (正则表达式操作)json (处理JSON数据) 需求分析: 视频的名称 F12 打开开发者工具 or 右击…...
2024嵌入式系统的未来发展与技术洞察分享
时间如白驹过隙,不知不觉又是一年,这一年收获满满。接下来,将本年度对技术的感悟和洞察分析如下,希望对大家有所帮助。 在过去几十年里,嵌入式系统技术迅速发展,成为现代电子设备和智能硬件的核心组成部分。…...
[微服务]注册中心优化
环境隔离 企业实际开发中,往往会搭建多个运行环境,例如: 开发环境测试环境预发布环境生产环境 这些不同环境之间的服务和数据之间需要隔离。 还有的企业中,会开发多个项目,共享nacos集群。此时,这些项目…...
Leetcode 3426. Manhattan Distances of All Arrangements of Pieces
Leetcode 3426. Manhattan Distances of All Arrangements of Pieces 1. 解题思路2. 代码实现 题目链接:3426. Manhattan Distances of All Arrangements of Pieces 1. 解题思路 这道题很惭愧,一开始没有搞定,后来看了答案想了想ÿ…...
【重庆市乡镇界】面图层shp格式arcgis数据乡镇名称和编码wgs84坐标无偏移内容测评
标题中的“最新重庆市乡镇界面图层shp格式arcgis数据乡镇名称和编码wgs84坐标无偏移最新”指的是一个地理信息系统(GIS)的数据集,特别设计用于ArcGIS软件。这个数据集包含了重庆市所有乡镇的边界信息,以Shapefile(.shp…...
基于ChatGPT的论文写作辅助工具研究
**基于ChatGPT的论文写作辅助工具研究** **摘要**: 随着人工智能技术的飞速发展,自然语言处理(NLP)领域取得了显著进步。ChatGPT作为OpenAI最新推出的生成式预训练Transformer模型,在文本生成、对话系统等方面展现出…...
定时器setTimeout和setInterval
setTimeOut()异步 setInterval()异步...
PCL 部分点云视点问题【2025最新版】
目录 一、问题概述二、解决方案1、软件实现2、代码实现三、调整之后博客长期更新,本文最近更新时间为:2025年1月18日。 一、问题概述 针对CloudCompare软件处理过的pcd格式点云,在使用PCL进行特征点提取、配准等实验中最终显示结果出现点云位置偏差较大的问题,本博客给出解…...
Cursor 与常见集成开发环境(IDE)的优势对比
Cursor与常见集成开发环境(IDE)的优势对比 一、AI 辅助编程能力 强大的代码生成功能: Cursor: 以其内置的强大 AI 辅助编程功能为核心优势。用户可以通过输入自然语言描述,快速生成各种编程语言的代码。例如…...
TDengine 做为 FLINK 数据源技术参考手册
Apache Flink 是一款由 Apache 软件基金会支持的开源分布式流批一体化处理框架,可用于流处理、批处理、复杂事件处理、实时数据仓库构建及为机器学习提供实时数据支持等诸多大数据处理场景。与此同时,Flink 拥有丰富的连接器与各类工具,可对接…...
不重启JVM,替换掉已经加载的类
不重启JVM,替换掉已经加载的类 直接操作字节码 使用ASM框架直接操作class文件,在类中修改代码,然后retransform就可以了 下边是BTrace官方提供的一个简单例子: package com.sun.btrace.samples;import com.sun.btrace.annotati…...
axios的使用总结
一、Axios 简介 Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js。在 Vue 项目中,它主要用于发送 HTTP 请求来获取数据(如从 API 获取数据)或者提交数据(如用户登录、注册等表单数据)。 二…...
使用 F12 查看 Network 及数据格式
在浏览器中,F12 开发者工具的 “Network” 面板是用于查看网页在加载过程中发起的所有网络请求,包括 API 请求,以及查看这些请求的详细信息和响应数据的。以下以常见的 Chrome 浏览器为例,介绍如何使用 F12 控制台查看 Network 里…...
HTML<img>标签
例子 如何插入图片: <img src"img_girl.jpg" alt"Girl in a jacket" width"500" height"600"> 下面有更多“自己尝试”的示例。 定义和用法 该<img>标签用于在 HTML 页面中嵌入图像。 从技术上讲&#x…...
Android系统开发(六):从Linux到Android:模块化开发,GKI内核的硬核科普
引言: 今天我们聊聊Android生态中最“硬核”的话题:通用内核镜像(GKI)与内核模块接口(KMI)。这是内核碎片化终结者的秘密武器,解决了内核和供应商模块之间无尽的兼容性问题。为什么重要&#x…...
每日一刷——1.20——准备蓝桥杯
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目一 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数。 比如给定范围[2, 22],数字2在数2中出现了1次,在数12中出现1次,在数20中出现1次&a…...
知行合一:解决有心无力的问题,解决知易行难的问题,知行合一并不意味着事事都要合一,而是....
问题是什么? 想学习的时候,有手机阻碍我们。想戒掉手机短视频,卸载后,几天的时间,又下载了回来。制定了减肥计划,但就是不执行。明知道这样做是不对的,但依然行动不起来。 沉溺于各种各样的享…...
C++ Qt练习项目 日期时间数据 未完待续
个人学习笔记 新建项目 设计UI 实现组件功能 参考资料 4.7日期时间数据_哔哩哔哩_bilibili...
Golang学习笔记_28——工厂方法模式(实例)
Golang学习笔记_26——通道 Golang学习笔记_27——单例模式 Golang学习笔记_28——工厂方法模式 工厂方法模式(实例) package factory_method_demoimport "fmt"// Order 接口,定义订单的基本操作 type Order interface {Calculate…...
linux下springboot项目nohup日志或tomcat日志切割处理方案
目录 1. 配置流程 2. 配置说明 其他配置选项: 3. 测试执行 4. 手动执行 https://juejin.cn/post/7081890486453010469 通常情况下,我们的springboot项目部署到linux服务器中,通过nohup java -jar xxx.jar &指令来进行后台运行我们…...
SentencePiece和 WordPiece tokenization 的含义和区别
SentencePiece和 WordPiece tokenization 的含义和区别 SentencePiece 和 WordPiece 都是常用的分词(tokenization)技术,主要用于自然语言处理(NLP)中的文本预处理,尤其是在处理大规模文本数据时。它们都基于子词(subword)单元,能够将未登录词(out-of-vocabulary, O…...
视频修复最强算法 部署笔记2025
目录 模型下载: 模型: 原版保存的视频,vs code不播放: 模型下载: Release ProPainter V0.1.0 Release sczhou/ProPainter GitHub huggingface-cli download --resume-download lixiaowen/diffuEraser --local-dir /mnt/pfs/models/huggingface/models--lixiaowen--d…...
Java数据结构——优先队列
目录 引言1. 优先队列2. 优先队列的实现2.1 堆的概念2.2 堆的创建2.2.1 堆的向下调整2.3 堆的插入2.4 堆的删除 3. 总结 引言 前面一篇文章讲了二叉树,本篇将讲述数据结构中的优先队列,优先队列则需要用到完全二叉树来实现。 1. 优先队列 队列&#x…...
红外热成像之无人机载荷
电力巡检 相较于传统的人工电力巡线方式,无人机巡检能够在高空对人工难以达到或无法检测的设备进行检测,实现了电子化、信息化、智能化巡检,可以提高巡检的工作效率和应急抢险水平。 森林防火 无人机搭载红外光电系统能在森林高空进行全天候监…...
深入Spring Boot:自定义Starter开发与实践
引言 Spring Boot通过其强大的自动配置机制和丰富的Starter模块,极大地简化了Spring应用的开发过程。Starter模块封装了一组相关的依赖和配置,使得开发者可以通过简单的依赖引入,快速启用特定的功能。然而,除了使用Spring Boot提…...
MasterSAM downloadService任意文件读取(CVE-2024-55457)(附脚本)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...
【Pytest】基础到高级功能的理解使用
文章目录 第一部分:Pytest 简介1.1 什么是 Pytest?1.2 Pytest 的历史1.3 Pytest 的核心概念1.4 Pytest 的特点1.5 为什么选择 Pytest? 第二部分:Pytest 的基本使用2.1 安装 Pytest2.2 编写第一个测试用例2.2.1 创建一个简单的测试…...
【Linux系统编程】—— 从零开始实现一个简单的自定义Shell
文章目录 什么是自主shell命令行解释器?实现shell的基础认识全局变量的配置初始化环境变量实现内置命令(如 cd 和 echo)cd命令:echo命令: 构建命令行提示符获取并解析用户输入的命令执行内置命令与外部命令Shell的主循…...
探索云原生可观测性:技术与团队协作的深度结合
TheNewStack 出品的电子书《Cloud Native Observability for DevOps Teams》读后感,老书新读,还是另有一番领悟。 阅读原文请转到:https://jimmysong.io/blog/cloud-native-observability-devops/ 最近读了 TheNewStack 发布的电子书《Cloud …...
Vue基础(2)
19、组件之间传递数据 组件与组件之间不是完全独立的,而是有交集的,那就是组件与组 件之间是可以传递数据的 传递数据的解决方案就是 props ComponentA.vue <template><!-- 使用ComponentB组件,并传递title属性 --><h3>…...
Yearning开源MySQL SQL审核平台
一款MYSQL SQL语句/查询审计工具,为DBA与开发人员使用. 本地部署,注重隐私,简单高效的MYSQL审计平台。 它可以通过流程审批,实现真实线上环境sql的审核和执行,还可以回滚执行,能够确保线上SQL更新的可靠性…...
《鸿蒙Next应用商店:人工智能开启智能推荐与运营新时代》
在科技飞速发展的当下,鸿蒙Next系统的出现为操作系统领域带来了新的变革与机遇,而人工智能技术的融入更是让其应用商店的智能化推荐和运营迈向了一个全新的高度。 用户画像精准构建 在鸿蒙Next系统中,应用商店可以借助系统强大的权限管理和…...
SSTI注入
ssti漏洞成因 ssti服务端模板注入,ssti主要为python的一些框架 jinja2 mako tornado django,PHP框架smarty twig,java框架jade velocity等等使用了渲染函数时,由于代码不规范或信任了用户输入而导致了服务端模板注入,…...
根据经纬度查询地理位置信息API
API 概述 接口名称:查询地理位置信息V2接口类型:HTTP GET接口地址:https://api.kertennet.com/geography/locationInfo_v2请求编码格式:utf-8 请求说明 请求头部 标签类型必填说明参数示例Content-Typestring是请求的内容类型…...
【知识分享】PCIe5.0 TxRx 电气设计参数汇总
目录 0 引言 1 参考时钟--Refclk 2 发射端通道设计 3 发送均衡技术 4 接收端通道设计 5 接收均衡技术 6 结语 7 参考文献 8 扩展阅读 0 引言 PCI Express Base Specification 5.0的电气规范中,关键技术要点如下: 1. 支持2.5、5.0、8.0、16.0和3…...
Airsim 项目结构分析
Airsim 项目结构分析 本文只分析最核心的 AirLib 项目结构,以及其与 Unreal 项目的关系 假如已经根据 Airsim 主页,克隆了完整项目。 Build on Linux - AirSim 克隆源码 # go to the folder where you clone GitHub projects git clone https://git…...
STM32+W5500+以太网应用开发+003_TCP服务器添加OLED(u8g2)显示状态
STM32W5500以太网应用开发003_TCP服务器添加OLED(u8g2)显示状态 实验效果3-TCP服务器OLED1 拷贝显示驱动代码1.1 拷贝源代码1.2 将源代码添加到工程1.3 修改代码优化等级1.4 添加头文件路径1.5 修改STM32CubeMX工程 2 修改源代码2.1 添加头文件2.2 main函…...
SQLmap 注入-03 获得用户信息
1: Sqlmap 先进入库,然后进入table, 然后列出column: sqlmap -u "http://192.168.56.133/mutillidae/index.php?pageuser-info.php&usernamexiaosheng&passwordabc&user-info-php-submit-buttonViewAccountDetails" --batch -p username -D …...
Kafka 和 MQ 的区别
1.概述 1.1.MQ简介 消息中间件,其实准确的叫法应该叫消息队列(message queue),简称MQ。其本质上是个队列,有FIFO的性质,即first in first out,先入先出。 目前市场上主流的MQ有三款ÿ…...
若依报错:无法访问com.ruoyi.common.annotation
无法访问com.ruoyi.common.annotation 若依的父工程的pom文件中设置了jdk为1.8,将idea的jdk也改为1.8即可。...
MCU、MPU、SOC、ECU、CPU、GPU的区别到底是什么
MCU、MPU、SOC、ECU、CPU、GPU的区别 参数MCUMPUSoCECUCPUGPU处理能力低至中中至高综合,视具体设计而定专用于汽车控制中至高高(并行能力强)集成度高低高高低(需配合主板使用)低(通常作为外部设备ÿ…...
档案事业与数据要素之间有什么关系?
在数字时代背景下,档案事业正经历着前所未有的变革。随着大数据、云计算、人工智能等技术的快速发展,档案数据已成为重要的基础性战略资源和关键生产要素。那么档案事业与数据要素之间究竟有什么关系? 一、档案数据要素的内涵与价值 数据要…...
HarmonyOS NEXT:华为分享-碰一碰开发分享
随着科技的不断进步,智能手机和智能设备之间的互联互通变得越来越重要。华为作为科技行业的领军企业,一直致力于为用户提供更加便捷、高效的使用体验。HarmonyOS NEXT系统的推出,特别是其中的“碰一碰”功能,为用户带来了前所未有…...