前言

实力有限,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解析(一)的更多相关文章

  1. uber_go_guide解析(三)(规范)

    前言 一主要讲的是容易忽略的错误,可能在build时都不会体现出来但是在使用时出现问题 二主要讲的是一些可以提高代码效率的用法 本篇则讲解一些规范,不是强制的但是根据规范会提高代码的可读性, 减少BU ...

  2. uber_go_guide解析(二)

    前言 接上回 正文 错误消息 Go中声明错误有几种方式 errors.New() 简单的声明静态字符串信息的错误 fmt.Errorf 可以格式化插入信息的错误 自己实现 Error() 方法 使用e ...

  3. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  4. .NET Core中的认证管理解析

    .NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...

  5. Html Agility Pack 解析Html

    Hello 好久不见 哈哈,今天给大家分享一个解析Html的类库 Html Agility Pack.这个适用于想获取某网页里面的部分内容.今天就拿我的Csdn的博客列表来举例. 打开页面  用Fir ...

  6. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  7. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  8. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  9. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

随机推荐

  1. js onreadystatechange 和 onload的区别

    IE的script 元素只支持onreadystatechange事件,不支持onload事件. FF的script 元素不支持onreadystatechange事件,只支持onload事件. 如果 ...

  2. NOI Online 题解

    T1 对\(t_i = 1\)的边,将\(u_i, v_i\)连一条边权为\(1\)的边.否则连一条边权为\(0\)的边. 对于每一个连通块,若图中不存在一条边权之和为奇数的圈,则可以将这个连通块二染 ...

  3. sqli-labs lexx25-28a(各种过滤)

    less-25AND OR 过滤 less-25a基于Bool_GET_过滤AND/OR_数字型_盲注 less-26过滤了注释和空格的注入 less-26a过滤了空格和注释的盲注 less-27过滤 ...

  4. CSS3全览_文本+视觉+盒子+背景颜色

    CSS全览_文本+视觉+盒子+背景颜色 目录 CSS全览_文本+视觉+盒子+背景颜色 1. 文本属性 2. 视觉格式化基础 3. 内边距, 边框, 轮廓和外边距 4. 颜色, 背景和渐变 作者: ht ...

  5. oracle 修改默认临时表空间

    --查询当前数据库默认临时表空间名 select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE'; - ...

  6. SpringBoot + Layui +Mybatis-plus实现简单后台管理系统(内置安全过滤器)

    1. 简介   layui(谐音:类UI)是一款采用自身模块规范编写的前端UI框架,遵循原生HTML/CSS/JS的书写与组织形式,门槛极低,拿来即用.其外在极简,却又不失饱满的内在,体积轻盈,组件丰 ...

  7. Sharding-JDBC分库分表简单示例

    1. 简介 Sharding是一个简单的分库分表中间件,它不需要依赖于其他的服务,即可快速应用在实际项目的分库分表策略中. 2. 初始化数据库(db0.db1.db2) 1 #创建数据库db0 2 C ...

  8. Linux下安装ffmpeg,视频格式转换

    下载ffmpeg 从ffmpeg官网:http://ffmpeg.org/download.html 下载最新的ffmpeg安装包,然后通过如下命令解压: 解压 ffmpeg-*.tar.bz2 文件 ...

  9. java中将信息写入excel

    //实体类 package com.cn.peitest.excel; import java.io.Serializable; /** * 员工基本信息 * * @author pei */ pub ...

  10. 使用mybatis执行对应的SQL Mapper配置中的insert、update、delete等标签操作,数据库记录不变

    我使用springMVC集成mybatis,执行SQLMapper配置文件里的insert操作,发现程序没有报错,但数据库表里却没有刚才插入的记录.查了很多资料,终于在一篇博客上找到了答案:在执行完方 ...