uber_go_guide解析(一)
前言
实力有限,guide啃着好费劲
原地址https://github.com/xxjwxc/uber_go_guide_cn
加我自己的体会和补充
基于Golang 1.14
正文
Interface 合理性验证
在代码编译时验证接口的合理性, 通过 var 一个空变量的方式,如果你的接口没有实现好, 在创建变量时会报错

感觉不实用
接收器与方法
如果我们建立map时value不为指针的话,我们是无法使用接收指针的方法的,因为map的value可变

Mutex锁
mutex锁的默认值就是有效的, 因此在生成锁的时候不用new就行

如果是结构体加锁,这个结构体在内部使用,那么无需给这个锁设立字段

反之则需要

在边界处拷贝 Slices 和 Maps
注意Maps和Slices的值是可变的,所以更改内存地址的值会导致真正的值发送变化


此风险同样存在于返回值中

同样使用copy可以解决

使用defer释放资源
defer本身消耗非常小的资源,尤其是1.14版本又大大优化了defer
所以使用defer来进行文件关闭等操作,大大提高可读性,同时避免忘记关闭的情况和中间出现问题导致没有执行关闭的情况

channel的大小是1或者是无缓冲
在使用channel时,应该考虑好channel的大小,梳理好逻辑流程,将channel大小设置为1或者无缓冲是最好的和最常见的

从1开始枚举
在go中,实现枚举通过设置const和iota,由于枚举从1开始,但是iota初始值为0,所以记得iota+1

当然在某些情况下,从0开始时有益的, 他表达的意思可能是, 如果你枚举时从0开始,但是因为创建新int类型的变量时默认值是0
此时如果你拿着变量去枚举就乱了.但是当你把0枚举成一个默认的值就没有问题,但是一般枚举是这样用的

就算你使用 Operation(变量) 强转然后调用方法也是会返回Error因为都不匹配
使用time包处理时间
时间的处理其实是比较复杂的逻辑,比如每月几天,时间换算等
所以使用官方的time包可以节省更多的开发时间
需求1: 计算这个时间是否是活跃的(当前时间大于任务开始时间且小于结束时间)

需求2:时间参数

需求3:计算24小时后的时间

在与外部的交流中也使用标准时间格式化格式,例如
命令行格式化通过 flag 包的 time.ParseDuration
json通过 json 包的 UnmarshalJSON
sql 将 DATETIME 或 TIMESTAMP 列转换为 time.Time
yaml 也支持 time.Time 格式等等
无法强行适配对接,也可将其转化为时间戳进行发送,当然这一切都必须双方约定好,并且要在JSON的字段名里体现出这是时间戳
uber_go_guide解析(一)的更多相关文章
- uber_go_guide解析(三)(规范)
前言 一主要讲的是容易忽略的错误,可能在build时都不会体现出来但是在使用时出现问题 二主要讲的是一些可以提高代码效率的用法 本篇则讲解一些规范,不是强制的但是根据规范会提高代码的可读性, 减少BU ...
- uber_go_guide解析(二)
前言 接上回 正文 错误消息 Go中声明错误有几种方式 errors.New() 简单的声明静态字符串信息的错误 fmt.Errorf 可以格式化插入信息的错误 自己实现 Error() 方法 使用e ...
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
- .NET Core中的认证管理解析
.NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...
- Html Agility Pack 解析Html
Hello 好久不见 哈哈,今天给大家分享一个解析Html的类库 Html Agility Pack.这个适用于想获取某网页里面的部分内容.今天就拿我的Csdn的博客列表来举例. 打开页面 用Fir ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例
前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...
- Asp.Net WebApi核心对象解析(下篇)
在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...
随机推荐
- 人社部新职业,Panda Global发现区块链新职业榜上有名!
近日,为了助力新冠肺炎疫情的防控,扎实做好"六稳"工作,全面落实"六保"任务,促就业拓岗位,人力资源社会保障部联合市场监管总局.国家统计局近日正式向社会发布一批 ...
- kafka-java消费者与生产者代码示例
引入依赖 <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka_2.11 ...
- nginx: [emerg] bind() to 0.0.0.0:80 failed (48: Address already in use)
Mac上启动nginx报如上错误,原因是80端口已被占用,可能有些服务未能成功关闭. 解决:键入命令 sudo nginx -s stop ( 或 sudo nginx -s quit) ,然后 s ...
- Docker安装rocketmq踩坑指南
Docker 网络 Docker容器运行的时候有host.bridge.none三种网络可供配置. 默认是bridge,即桥接网络,以桥接模式连接到宿主机:host是宿主网络,即与宿主机共用网络:no ...
- 最短路径——BFS算法
最短路径--BFS算法 单源最短路径问题 每对顶点间的最短路径 BFS求无权图的单源最短路径 bool visited[MAX_VERTEX_NUM]; //访问标记数组 //广度优先遍历 void ...
- JavaSE14-集合·其一
1.Collection集合 1.1 集合体系结构 集合 (接口)Collection:单列 (接口)List:可重复 (实现类)ArrayList (实现类)LinkedList (接口)Set:不 ...
- centos下配置Apache的https强制跳转
vim /etc/httpd/conf/httpd.conf 新增如下三行 RewriteEngine on RewriteCond %{HTTPS} !=on RewriteRule ^(.*) ...
- 快用Django REST framework写写API吧
Django默认是前后端绑定的,提供了Template和Form,现在流行前后端分离项目,Python大佬坐不住了,于是便有了Django REST framework:https://github. ...
- TLS 协议
一.背景 参与了一个Sofa-RPC开源项目,认领了TLS的任务,记录下这次宝贵的经历,并感谢章哥的信任以及在整个过程中对我的帮助. 负责的部分不难,主要是使用h2(HTTP 2加密)协议,完成RPC ...
- ssl证书---验证域名数量分类
单域名SSL证书 : 单一域名 多域名SSL证书 : 多个域名 通配符SSL证书 : 通配符域名