Zinx 框架学习笔记

函数返回接口而不是具体的结构体 Q: 为什么返回接口 IServer 而不是 server /* 创建一个服务器句柄 */ func NewServer (name string) ziface.IServer { s:= &Server { Name :name, IPVersion:"tcp4", IP:"0.0.0.0", Port:7777, } return s } A : NewServer 函数返回一个 ziface.IServer 类型的接口而不是直接返回 Server 类型的结构体,这种设计方式具有几个优点: 抽象化:返回一个接口而不是具体的结构体可以抽象化组件之间的交互。使用接口可以隐藏具体实现的细节,使得调用者只需要关心接口提供的方法。这样,如果未来需要改变具体的实现,只要新的实现符合接口的定义,调用代码不需要做任何修改。 灵活性和扩展性:使用接口使得代码更加灵活和易于扩展。比如,如果你想实现一个具有不同特性的服务器,只需创建一个新的结构体,实现相同的接口。这样你可以在不修改现有代码的情况下,为系统引入新的功能。 依赖倒置原则:这是面向对象设计原则之一,主张高层模块不应该依赖低层模块,它们都应该依赖于抽象。接口作为一种高级的抽象,确保了系统各个部分的低耦合性,增加了代码的稳定性。 测试和模拟:使用接口可以更容易地进行单元测试。你可以创建一个或多个模拟(mock)对象来实现同一接口,这样就可以在不涉及具体服务器实现的情况下测试系统的其他部分。 因此,返回 ziface.IServer 接口而不是具体的 Server 结构体,在软件工程中是一种常见且有益的做法,特别是在构建需要高度维护和扩展性的大型软件系统时。这种方式提供了更好的解耦和更灵活的代码管理策略。 函数定义的使用 函数类型的定义在编程中非常有用,尤其在Go语言这样的类型安全语言中,它提供了一系列的好处,这些好处涵盖了代码的可维护性、灵活性和可重用性等方面: 代码复用: 通过定义一种函数签名,可以创建多个遵循相同模式的函数,这有助于统一接口和减少重复代码。这意味着你可以编写高度模块化的代码,其中特定的功能可以由符合同一签名的不同函数实现。 实现抽象和封装: 函数类型的定义允许程序员封装复杂的逻辑,并通过简单的接口暴露功能,使得其他部分的代码不必了解背后的细节就能使用该功能。这有助于降低程序各部分之间的耦合度。 提高灵活性: 函数类型作为参数传递或作为返回类型使用时,可以使代码更加灵活。开发者可以根据具体的需要传入不同的函数实现,例如在处理不同类型的网络请求时,可以根据请求的类型动态选择合适的处理函数。 便于维护和扩展: 函数类型定义使得未来的修改和扩展变得更容易。如果需要修改功能,只需替换或修改实现了该函数类型的具体函数,而不需修改依赖于该类型的代码。这样做减少了对现有代码的干扰,降低了引入新错误的风险。 支持回调和高阶函数: 函数类型的定义是实现回调机制的基础。在Go中,经常会用到回调来处理异步事件、定时任务或在框架中允许用户代码介入框架运行。同时,函数类型的定义是实现高阶函数(接受函数为参数或返回函数的函数)的关键,这在功能编程风格中非常有用。 类型安全: 函数类型提供了类型安全的好处,确保函数的使用者传递正确类型的参数,返回预期类型的数据。这在编译时就能捕捉到许多可能的错误,提高程序的健壮性。 panic 具体使用方法 以下是一个使用 ProcessFunc 类型函数作为参数的示例,该函数将遍历一个字符串切片,并使用传入的 ProcessFunc 类型函数处理每个字符串,然后将结果收集并返回。 首先,我们有一个 ProcessFunc 类型定义,如之前所述: type ProcessFunc func(input string) int 现在,我们将创建一个函数 applyToStrings,它接受一个 ProcessFunc 类型的函数和一个字符串切片,应用该函数到每个字符串,并收集结果:...

September 24, 2024 · 2 min · 235 words · Similarityoung

Markdown 编写规范

