前言 最近在研究代码质量检测和分析这一个环节,当然代码质量分析是devops中持续集成部分非常重要的一个环节。涉及到团队协作的时候,很多公司会有自己的一套规则,最熟悉的是阿里巴巴的java代码参考手册,专家总结,大家按照规则去写代码。但是对于devops,有了规则远远不够,还需要提高代码检查的自动化程度,以及与其他的环节合作衔接上。那么如果没有代码质量把控这个环节,那么可能带来以下问题: 抽象不够,大量重复的代码。 变量命名各种风格。驼峰派,下划线派等。 if else 嵌套太深。 不写注释,或...
-
gometalinter-golang代码质量检查分析工具
-
[译]像牛人一样改进你的Go代码
目录 [−] gofmtgocyclointerfacerdeadcodegotypemisspellstaticcheckgosimplegoconst 原文: Lint your #golang code like a mad man!, 作者: Arsham Shirvani 我使用下面的工具来改进我的代码,除了vendor文件夹。我的操作系统是GNU/Linux,但是稍微修改一下脚本应该也能运行在你的操作系统上。我使用glide来处理依赖(vendor),但你也可以使用你的包依赖管理工具...
-
For Range 的语义
## 前言 为了更好地理解本文中提及的内容,这些是需要首先阅读的好文章: 下面列出 4 篇文章的索引: - 1. [Go 语言机制之栈和指针](https://studygolang.com/articles/12443) - 2. [Go 语言机制之逃逸分析](https://studygolang.com/articles/12444) - 3. [Go 语言机制之内存剖析](https://studygolang.com/articles/12445) - 4. [Go...
-
Golang中匿名组合实现伪继承
本文同时发布于个人CSDN博客:https://blog.csdn.net/ggq89/article/details/82084338 "Go语言的面向对象机制与一般语言不同。 它没有类层次结构, 甚至可以说没有类; 仅仅通过组合( 而不是继承) 简单的对象来构建复杂的对象。" -- 《Go语言圣经》 1. 结构体嵌入和匿名成员 Go语言提供别样的 结构体嵌入 机制,让一个结构体包含另一个结构体类型的 匿名成员 , 这样就可以通过简单的点运算符x.f来访问匿名成员链中嵌套的x.d.e.f成员。...
-
Go语言map底层实现
``map``是Go语言中基础的数据结构,在日常的使用中经常被用到。但是它底层是如何实现的呢? Golang中``map``的底层实现是一个散列表,因此实现``map``的过程实际上就是实现散表的过程。在这个散列表中,主要出现的结构体有两个,一个叫``hmap``(``a header for a go map``),一个叫``bmap``(``a bucket for a Go map``,通常叫其``bucket``)。这两种结构的样子分别如下所示: ...
-
Golang一些有趣的特性
1、变量定义的几种方式 如: //方式一:普通定义 var a int = 1 fmt.Println("a = ", a) //方式二:类型推导 var b = 10 fmt.Println("b = ", b) //方式三:省略var name := "tom" fmt.Println("name = ", name) //多变量声明 var n1, n2, n3 int fmt.Println("n1 = ",n1 ,"n2 = ", n2,"n3 = ",n3) var n4, name...
-
并发环境应用map的解决方案
众所周知,golang的map是非协程安全的(go1.6版本以后,go1.6之前读安全),而并发读写map的需求应该是很普遍的。举例如下: package main import "fmt" func main() { a := make(map[int]bool, 0) for i:=0;i<100;i++{ go func() { for i := 0; i < 20000; i++ { a[i] = false fmt.Printf("%v %v\n",i,a[i]) } }() } } ...
-
Golang处理大数据时使用高效的Pipeline(流水线)执行模型
21天精品区块链课程免费学习,深入实战行家带路,助力开发者轻松玩转区块链! >>> Golang被证明非常适合并发编程,goroutine比异步编程更易读、优雅、高效。本文提出一个适合由Golang实现的Pipeline执行模型,适合批量处理大量数据(ETL)的情景。 想象这样的应用情景: (1)从数据库A(Cassandra)加载用户评论(量巨大,例如10亿条); (2)根据每条评论的用户ID、从数据库B(MySQL)关联用户资料; (3)调用NLP服务(自然语言处理),处理每条评论; (4)...
-
golang 内存分析/动态追踪
21天精品区块链课程免费学习,深入实战行家带路,助力开发者轻松玩转区块链! >>> golang pprof 当你的golang程序在运行过程中消耗了超出你理解的内存时,你就需要搞明白,到底是 程序中哪些代码导致了这些内存消耗。此时golang编译好的程序对你来说是个黑盒,该 如何搞清其中的内存使用呢?幸好golang已经内置了一些机制来帮助我们进行分析和追 踪。 此时,通常我们可以采用golang的pprof来帮助我们分析golang进程的内存使用。 pprof 实例 通常我们采用http a...
-
Go 语言的错误处理
Go 语言的错误处理是基于明确的目的而设计的。你应该从函数中返回所有可能的错误,并且检查/处理这些返回值。和其他语言相比,这一点可能看起来有些繁琐和不人性化,其实并不是这样的。让我们来看看一些基本的例子,然后继续做一些较重要的事情。 ## Non 错误 实际上 Go 有个概念 non-error。这是一个语言特性,不能用在用户自定义函数中。最明显的例子就是从 map 中通过 key 获取值。 ```go if val, ok := data["key"]; ok { //...
-
Go 中的数据结构 -- Interface
Go 中的 interface 可以静态编译,动态执行,是最让我感到兴奋的一个特性。如果要让我推荐一个 Go 语言的特性给其他的语言,那我一定会推荐 interface。 本文是我对于 Go 语言中 interface 类型在 gc 编译器上实现的一些想法。Ian Lance Taylor 写了两篇关于 interface 类型在 gccgo 中实现的[文章](https://www.airs.com/blog/archives/277)。本文与之最大的不同是本文有一些图片可以更形象的说明...