GIN与Echo:选择正确Go框架的指南

news/2024/7/27 8:01:21/文章来源:https://blog.csdn.net/csjds/article/details/136464542

您是否在Go中构建Web应用?选择正确的框架至关重要!GIN和Echo是两个热门选择,每个都有其优势和特点。本指南将详细介绍每个框架的特性、速度、社区热度以及它们各自擅长的项目类型。最后,您将能够为您的下一个Web项目选择完美的框架!

在这里插入图片描述

对于Go Web开发项目选择正确的框架对项目成功至关重要。GIN和Echo是两个流行的选择,每个都具有独特的优势。GIN优先考虑性能和简单性,使其成为API和微服务的理想选择。Echo提供了广泛的自定义和灵活性,适用于需要复杂路由的复杂Web应用。在决定使用两者之间时,考虑项目要求、开发者熟悉度和特定用例。GIN在高性能应用中表现出色,而Echo适用于需要定制化的项目。两个框架都有活跃的社区、详尽的文档和不同级别的性能和功能集。根据项目的需要明智选择。

快速对比

Gin和Echo框架的比较:

特性GinEcho
性能高性能,为速度优化快速轻量级框架
路由强大的路由引擎,支持动态路由和中间件强大的路由能力,支持中间件链
中间件支持中间件链并包含多种内置中间件以处理常见任务以中间件为中心的设计,提供广泛的中间件支持
文档文档齐全,有全面的指南和示例详细的文档,有清晰的解释和示例
社区大型活跃社区,频繁更新和贡献不断增长的社区,增加采用率和社区支持
学习曲线对熟悉Web框架的开发者来说学习曲线相对较低对已经熟悉Web开发概念的开发者易于学习
灵活性提供定制化和扩展的灵活性高度灵活,支持自定义中间件和配置选项
流行度在生产环境中广泛使用,受到许多开发者的青睐由于其简单性和性能正变得越来越流行
生态系统丰富的生态系统,有众多第三方库和插件可用生态系统不断发展,支持各种集成和扩展
Websocket支持对Websockets的支持有限,可能需要额外的库或中间件开箱即用的全面Websockets支持,包括内置中间件
JSON处理内置支持JSON处理和序列化原生支持JSON处理,易于使用的API
模板渲染支持使用HTML和文本模板的模板渲染内置支持模板渲染,支持HTML模板和各种模板引擎
许可MIT许可证MIT许可证

引言:

为您的Go Web开发项目选择正确的框架就像

为工匠选择完美的工具一样。它为整个开发过程奠定了基础,影响着从代码结构到项目可扩展性的一切。在这个速度、效率和适应性至关重要的数字时代,这一决定变得更加重要。

选择正确框架的重要性

框架的选择显著影响开发体验和项目的最终成果。一个合适的框架可以简化开发,提高生产力,并确保应用的可扩展性和可维护性。相反,不合适的框架可能导致不必要的复杂性,性能受阻和开发时间增加。

在Go Web开发的背景下,简单性、性能和并发性是核心原则,选择过程变得更加细腻。框架必须在提供强大功能和保持语言固有效率和优雅之间找到微妙的平衡。

介绍GIN和Echo:两个框架的故事

在众多Go Web框架中,GIN和Echo已经成为突出的竞争者,每个都有自己独特的优势和特性。

GIN:

作为一个极简主义但功能强大的框架,GIN优先考虑性能和简单性。基于net/http构建,它拥有极快的路由和最小的开销,使其成为构建高性能API和微服务的理想选择。GIN的轻量级设计和直观API使开发人员能够用最少的样板代码创建健壮的Web应用,确保快速开发而不牺牲性能。

Echo:

相比之下,Echo以其灵活性和可定制性脱颖而出。凭借其优雅和富有表现力的API,Echo使开发人员能够轻松构建复杂的Web应用。提供广泛的中间件支持、动态路由生成和内置验证,Echo为构建RESTful API和复杂Web应用提供了全面的工具包。它对开发者生产力和灵活性的强调使其成为需要广泛定制和高级功能的项目的首选。

导航决策过程