说明 文档中使用的关键字「MUST」,「MUST NOT」,「REQUIRED」,「SHALL」,「SHALL NOT」,「SHOULD」,「SHOULD NOT」,「RECOMMENDED」,「MAY」和「OPTIONAL」在 RFC2119 中有说明。 还未定稿,对规范中提及的点有不赞同的欢迎提出 issues(请添加 markdown 标签)讨论。 规则 后缀必须「MUST」使用 .md。 文件名必须「MUST」使用小写,多个单词之间使用-分隔。 文件编码必须「MUST」用 UTF-8。 文档标题应该「SHOULD」这样写。 Markdown 编写规范 ========================== 章节标题必须「MUST」以 ## 开始,而不是 #。 章节标题必须「MUST」在 # 后加一个空格,且后面没有 #。 // bad ##章节1 // bad ## 章节1 ## // good ## 章节1 章节标题和内容间必须「MUST」有一个空行。 // bad ## 章节1 内容 ## 章节2 // good ## 章节1 内容 ## 章节2 代码段的必须「MUST」使用 Fenced code blocks 风格,如下所示: ``` console.log(""); ``` 表格的写法应该「SHOULD」参考 GFM,如下所示: First Header | Second Header ------------- | ------------- Content Cell | Content Cell Content Cell | Content Cell | Left-Aligned | Center Aligned | Right Aligned | | :------------ |:---------------:| -----:| | col 3 is | some wordy text | $1600 | | col 2 is | centered | $12 | | zebra stripes | are neat | $1 | 中英文混排应该「SHOULD」采用如下规则:...

September 24, 2024 · 2 min · 223 words · Similarityoung

Git 约定式提交(Conventional Commits)

文档连接 语义化版本: 用于发版相关的规范 约定式提交(Conventional Commits)是一种用于写作提交消息的规范,它规定了一套标准化的提交消息格式,以使得项目的版本控制更加清晰和一致。采用这种规范的好处是能够帮助开发团队更好地理解代码的变更历史、生成变更日志(changelog),以及进行版本控制。 约定式提交的基本格式 <类型>(<范围>): <描述> <主体> <footer> 各部分说明 1. 类型(type):用于说明提交的类型,例如是修复bug还是添加新功能。常见的类型包括: feat:新功能(feature) fix:修补bug docs:文档(documentation)变更 style:代码格式(不影响代码运行的变动) - refactor:重构(即不是新增功能,也不是修改bug的代码变动) - test:增加测试 - chore:构建过程或辅助工具的变动 2. 范围(scope):可选项,用于说明提交影响的范围(例如模块、文件等)。 3. 描述(subject):简要说明提交的内容。 4. 主体(body):可选项,用于详细说明提交的内容,可以分成多行。 5. 脚注(footer):可选项,用于说明重大变更,或者关联的issue。例如: - BREAKING CHANGE:说明重大变更 - Closes #123:关闭issue 示例 feat(auth): add login functionality Added login functionality with OAuth2 integration. Users can now log in using their Google account. Closes #45

September 17, 2024 · 1 min · 59 words · Similarityoung

go 学习笔记

go 学习路线 GoLang语法新奇 golang 中的表达式,加";“与不加都可以,建议不加 另外函数方法中的{},符合 java 中的标准,需要放在函数名后面 变量声明 package main import "fmt" /* 四种变量声明方式 */ var x, y int var ( //这种分解的写法,一般用于声明全局变量 a int b bool ) func main() { //声明变量 默认为 0 var a int fmt.Println("a = ", a) // 方法二 声明变量,并初始化 var b int = 100 fmt.Println("b = ", b) //方法三 (不推荐) 初始化省去数据类型,通过值来自动匹配数据类型 var c = 100 fmt.Println("c = ", c) // 方法四:(最常用的方法),只能用在函数体内 e := 100 fmt.Println("e = ", e) fmt....

August 29, 2024 · 8 min · 1602 words · Similarityoung

JavaScript

JavaScript 教程 在 HTML 中,JavaScript 代码必须位于标签之间。 能够在 HTML 文档中放置任意数量的脚本。 脚本可被放置与 HTML 页面的 <body> 或 <head> 部分中,或兼而有之。 <script src="myScript.js"></script> 注意是 src是引用 js 的方式。 通过 const 定义的变量与 let 变量类似,但==不能重新赋值。== 模板字面量_提供了一种将变量和表达式插入字符串的简单方法–${...} 箭头函数 hello = () => { return "Hello World!"; } 模块(modules) 导出 JavaScript 模块允许您将代码分解成单独的文件。 这会使维护代码库更加容易。 模块是使用 import 语句从外部文件导入的。 模块还依赖于 < script > 标签中的 type="module"。 <script type="module"> import message from "./message.js"; </script> 命名导出(Named Exports) 让我们创建一个名为 person.js 的文件,并在其中填充我们要导出的内容。 您可以通过两种方式创建命名导出。一种是逐个内联创建,另一种是在文件底部一次性全部创建。 逐个内联创建: person.js export const name = "Bill"; export const age = 19; 在文件底部一次性创建:...

August 7, 2024 · 6 min · 1137 words · Similarityoung