为了让PHP开发者转Go更丝滑把php优秀设计借鉴到Go框架设计里面-保留php开发习惯又能提供高软件性能

框架从以下设计要求使得达到有快速开发有又保证软件性能。框架要满足我们追求的大道至简、简单易容、减少开发者心智负担、快乐开发目标。

框架代码结构简单

框架设计的结构一定要简单,简单才能让新手容易上手、后续代码维护成本低、集成大项目才容易(不至于混乱)。目录结构如下,其中app目录使我们业务代码位置,app之外都是框架固定好的设计,开发时不用去动。app下每一个文件夹表示一个模块,如:admin、business后台管理接口,根据业务可以添加weixin、douyinapp等模块,让扩展变得简单。

同样的在模块内容也是可以添加文件夹表示一个业务类型,比如:在business模块下的文章(创建一个article文件夹),文章类也可能有文章管理、文章分类、文章评论,这些就在article文件夹里添加cate.go=编写文章分类接口,comments.go=编写文章评论接口,其他功能通用添加自己.go文件编写对应业务。

├── app                       # 应用目录
│   ├── admin                 # 后台管理应用模块(安装saas时存在、不安装则删除)
│   ├── business              # 业务端应用模块
│   ├── common                # 公共应用模块
│   └── controller.go         # 应用控制器
├── devsource                 # 开发静态资源(安装界面、代码生成模板)
├── resource                  # 静态资源及配置文件(发布应用带上)
├── runtime                   # 运行时文件(项目运行时自己生成)
├── utils                     # 框架核心代码及工具包
├── go.mod                    # 依赖包管理工具
├── go.sum         
├── main.go                   # main函数       
├── runner.conf               # fresh热编译配置文件
└── README.md                 # 项目介绍

后端路由可根据接口位置生成

从上面加粗例子创建的文章类,框架根据创建接口目录层级自行生产接口的请求地址并注册到服务上,比如:文章分类的获取分类列表、添加、删除,分别生成地址为:business/article/cate/getList、business/article/cate/save、business/article/cate/del。同样的评论也是一样的:business/article/comments/save,路径会根据它所在文件名生成。

为什么我们要把强调路由自动生成,因为Go的很多框架路由都是手动配置的,我们使用的Gin框架也是手动添加路由,为了避免手动添加工作量,自动生成还是很必要的,最重要的是,手动添加多人协同开发,可能存在填写一样的路由名,导致路由重复。根据目录和文件名生成避免重复,同时路可以更加api接口层级快速找到接口位置,方便通过接口找到代码,在后期维护即看其他人写代码也能快速定位代码位置。

orm操作链式操作习惯和php一样舒服

Go是强类型语言,在存取数据是需要对应数据字段类型去接收和提交数据。所以开发时需要写对应数据表数据结构,这个在开发时很费时,框架需要像php简单$变量很难做到。市面很多Go的ORM只有数据结构存取数据,每个操作都写数据表结构体很烦,所以我们框架一定集成一个需要要数据结构要求的ORM,当然我们集成的ORM是两者都兼容,这样习惯用结构的开发者也是可以使用结构,因为有些提供给其他人使用,有结构体的数据可以在取数据时候知道有哪些字段及数据类型。

看看我们数据数据库操作:

  • 获取全部数据
list, err := gf.Model("createcode_product_cate").Where("status",0).
Fields("id,name,status,createtime").Order("id asc").Select()
  • 保存数据
//添加数据有三种方法
//1.写入的数据中存在主键或者唯一索引时,返回失败,否则写入一条新数据
addId, err := gf.Model("createcode_product_cate").Data(param).InsertAndGetId()
//2.用于写入数据时并直接返回自增字段的ID
res, err := gf.Model("createcode_product_cate").Data(param).Insert()
//3.写入的数据中存在主键或者唯一索引时,更新原有数据,否则写入一条新数据
res, err := gf.Model("createcode_product_cate").Data(param).save()
  • 更新数据
res, err := gf.Model("createcode_product_cate").Data(param).Where("id", f_id).Update()
  • 删除数据
	res2, err := gf.Model("createcode_product_cate").Where("id", 1).Delete()

更多orm操作到:orm开发文档

开发一个接口示例:

package createcodeimport ("gofly/utils/gf"
)// 关联的分类
type Productcate struct{}func init() {fpath := Productcate{}gf.Register(&fpath, fpath)
}// 获取列表
func (api *Productcate) GetList(c *gf.GinCtx) {list, err := gf.Model("createcode_product_cate").Where("status", 0).Fields("id,name,status,createtime").Order("id asc").Select()if err != nil {gf.Failed().SetMsg(err.Error()).Regin(c)} else {gf.Success().SetMsg("获取列表").SetData(list).Regin(c)}
}// 更新状态
func (api *Productcate) UpStatus(c *gf.GinCtx) {param, _ := gf.RequestParam(c)res2, err := gf.Model("createcode_product_cate").Where("id", param["id"]).Data(param).Update()if err != nil {gf.Failed().SetMsg("更新失败!").SetData(err).Regin(c)} else {msg := "更新成功!"if res2 == nil {msg = "暂无数据更新"}gf.Success().SetMsg(msg).SetData(res2).Regin(c)}
}// 删除
func (api *Productcate) Del(c *gf.GinCtx) {param, _ := gf.RequestParam(c)res2, err := gf.Model("createcode_product_cate").WhereIn("id", param["ids"]).Delete()if err != nil {gf.Failed().SetMsg("删除失败").SetData(err).Regin(c)} else {gf.Success().SetMsg("删除成功!").SetData(res2).Regin(c)}
}

现在web应用计划都采用前后端分离,所以只需保证后端开发接口速度快即可,前端不管那个语言可以使用vue、react等框架。我们框架基于Go语言简单基础上设计得让开发变得简单。我们使用过其他框架,有些参考java框架集成,还是集成过于重。我们还是喜欢大道至简这个设计思路,开发本来简单,写程序应该是一种享受,开发框架也是需要简单,不能增加开发者开发时的心里负担。

题外话这里引用他人一句话: Golang哲学就是"少便是多", 志在减少开发者的心智负担. 不过再好的语言也敌不过"人", 请接受Golang的风格 否则写出PHPGo, JavaGo真是作茧自缚。

我们大家喜欢Go,就是Go的设计者们初心就是为了减少开发者的心智负担。所以GoFly框架也是志在简洁简单、开发舒服、减少开发者心智负担。开发者朋友我们一起为快乐编程目标奋斗吧!我们在GoFly全栈开发社区等大家哦!

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

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

相关文章

UML图之构件图例题

答案:C 知识点:构件图描述一个封装的类和它的接口,端口,以及由内嵌的构件和连接件构成的内部结构。 构件图是类图的变体 构件图又叫组件图

24年蓝桥杯及攻防世界赛题-MISC-1

2 What-is-this AZADI TOWER 3 Avatar 题目 一个恐怖份子上传了这张照片到社交网络。里面藏了什么信息?隐藏内容即flag 解题 ┌──(holyeyes㉿kali2023)-[~/Misc/tool-misc/outguess] └─$ outguess -r 035bfaa85410429495786d8ea6ecd296.jpg flag1.txt Reading 035bf…

掌握 Spring:从新手到高手的常见问题汇总

一提起Spring,总感觉有太多知识,无法详尽,有些基础理解就先不说了,相信大家都已经用过Spring了 下面简单针对常见Spring面试题做些回答 核心特性 IOC容器spring事件资源管理国际化校验数据绑定类型转换spirng表达式面向切面编程……

二叉树(二)深度遍历和广度遍历

一、层序遍历 广度优先搜索:使用队列,先进先出 模板: 1、定义返回的result和用于辅助的队列 2、队列初始化: root非空时进队 3、遍历整个队列:大循环while(!que.empty()) 记录每层的size以及装每层结果的变量&a…

边缘智能-大模型架构初探

R2Cloud接口 机器人注册 请求和应答 注册是一个简单的 HTTP 接口,根据机器人/用户信息注册,创建一个新机器人。 请求 URL URLhttp://ip/robot/regTypePOSTHTTP Version1.1Content-Typeapplication/json 请求参数 Param含义Rule是否必须缺省roboti…

2、StarGAN V2

2、StarGAN V2 StarGAN 论文链接:StarGAN StarGAN V2 论文链接:StarGAN V2 在介绍StarGAN V2之前,我们先对StarGAN有一定的了解,StarGAN V2只是在StarGAN的基础上做出了改进,基本的架构是没有变的,只是将…

(11)(2.1.2) DShot ESCs(二)

文章目录 前言 3 配置伺服功能 4 检查RC横幅 5 参数说明 前言 DShot 是一种数字 ESC 协议,它允许快速、高分辨率的数字通信,可以改善飞行器控制,这在多旋翼和 quadplane 应用中特别有用。 3 配置伺服功能 如上所述,如果使用…