在GIN和Echo之间的决定取决于众多因素,包括项目要求、性能考虑和开发偏好。为了做出明智的选择,开发人员必须仔细评估每个框架的特性、性能指标和社区支持,权衡利弊,并将它们与项目的目标和目的对齐。

在本指南的后续部分中,我们将深入探讨GIN和Echo的特性、用例和性能基准,提供宝贵的洞察,帮助您导航决策过程,并选择最适合您需求的框架。

随着对框架选择重要性的清晰理解以及对GIN和Echo独特特性的介绍,让我们开始探索这两个框架的细节,并发现哪一个在Go Web开发领域占据主导地位。

比较特性

路由

GIN的路由简洁直观,使用最小化的语法定义路由变得简单。Echo提供了类似的功能,具有灵活的路由API,允许动态路由模式和参数解析。两个框架都支持中间件,使开发人员能够高效地向路由添加预处理和后处理逻

辑。

// GIN路由示例
router := gin.Default()
router.GET("/ping", func(c *gin.Context) {c.String(http.StatusOK, "pong")
})// Echo路由示例
e := echo.New()
e.GET("/ping", func(c echo.Context) error {return c.String(http.StatusOK, "pong")
})

模板

GIN对服务器端模板的支持有限,主要通过HTML渲染引擎。相比之下,Echo通过允许开发人员与多种模板引擎集成,包括HTML、Markdown和JSON,提供了更大的灵活性。

Gin框架:

Gin框架通过使用Go标准库中的html/template包提供内置支持模板渲染。以下是如何在Gin中使用模板渲染的方法:

  1. 模板解析: Gin提供了一个LoadHTMLGlob函数来从目录加载HTML模板。您可以使用此函数来解析和加载模板:
// 加载HTML模板
router := gin.Default()
router.LoadHTMLGlob("templates/*")
  1. 渲染模板: 一旦模板被加载,您可以在路由处理器中使用HTML方法渲染它们:
// 渲染HTML模板
router.GET("/", func(c *gin.Context) {// 渲染"index.html"模板c.HTML(http.StatusOK, "index.html", gin.H{"title": "欢迎来到我的网站",})
})
  1. 向模板传递数据: 您可以使用gin.H映射或通过传递结构体来向模板传递数据:
type User struct {Name  stringEmail string
}router.GET("/user", func(c *gin.Context) {// 向"user.html"模板传递数据user := User{Name: "John Doe", Email: "john@example.com"}c.HTML(http.StatusOK, "user.html", gin.H{"user": user,})
})
Echo框架:

Echo框架同样支持模板渲染,允许使用各种模板引擎,如HTML、Markdown等。以下是在Echo中使用模板渲染的方法:

  1. 模板渲染设置: Echo提供了一个Render方法来设置模板渲染:
// 设置模板渲染
e := echo.New()
e.Renderer = renderer.NewRenderer("templates")
  1. 渲染模板: 设置模板渲染后,您可以在路由处理器中使用Render方法渲染模板:
// 渲染HTML模板
e.GET("/", func(c echo.Context) error {// 渲染"index.html"模板return c.Render(http.StatusOK, "index.html", map[string]interface{}{"title": "欢迎来到我的网站",})
})
  1. 向模板传递数据: 类似于Gin,您可以使用映射或结构体向模板传递数据:
type User struct {Name  stringEmail string
}e.GET("/user", func(c echo.Context) error {// 向"user.html"模板传递数据user := User{Name: "John Doe", Email: "john@example.com"}return c.Render(http.StatusOK, "user.html", map[string]interface{}{"user": user,})
})
对比:

Gin和Echo在模板渲染功能上提供了类似的功能,允许开发人员轻松渲染HTML模板并向它们传递数据。主要区别在于设置和配置语法,Gin使用自己的HTML方法,而Echo使用Render方法。然而,最终结果是相同的,两个框架都提供了在Go Web应用中模板渲染的强大支持。开发人员可以根据个人偏好和项目要求在Gin和Echo之间进行选择。

验证

GIN和Echo都提供了内置验证功能,用于处理用户输入。然而,Echo通过与流行的验证库如Go Validator和go-playground/validator的集成,提供了更广泛的支持。

Gin中的验证:

Gin没有内置的验证功能。然而,开发人员可以轻松集成第三方验证库,如go-playground/validatorasaskevich/govalidator,在Gin应用中处理输入验证。

