• Golang 大杀器之跟踪剖析 trace
    在 Go 中有许许多多的分析工具,在之前我有写过一篇 《Golang 大杀器之性能剖析 PProf》 来介绍 PProf,如果有小伙伴感兴趣可以去我博客看看。但单单使用 PProf 有时候不一定足够完整,因为在真实的程序中还包含许多的隐藏动作,例如 Goroutine 在执行时会做哪些操作?执行/阻塞了多长时间?在什么时候阻止?在哪里被阻止的?谁又锁/解锁了它们?GC 是怎么影响到 Goroutine 的执行的?这些东西用 PProf 是很难分析出来的,但如果你又想知道上述的答案的话,你可以用本文的主角 g...
  • golang开发:类库篇(三)命令行工具cli的使用
    为什么要使用命令行觉得这个问题不应该列出来,又觉得如果初次进行WEB开发的话,可能会觉得所有的东西都可以使用API去做,会觉得命令行没有必要。其实,一个生产的项目命令行是绕不过去的。比如运营需要导出报表、统计下付费用户、服务不稳定修改下订单状态等等,再者,命令行的工具基本都是内部使用,调试日志可以随意点,退一万步来说,即使有问题了,还可以再次修改。不像API是是随机性的,有些业务发生错误和异常是随机的、不可逆的。怎么使用cli这个主要看下使用案例就一目了然了。首先下载类库包 go get github.co...
  • 使用cron创建定时任务【Golang 入门系列八】
    1、cron 表达式的基本格式 Go 实现的cron 表达式的基本语法跟linux 中的 crontab基本是类似的。cron(计划任务),就是按照约定的时间,定时的执行特定的任务(job)。cron 表达式表示一个时间集合,使用 6 个空格分隔的字段表示。每个子表达式都描述了一个单独的日程细节域是否强制允许值允许特殊字符SecondsYES0-59, - * /MinutesYES0-59, - * /HoursYES0-23, - * /Day of monthYES1-31, - * ? / L WM...
  • Golang 并发编程与定时器
    对于任何一个正在运行的应用,如何获取准确的绝对时间都非常重要,但是在一个分布式系统中我们很难保证各个节点上绝对时间的一致性,哪怕通过 NTP 这种标准的对时协议也只能把时间的误差控制在毫秒级,所以相对时间在一个分布式系统中显得更为重要,我们在这一节中就会介绍 Go 语言中的定时器以及它在并发编程中起到什么样的作用。绝对时间一定不会是完全准确的,它对于一个运行中的分布式系统其实没有太多指导意义,但是由于相对时间的计算不依赖于外部的系统,所以它的计算可以做的比较准确,我们在这一节中就会介绍 Go 语言中用于计算...
  • 也许是最简洁版本,一篇文章上手Go语言
    导读:Go语言是近年来最热门的编程语言,是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。Go语言同时具备开发效率高和执行效率高两大特点,被誉为云计算时代的C语言。本文作者通过一篇文章带你学会Go语言。Go 语言是一门开源语言,能够轻松的构建简单,可靠,高效的软件。—— Golang在很多语言中,解决给定的问题通常有多种方式。工程师需要花费大量的时间思考什么才是解决问题的最优解法。而在Golang中,问题的解法通常只有一种。这一特性大大节约了工程师的时间,而且使得维护大型代码...
  • golang开发:类库篇(四)配置文件解析器goconfig的使用
    为什么要使用goconfig解析配置文件目前各语言框架对配置文件书写基本都差不多,基本都是首先配置一些基础变量,基本变量里面有环境的配置,然后通过环境变量去获取该环境下的变量。例如,生产环境跟测试环境使用同一份配置,但是相应的环境下的变量的值是不一样的,通过环境获其取对应的的key value。没明白没关系,举例子的时候就明白了。PHP的框架yaf。golang的框架beego。对配置的书写和解析基本都是一致的。看下goconfig的解释goconfig 是一个易于使用,支持注释的 Go 语言配置文件解析器...
  • 如何读取yaml,json,ini等配置文件【Golang 入门系列九】
    前面已经讲过一些Go语言的基础知识,感兴趣的朋友可以先看看之前的文章。https://www.cnblogs.com/zhangweizhong/category/1275863.html。实际项目中,还有一个比较重要的基础功能,就是读取相关的配置文件。今天就来说一说,Golang 是如何读取YAML,JSON,INI等配置文件的。 1. json使用JSON 应该比较熟悉,它是一种轻量级的数据交换格式。层次结构简洁清晰 ,易于阅读和编写,同时也易于机器解析和生成。  1. 创建 conf.json:{ ...
  • PBFT概念与Go语言入门(Tendermint基础)
    来自:博客园,作者:莱布尼茨链接:https://www.cnblogs.com/newton/p/9443006.htmlTendermint作为当前最知名且实用的PBFT框架,网上资料并不很多,而实现Tendermint和以太坊的Go语言,由于相对小众,也存在资料匮乏和模糊错漏的问题。本文简单介绍PBFT概念和Go语言[&开发环境]关键知识点,其中大部分都可单独成篇,限于篇幅,文中提供诸多链接供大家深入。日后可能会基于Tendermint出系列博文,此篇纯当基础。概念分布式系统中的异步和共识异步:这里的...
  • Golang 新手可能会踩的 50 个坑(初级篇)
    译文:Golang 新手可能会踩的 50 个坑原文:50 Shades of Go: Traps, Gotchas, and Common Mistakes翻译已获作者授权,转载请注明来源。不久前发现在知乎这篇质量很高的文章,打算加上自己的理解翻译一遍。文章分为三部分:初级篇 1-34,中级篇 35-50,高级篇 51-57前言Go 是一门简单有趣的编程语言,与其他语言一样,在使用时不免会遇到很多坑,不过它们大多不是 Go 本身的设计缺陷。如果你刚从其他语言转到 Go,那这篇文章里的坑多半会踩到。如果花时间...
  • golang实现“类”
    golang是没有“类”这个东西的。golang通过结构体和接口实现类的。golang的Interface,并非你在java和C#中看到的interface,尽管看起来有点像,golang的interface是非侵入式的接口,具体表现在实现一个接口不需要显式地进行声明。但是golang的interface远不是非侵入式接口这么简单,它是golang语言类型的纲,这表现在:1,只要某个类型实现了接口要的方法,那么我们说该类型实现了此接口。该类型的对象可赋值给该接口2,作为1的推论,任何golang的内置对象都...
  • Golang 内置函数 new 和 make 的区别
    Go 语言中 new 和 make 都是内置函数,用于内存的分配,本文主要简述两者使用上的异同与特性。new举个例子:func main() { var i *int *i = 1 fmt.Println(*i)}上面的程序并不会打印1,而会抛 panic 异常,因为i是一个引用类型,需要给它分配内存空间,通俗来说就是指针(内存地址)需要指向一片内存空间才有意义。为 i 分配内存:func main() { var i *int i = new(int) *i = 1 fmt.Println(...
  • 如何使用mysql数据库【Golang 入门系列十】
    之前,已经讲过一些Golang的基础的东西,感兴趣的可以看看以前的文章,https://www.cnblogs.com/zhangweizhong/category/1275863.html,今天简单介绍下Golang是如何使用mysql数据库的。由于Go本身不提供具体数据库驱动,只提供驱动接口和管理。各个数据库驱动需要第三方实现,并且注册到Go中的驱动管理中。github上面的mysql驱动有好几个,我在这里选择的https://github.com/go-sql-driver/mysql。 下面主要从增...
  • Golang并发模型:轻松入门流水线模型
    原文作者:shitaibin链接:https://www.jianshu.com/p/8aa03db51043來源:简书Golang作为一个实用主义的编程语言,非常注重性能,在语言特性上天然支持并发,它有多种并发模型,通过流水线模型系列文章,你会更好的使用Golang并发特性,提高你的程序性能。这篇文章主要介绍流水线模型的流水线概念,后面文章介绍流水线模型的FAN-IN和FAN-OUT,最后介绍下如何合理的关闭流水线的协程。Golang的并发核心思路Golang并发核心思路是关注数据流动。数据流动的过程交给...
  • Golang开发必备: 打造MacOS下开发环境
    学习一门编程语言除了学习它的语法,也要搭建一个正确好用的开发环境,这篇文章分享一下我的Golang开发环境。安装Golang在MacOS下我一般都是用Homebrew:❯ brew update❯ brew install golang❯ go version # 安装完成了go version go1.12.6 darwin/amd64Go环境变量配置安装之后要做一点环境变量配置。GOPATHGOPATH环境变量表示Go的工作目录,这个目录指定了需要从哪个地方寻找GO的包、可执行程序等。用go get下...
  • Go语言爱好者周刊:第 3 期
    这里记录每周值得分享的 Go 语言相关内容,周日发布。欢迎投稿,推荐或自荐文章/软件/资源等,请提交 issue[1] 。鉴于大部分人可能没法坚持把英文文章看完,因此,周刊中会尽可能推荐优质的中文文章。优秀的英文文章,我们的 GCTT 组织会进行翻译。文中链接较多,微信不可点,可以通过阅读原文查看。(题图:华为鸿蒙 HDC 2019 大会)华为消费者业务 CEO 余承东在 2019-08-09 举行的华为开发者大会上介绍,HarmonyOS 是“第一个适用于所有场景的基于微内核的分布式操作系统”,它可以运行...
  • 关于Golang GC的一些误解--真的比Java算法更领先吗?
    导读:Golang的GC算法经过12个版本的发展,现在已经非常成熟了。本文对Golang的GC进行深入调研,并且通过具体实例揭示了Golang GC的方方面面。首先强调下本文的起因是在高可用架构后花园群的一次聊天,大家在争论Golang的GC到底是类似Java的ZGC还是类似Java的CMS GC。我个人的看法是Golang的GC是类似于Java的CMS GC,官方的mgc的注释这么说的:// The GC runs concurrently with mutator threads, is type ac...
  • 基于Golang的加密货币挖矿恶意软件攻击活动
    下图中的代码表明可以扫描Atlassian’s Confluence服务器的漏洞CVE-2019-3396,该漏洞之前被爆用于传播加密货币挖矿恶意软件。还会设定一个cron任务来从Pastebin下载和执行最新版本的恶意软件。5月份就有一款基于Golang的传播器用于另一个加密货币挖矿恶意软件。对安全分析人员来说,基于Golang的恶意软件更难分析,因为与其他语言相比,该恶意软件在恶意软件中的使用比较少。
  • 从零开始实现简单的webapi框架【Golang 入门系列十一】
    本项目完全使用原生开发,没有使用任何WEB框架和ORM。这样大家有一个更深刻的了解,这样以后介绍web框架,orm框架的时候,学习起来应该会简单一点。项目架构下图这种架构模式相信大家应该十分清楚Controller组合封装Controller"基类"封装package frameworktype Controller struct { Data interface{}}UserController定义了用户注册,登录和查询等简单的三个接口package controllerimport /** * r.PostFormValue : 可以解析 Post/PUT Content-Type=application/x-www-form-urlencoded 或 Content-Type=multipart/form-data */type UserConterller struct {}var userService = newfunc Router { router.Router router.Router router.Router}//POST Content-Type=application/x-www-form-urlencodedfunc register { username := r.PostFormValue password := r.PostFormValue if utils.Empty || utils.Empty { microcloud.ResultFail return } id := userService.Insert if id <= 0 { microcloud.ResultFail return } microcloud.ResultOk}//POST Content-Type=application/x-www-form-urlencodedfunc login { username := r.PostFormValue password := r.PostFormValue if utils.Empty || utils.Empty { microcloud.ResultFail return } users := userService.SelectUserByName if len == 0 { microcloud.ResultFail return } if users[0].Password != nil { fmt.Println return 0 } return id}func SelectUserByName []model.User { rows, err := framework.DB.Query("SELECT * FROM user WHERE username = ?= nil { fmt.Println return nil } var users []model.User for rows.Next() { v
  • 介绍一个超好用的orm库gorm【Golang 入门系列十二】
    实际上,为提高开发效率,一般都会使用一些orm框架,把数据库层屏蔽,用户看到的只有对象而无需我们手动做一些转换,这样在使用的时候就非常方便。golang也有很多优秀的orm框架,今天就来介绍介绍gorm。gorm 跟其他框架有什么不一样?库安装go get -u github.com/jinzhu/gorm数据库连接db, err = gorm.Open("mysql", "root:root@tcp(127.0.0.1:3306)/irisapp?= nil { panic}连接比较简单,直接调用 gorm.Open 传入数据库地址即可。gorm支持基本上所有主流的关系数据库,只是连接方式上略有不同,这里我用的 mysql为例吧。表定义type Product struct { ID int `gorm:"primary_key"` Code string `gorm:"type:varchar;"` Price int `gorm:"type:int;"` Name string `gorm:"type:varchar;"` Mail string `gorm:"type:varchar;"` CreatedAt time.Time}创建表if !
  • Golang 优化之路——HTTP长连接
    1netstat-nat|grep:8080|grepTIME_WAIT|wc-l217731TIME_WAIT状态多,简单的说就是服务端主动关闭了TCP连接。而且占用太多,有可能会占满端口,一台服务器最多只能有6万多个端口;TCP 相关长连接的概念包括TCP长连接和HTTP长连接。首先得保证TCP是长连接。1funcSetKeepAliveerror2SetKeepAlive sets whether the operating system should send keepalive messages on the connection. 这个方法比较简单,设置是否开启长连接。http 服务器启动之后,会循环接受新请求,为每一个请求(连接)创建一个协程。=nil{13}1415serverHandler{c.server}.ServeHTTP16}17}这个循环是用来做什么的?defer函数可以让协程结束之后关闭 TCP 连接。readRequest函数用来解析 HTTP 协议。=nil{24returnnil,err25}2627req.Method,req.RequestURI,req.Proto,ok=parseRequestLine2829mimeHeader,err:=tp.ReadMIMEHeader()30}具体参与解析 HTTP 协议的部分是ReadRequest方法,而调用它之前,设置了读写超时时间。
官方公众号