《粮油与饲料科技》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问:《粮油与饲料科技》是不是核心期刊? 答:不是,是知网收录的第一批认定 学术期刊。 问:《粮油与饲料科技》级别? 答:省级。主管单位:中文天地出版传媒集团股份有限公司…

Apache ZooKeeper 及 Curator 使用总结

1. 下载 官网地址:Apache ZooKeeper 点击下载按钮 选择对应的版本进行下载 2. 使用 1、解压 tar -zxf apache-zookeeper-3.9.2-bin.tar.gz2、复制配置文件,有一个示例配置文件 conf/zoo_sample.cfg,此文件不能生效,需要名称为…

C#和数据库高级:继承与多态

文章目录 一、继承的基本使用继承的概念:继承的特点:为什么使用继承? 二、继承的关键字1、this关键字2、base关键字3、Protected关键字4、子类调用父类的构造函数的总结: 三、继承的特性继承的传递性:继承的单根性&…

【服务器入门】Linux系统基础知识

【服务器入门】Linux系统基础知识 远程登录与文件传输基础命令与文本编辑vi/vim使用shell脚本基本命令1、目录操作2、文件创建与删改3、文件连接与查看 参考 目前超算使用的系统以Linux系统为主,肯定需要了解一些相关知识。本博客就以本人运行WRF模型所需&#xff0…

Remix在SPA模式下,出现ErrorBoundary错误页加载Ant Design组件报错,不能加载样式的问题

Remix是一个既能做服务端渲染,又能做单页应用的框架,如果想做单页应用,又想学服务端渲染,使用Remix可以降低学习成本。最近,在学习Remix的过程中,遇到了在SPA模式下与Ant Design整合的问题。 我用Remix官网…

Godot游戏如何提升触感体验

在游戏世界中,触感体验至关重要,既能极大提升玩家沉浸感,让其深度融入游戏,在操作角色或与环境互动时,通过触感反馈获得身临其境的真实感(比如动作游戏中角色攻击或受击时的振动反馈,能使玩家更…

花朵识别系统Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练

一、介绍 花朵识别系统。本系统采用Python作为主要编程语言,基于TensorFlow搭建ResNet50卷积神经网络算法模型,并基于前期收集到的5种常见的花朵数据集(向日葵、玫瑰、蒲公英、郁金香、菊花)进行处理后进行模型训练,最…

解决DockerDesktop启动redis后采用PowerShell终端操作

如图: 在启动redis容器后,会计入以下界面 : 在进入执行界面后如图: 是否会觉得界面过于单调,于是想到使用PowerShell来操作。 步骤如下: 这样就能使用PowerShell愉快地敲命令了(颜值是第一生…

【stm32笔记】使用rtt-studio与stm32CubeMx联合创建项目

使用rtt-studio与stm32CubeMx联合创建项目 创建rt-thread项目 设置项目信息 在项目资源管理器中“右击“,创建RRT studio 项目 双击“RT-Thread 项目“。 选择MCU,设置UART,以及调试方式。添加项目名称,点击“完成“按钮。 …

Redis的主从模式、哨兵模式、集群模式

最近学习了一下这三种架构模式,这里记录一下,仅供参考 目录 一、主从架构 1、搭建方式 2、同步原理 3、优化策略: 4、总结: 二、哨兵架构 1、搭建哨兵集群 2、RedisTemplate如何使用哨兵模式 三、分片集群架构 1&#…

集成学习详细介绍

以下内容整理于: 斯图尔特.罗素, 人工智能.现代方法 第四版(张博雅等译)机器学习_温州大学_中国大学MOOC(慕课)XGBoost原理介绍------个人理解版_xgboost原理介绍 个人理解-CSDN博客 集成学习(ensemble):选择一个由一系列假设h1, h2, …, hn构成的集合…

AI运动小程序开发常见问题集锦一

截止到现在写博文时,我们的AI运动识别小程序插件已经迭代了23个版本,成功应用于健身、体育、体测、AR互动等场景;为了让正在集成或者计划进行功能扩展优化的用户,少走弯路、投入更少的开发资源,我们归集了一部分集中的…

Redis数据结构之set

一.set集合特性 集合类型也是保存多个字符串类型的元素的,但和list列表不一样,集合中的元素是无序的,而且元素不能够重复,不仅支持增删查改,还支持交集并集等操作 二.相关命令 1.sadd sadd key members…… 咱们把…