这是使用go-playground/validator库与Gin进行输入验证的示例:

package mainimport ("github.com/gin-gonic/gin""github.com/go-playground/validator/v10"
)type User struct {Username string `json:"username" validate:"required"`Email    string `json:"email" validate:"required,email"`
}func main() {r := gin.Default()// 初始化验证器validate := validator.New()r.POST("/register", func(c *gin.Context) {var user Userif err := c.ShouldBindJSON(&user); err != nil {c.JSON(400, gin.H{"error": err.Error()})return}// 验证用户输入if err := validate.Struct(user); err != nil {c.JSON(400, gin.H{"error": err.Error()})return}// 处理有效的用户数据c.JSON(200, gin.H{"message": "用户注册成功"})})r.Run(":8080")
}
Echo中的验证:

Echo通过其echo.Validator接口提供内置的验证功能,允许开发人员定义自定义验证规则和错误消息。

这是使用Echo内置验证中间件进行输入验证的示例:

package mainimport ("github.com/labstack/echo/v4""github.com/labstack/echo/v4/middleware""gopkg.in/go-playground/validator.v9"
)type User struct {Username string `json:"username" validate:"required"`Email    string `json:"email" validate:"required,email"`
}func main() {e := echo.New()// 初始化验证器e.Validator = &CustomValidator{validator: validator.New()}e.POST("/register", func(c echo.Context) error {var user Userif err := c.Bind(&user); err != nil {return err}// 验证用户输入if err := c.Validate(&user); err != nil {return err}// 处理有效的用户数据return c.JSON(200, map[string]string{"message": "用户注册成功"})})e.Logger.Fatal(e.Start(":8080"))
}// CustomValidator实现了echo.Validator接口
type CustomValidator struct {validator *validator.Validate
}// Validate验证一个结构体
func (cv *CustomValidator) Validate(i interface{}) error {if err := cv.validator.Struct(i); err != nil {return echo.NewHTTPError(400, err.Error())}return nil
}

在这个示例中,CustomValidator结构体实现了echo.Validator接口,允许使用go-playground/validator库定义自定义验证规则。

总的来说,Gin和Echo都提供了输入验证的选项,Gin依赖于第三方库,而Echo提供了内置的验证功能。开发人员可以根据项目要求和偏好选择适合他们的方法。

数据库交互

GIN和Echo都提供了与数据库无缝集成的功能,允许开发人员轻松地与SQL和NoSQL数据库进行交互。虽然GIN提供基本的数据库功能,Echo的灵活性使其能够执行更高级的数据库操作和ORM集成。

让我们比较一下Gin和Echo框架中的数据库交互:

Gin中的数据库交互:

Gin没有内置的数据库交互支持,但它为开发人员提供了选择他们喜欢的数据库库和ORM框架的灵活性。开发人员通常使用流行的库,如gormsqlxdatabase/sql,在Gin应用中与数据库进行交互。

这是在Gin应

用中使用gorm库进行CRUD操作的示例:

package mainimport ("github.com/gin-gonic/gin""gorm.io/driver/mysql""gorm.io/gorm"
)type User struct {ID       uint   `gorm:"primaryKey"`Username string `gorm:"unique"`Email    string
}func main() {// 连接到MySQL数据库dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {panic("连接数据库失败")}// 自动迁移模式db.AutoMigrate(&User{})// 初始化Gin路由器r := gin.Default()// 创建新用户的处理器r.POST("/users", func(c *gin.Context) {var user Userif err := c.BindJSON(&user); err != nil {c.JSON(400, gin.H{"error": err.Error()})return}db.Create(&user)c.JSON(200, user)})// 获取所有用户的处理器r.GET("/users", func(c *gin.Context) {var users []Userdb.Find(&users)c.JSON(200, users)})// 运行Gin服务器r.Run(":8080")
}
Echo中的数据库交互:

与Gin类似,Echo没有提供内置的数据库交互功能,但它允许开发人员集成他们喜欢的数据库库或ORM。常见的选择包括gormsqlxdatabase/sql

这是在Echo应用中使用gorm库与MySQL数据库交互的示例:

package mainimport ("github.com/labstack/echo/v4""gorm.io/driver/mysql""gorm.io/gorm"
)type User struct {ID       uint   `gorm:"primaryKey"`Username string `gorm:"unique"`Email    string
}func main() {// 连接到MySQL数据库dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {panic("连接数据库失败")}// 自动迁移模式db.AutoMigrate(&User{})// 初始化Echo实例e := echo.New()// 创建新用户的处理器e.POST("/users", func(c echo.Context) error {var user Userif err := c.Bind(&user); err != nil {return err}db.Create(&user)return c.JSON(200, user)})// 获取所有用户的处理器e.GET("/users", func(c echo.Context) error {var users []Userdb.Find(&users)return c.JSON(200, users)})// 启动Echo服务器e.Logger.Fatal(e.Start(":8080"))
}

在这两个示例中,我们都使用gorm库与MySQL数据库进行交互,在Gin和Echo应用中执行CRUD操作。开发人员可以根据因素,如性能、易用性和与他们应用要求的兼容性,选择他们喜欢的数据库库或ORM框架。

性能

比较Gin和Echo框架的性能可能很复杂,这取决于特定用例、服务器配置和应用实现等多种因素。然而,我可以提供一些关于它们性能特性的一般性见解。

Gin性能:

Gin以其高性能和低开销而闻名。它通过最小化不必要的功能和专注于基本功能来实现这一点。Gin的性能受益于其高效的路由引擎和轻量级设计,使其非常适合构建高性能的Web应用、API和微服务。

Gin通过使用httprouter作为其默认路由器来实现其速度,这是一个高性能的HTTP请求路由器。此外,Gin强调使用较少的反射操作,这可以有助于提高性能。

Echo性能:

Echo也设计用于高性能,旨在成为Go中最快的HTTP框架之一。它通过其简约设计、高效路由和中间件实现来实现这一点。Echo的性能受益于其使用的基于radix树的路由器,该路由器针对快速路由匹配进行了高度优化。

Echo优先考虑速度和简单性,避免不必要的开销,并为开发人员提供了一个轻量级框架,能够高效地处理高负载。

基准测试:

比较Gin和Echo的性能时,开发人员通常使用工具如Apache Bench (ab)、wrk或hey进行基准测试。这些测试通常测量各种负载条件下的吞吐量、响应时间和资源利用率等指标。

基准测试结果可能因服务器硬件、网络配置和应用复杂性等因素而异。在真实世界场景中进行彻底的基准测试是确定哪个框架对特定用例表现更好的关键。

社区和支持

GIN和Echo都拥有活跃和支持性的社区,提供广泛的文档、教程和社区贡献的资源。然而,GIN更大的用户基础和更长的历史可能导致更容易获得的资源和插件。

3. 用例

GIN

GIN非常适合性能至关重要的应用,如API和微服务,其中速度和效率是最重要的。其极简主义设计和低开销使其成为优先考虑原始性能的简单Web应用的绝佳选择。

Echo

Echo在需要广泛定制和灵活性的场景中表现出色,如构建RESTful API或具有复杂路由要求的复杂Web应用。其丰富的功能集和强大的中间件支持使其成为定制性是首要考虑因素的项目的理想选择。

决定

决定是否使用Gin或Echo取决于各种因素,包括项目要求、开发者熟悉度和特定用例。以下是何时使用每个框架的一些考虑因素:

何时使用Gin:

  1. 高性能Web应用: Gin非常适合构建需要快速响应时间和高效路由的高性能Web应用。其极简设计和对速度的专注使其成为性能至关重要的应用的流行选择。
  2. API开发: Gin的轻量级和快速特性使其成为构建API的绝佳选择。其高效的路由引擎和中间件支持使开发人员能够用最小的开销创建RESTful API。
  3. 微服务架构: Gin的低开销和快速路由引擎使其非常适合构建微服务。其简单性和性能使其成为需要多个小服务相互通信的项目的有力选择。
  4. 开发者熟悉度: 如果开发人员已经熟悉Gin框架或更喜欢其语法和特性,它可能是新项目或迁移现有应用的自然选择。

