一篇文章教会你如何像大神一样写代码

陌无崖 · · 1282 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

我是陌无崖,专注于Golang高级开发,微服务,消息队列

导语

当我们还是小白,我们在写代码的时候,总会为了省事,就什么代码都写在一个文件里,如果一个文件不够,分两个,没有一个很好的规范性,最终的结果可能是这样的


image

在一个包中充斥着各种文件,过了一段时间,如果想要看看这里面的代码,变得无从下手。今天我就给大家说说在用Golang语言写代码时该如何正确的进行分类。当然其它语言部分适用。

分包前我们应该懂什么

一、配置(conf)

这一层是对我们的基础配置文件的一个存储,比如我们的存储库mysql,需要设置mysql连接地址,最大连接数、密码、数据库名字等,我们将这些转换成配置文件中的变量。我们需要使用的时候,只需要加载到一个实体中就可以了,为什么要这样做,在大型程序中,我们的代码一旦上线后如果要更换数据库,或者添加数据库,最好的做法就是不用修改我们的运行代码,我们只需要从服务器中找到相应的配置文件进行修改就可以了,这样代码运行时会自动读取到新的连接。而相反,如果我们直接将这些写进代码中,想想一旦你要修改,你需要修改的不仅仅是一个文件,或许很多文件中相关的代码都要进行修改。因此这一层我们叫它基础配置层。这一层文件经常用到的就是json或者yml格式的文件,下面是一个yml格式的例子


image

二、实例化配置(config)

上面说到了我们的一个conf包存放配置文件,那么对这些配置文件进行实例化便需要config这个包。在config包中我们对配置文件进行一个接口的设置和结构体的设置,比如mysql中


image

用这个结构体实现接口中的方法。同时我们可以在这个包中添加一个初始化我们实体的一个函数,即将配置文件中的数据存储到相应的结构体中。

三、模型层(model)

这里面是我们实体类的数据库操作层,这一层将实例化一个模型和服务接口,然后暴露给业务逻辑层进行使用,因此我们同样需要定义接口和结构体,比如说在一个用户服务中,有一个需求是根据姓名进行登录,我们可以先定义接口如下:


image

然后定义一个结构体服务模型去实现里面的方法


image

这里需要注意的是在Golang中如果结构体名字首字母小写代表私有类,里面的属性不能直接调用,因此我们可以定义一个获取的方法。在这个方法中细心的小伙伴会看出来我返回的是一个接口,这样做的目的一方面保护我们实体,同时可以以后方便实现多态。
image

那么如果我们想要使用这里面的方法,就必须初始化我们的服务模型,然后就可以用获取服务的函数获取到相应的模型服务。


image

业务逻辑层(handler)

在这一层中的代码主要是暴露我们的代码在外部,当然在实际应用中我们是将这些服务进行了服务注册,这一层我们将会使用到model层中服务,这里以RPC进行讲解,我们都知道在使用rpc远程调用之前,我们需要将我们的服务代码进行注册,因此可以将这部分写进这个包如,当由外部请求到达时首先便会到这个函数实现业务逻辑,然后进行数据的返回。


image

这样我们的基础业务便写完了,但是对于网络请求中如何将请求正确映射到我们的后台服务呢?

web层接入

如果你看过我之前的micro系列的文章,你会很轻松的解决这个问题,在micro中提供了web层的处理,只要开启一个Web服务就可以达到目的了。如果不会的,可以看看我之前的文章,首先需要创建一个服务


image

注册接口


image

handler实现
image

End:现在找一个业务进行联系吧。获取更多知识分享,欢迎文章末尾微信关注。

推荐阅读


本文欢迎转载,转载请联系作者,谢谢!


打开微信扫一扫,关注微信公众号

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:陌无崖

查看原文:一篇文章教会你如何像大神一样写代码

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1282 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传