何时使用Echo:

  1. 快速原型制作: Echo的简单性和易用性使其成为快速原型制作和构建概念验证应用的绝佳选择。其简约设计和直观API使开发人员能够快速开始新项目。

  2. 中间件为中心的应用: Echo的中间件为中心的设计使其非常适合需要广泛中间件支持的应用。开发人员可以轻松插入用于身份验证、日志记录和错误处理等任务的中间件,使其灵活适用于广泛的用例。

  3. 社区和生态系统: Echo拥有不断增长的社区和第三方库及插件的生态系统。如果开发人员需要Echo生态系统中可用的特定功能或集成,它可能是他们项目的首选。

  4. 实时应用: Echo的内置对WebSockets的支持和高效的路由引擎使其成为实时应用如聊天应用、实时更新和协作工具的好选择。

对两个框架的考虑:

  1. 项目要求: 在选择Gin和Echo之间时,考虑您项目的具体要求,包括性能、可扩展性和功能集。
  2. 开发者经验: 考虑您的开发团队对每个框架的经验和熟悉度。选择开发人员舒适的框架可以带来更快的开发和更少的实施问题。
  3. 社区支持: 考虑每个框架周围的社区大小和活跃度,以及文档、教程和支持资源的可用性。
  4. 可扩展性: 虽然Gin和Echo都被设计为可扩展的,但考虑您项目的可扩展性要求,以及是否有一个框架可能更适合您的可扩展性目标。

最终,GIN与Echo之间的选择取决于您项目的具体需求和目标,以及您的开发团队的偏好和专业知识。两个框架都提供了出色的性能和灵活性,因此评估它们基于您项目的要求和限制是至关重要的。

4. 结论

总之,GIN与Echo都是强大的框架,具有不同的优势和劣势。在选择它们之间时,考虑您项目的要求、性能考虑和开发偏好。通过评估每个框架的特性、性能和社区支持,您可以选择最符合您项目目标和开发理念的框架。

记住,没有一劳永逸的解决方案,最佳框架可能会根据您项目的具体情况而变化。探索文档,尝试代码示例,并利用社区资源来做出明智的决定。

祝编码愉快!

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

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

相关文章

如何在Windows系统部署Jellyfin Server并实现公网访问内网影音文件

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及,各种各样的使用需求也被开发出来&…

moi3D安装

下载文件双击文件 下一步 同意下一步 下一步 下一步 下一步 安装下一步 完成 破解 将如图中的文件复制到文件目录下 汉化 在目录中进入ui文件夹下 在安装包中找到如下的文件复制到ui目录下 在打开 另存为 另存为时改一下编码格式如图 打开软件 找到如图options进入…

C++:拷贝构造函数

1.概念 在现实生活中,可能存在一个与你一样的自己,我们称之为双胞胎。那在创建对象的时候,可否创建一个与已存在对象一模一样的新对象呢?答案是可以的,这就要通过拷贝构造函数来实现了。 拷贝构造函数:只有…

MindOpt优化器: 浅谈版本0.x和1.x之间API的差异

Mindopt 是一个优化求解器,如果它有两个主要版本——0.xx和1.x.x(最新版本1.1.1),它们代表着软件开发的两个不同阶段。版本1.0.0表示软件的一个大的里程碑,代表着软件第一个正式的“成熟”发布版本,而0.25是…

【SpringBoot】多环境切换的灵活配置

文章目录 profile 的使用激活 profile 的方式命令行启动idea 中配置配置文件中激活 开发中最灵活的多环境配置创建四个配置主配置文件其他几个环境配置使用方式 配置文件拆分总结 在日常的开发中,一般都会分好几种环境,比如通常的 开发环境:一…

NTFS Disk by Omi NTFS for mac v1.1.4中文版

NTFS Disk by Omi NTFS for Mac:NTFS文件系统的无缝桥梁 软件下载:NTFS Disk by Omi NTFS for mac v1.1.4中文版 🌐 跨平台访问,文件无阻 NTFS Disk by Omi NTFS for Mac 为您的Mac提供了对NTFS文件系统的无缝访问。无论您是在Win…

FPGA-VGA成像原理与时序

什么是VGA: VGA, Video Graphics Array。即视频图形阵列,具有分辨率高、显示速率快、颜色丰富等优点。VGA接口不但是CRT显示设备的标准接口,同样也是LCD液晶显示设备的标准接口,具有广泛的应用范围。在FGPA中,常广泛用于图像处理等领域。 VGA 显示器成像原理 在 VGA 标准刚兴…

戏说c第二十六篇: 测试完备性衡量(代码覆盖率)

前言 师弟:“师兄,我又被鄙视了。说我的系统太差,测试不过关。” 我:“怎么说?” 师弟:“每次发布版本给程夏,都被她发现一些bug,太丢人了。师兄,有什么方法来衡量测试的…

供应链思维导图

https://author.baidu.com/home?frombjh_article&app_id1733215801356691 1 供应链管理流程图 2. 进销存 功能

【李沐精读系列】GPT、GPT-2和GPT-3论文精读

论文: GPT:Improving Language Understanding by Generative Pre-Training GTP-2:Language Models are Unsupervised Multitask Learners GPT-3:Language Models are Few-Shot Learners 参考:GPT、GPT-2、GPT-3论文精读…

VBA_MF系列技术资料1-395

MF系列VBA技术资料1-395 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧,我参考大量的资料,并结合自己的经验总结了这份MF系列VBA技术综合资料,而且开放源码(MF04除外),其中MF01-0…

《解密云计算:企业之选》

前言 在当今数字化时代,企业面临着巨大的数据处理压力和信息化需求,传统的IT架构已经无法满足日益增长的业务需求。在这样的背景下,越来越多的企业开始转向云计算,以实现灵活、高效和可扩展的IT资源管理和利用。 云计算 云计算是一种基于互联网的计算模式,它通过将数据、…

ElasticSearch之分片相关概念segment,merge,refresh等

写在前面 本文看下分片相关概念,segment,merge,refresh等。 1:segment,commit point,.del 一个倒排索引的文件称为segment,多个segment组合在一起就是lucene的index,也就是es的sh…

五种msvcp140.dll丢失的解决方法

《绝地求生》(PUBG)的玩家数量在不同时期有所变化: 最新的官方数据显示,截至2023年2月1日,PUBG全球玩家总数已经超过4亿,并且当时有月活跃玩家2.27亿和日活跃玩家8700万。 而在较早的一个时间点&#xff…

JS判断对象属性是否存在

一 、在JavaScript中,有几种方法可以判断对象属性是否存在: 使用in操作符: property in object 例如:name in obj,如果obj对象有name属性,返回true,否则返回false。 使用hasOwnProperty()方法&…

为什么说鸿蒙开发就业面广?人才遭“爆抢”的背后说明什么?

鸿蒙开发,作为华为推出的全新操作系统,自其诞生以来就备受关注。而鸿蒙开发就业面广,人才遭“爆抢”的现象,更是引发了业界的广泛讨论。那么,这一现象背后究竟隐藏着怎样的原因和深意呢? 首先,…

基于单片机的家庭防盗报警器设计

目 录 摘 要 II Abstract III 引 言 1 1 系统方案设计 4 1.1 方案论证 4 1.2 项目总体设计 5 2 项目硬件设计 7 2.1 单片机型号的选择 7 2.2 单片机的引脚说明 8 2.3 单片机的最小系统 9 2.3.1 时钟电路设计 9 2.3.2 复位电路设计 10 2.4 红外信号采集及其处理 11 2.5 蜂鸣器电…

C语言第三十五弹---文件操作(上)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 文件操作 1、为什么使用文件? 2、什么是文件? 2.1、程序文件 2.2、数据文件 2.3、文件名 3、二进制文件和文本文件 4、文件的打开和…

高校水电预付费系统有什么作用?

Hey小伙伴们,今天来聊聊咱们大学里的一个超级实用的设施——水电预付费系统!你是不是还在为每个月的水电账单烦恼呢?别担心,这个系统就是你的生活小帮手! 首先,想象一下这 样的场景:开学初&…

win11修改主机mac地址

很多时候,为了限制恶意的蹭流浪,除了分配固定的ip地址外,还限制mac地址。只有mac与ip一致,才能上网冲浪 网络适配器中修改 搜索“控制面板”打开 控制面板 > 网络和Internet > 网络和共享中心 >查看网络状态和任务>…