Goroutine + Channel 实践

背景 在最近开发的项目中,后端需要编写许多提供HTTP接口的API,另外技术选型相对宽松,因此选择Golang + Beego框架进行开发。之所以选择Golang,主要是考虑到开发的模块,都需要接受瞬时大并发、请求需要经历多个步骤、处理时间较长、无法同步立即返回结果的场景,Golang的goroutine以及channel所提供的语言层级的特性,正好可以满足这方面的需要。 goroutine不同于thread,threads是操作系统中的对于一个独立运行实例的描述,不同操作系统,对于thread...阅读全文

阅读:38260 评论:5

golang学习之旅:使用go语言操作mysql数据库

1.下载并导入数据库驱动包 官方不提供实现,先下载第三方的实现,点击这里查看各种各样的实现版本。这里选择了Go-MySQL-Driver这个实现。地址是:https://github.com/go-sql-driver/mysql/。 然后按照里面的说明下载驱动包: $ go get github.com/go-sql-driver/mysql 最后导入包即可: import "database/sql" import _ "github.com/go-sql-driver/mysql" 2.连...阅读全文

2015-05-06 23:56 michaellau
阅读:57471 评论:0

Golang HTTP GET POST请求

package main import ( "fmt" "io/ioutil" "net/http" "os" "strings" ) func GET() { client := &http.Client{} reqest, err := http.NewRequest("GET", "http://www.baidu.com/", nil) //建立一个请求 if err != nil { fmt.Println("Fatal error ", err.Error()) os.Exit(0)...阅读全文

2015-05-18 14:20 dq4402935
阅读:43856 评论:0

Go连接MySql数据库too many connections

Go中连接数据库的连接池:当你需要和数据库通信时,就会从连接池里面取出一个连接,和数据库交互。使用完的闲置的连接会回到连接池,等待下一次的调用。如果连接池里面没有闲置的连接,会自动创建一个新的连接出来。其中有一段: An sql.Row returns the connection when Scan() is called, sql.Rows returns either when Close() is called or all rows have been iterated over wi...阅读全文

阅读:7689 评论:2

go-parser-语法分析

每一种语言都会有一个定义良好的语法结构.函数是由申明和语句构成的,而语句又是由表达式构成的.经常用来描述语法的是BNF[1].Go使用的是相应的变种,在Go的官方文档中有很详细的spec描述[2].一门语言的设计其实就在这份描述当中,这是一门语言的语法和规则的定义,是表面程序员可以接触到的部分,而运行时却可以改变,这相当于和程序员约定的接口,只要按照这个接口编写源代码,就能产生正常可以编译的二进制文件,但是最后的二进制文件如何运行,对于每条语法转换成了什么,有什么优化都是编译器优化和运行时的工作...阅读全文

阅读:12624 评论:1

从小案例学习Go语言-将Excel各部分内容分发到不同的电子邮箱

关键点: Go语言读取Excel Go语言正则表达式 Go语言发送电子邮件 案例场景 今天公司行政部小妹妹跑来问,有什么办法可以把工资条自动发送到每个员工的企业邮箱里?公司每个员工的工资条以Excel的形式放在同一个文档里,之前用OA发送,复制粘贴,操作相当简单,但是公司要求改用电子邮件发送工资条后,给行政部的同事增加了较大的工作量,而且每个月都需要做一次,这很浪费时间,于是爽快的答应帮忙解决。 情况梳理 公司工资条大概这个样子的 为了方便,行政部门会把所有人的工资条按顺序排列在同一个Excel...阅读全文

阅读:11007 评论:8

教你如何让go get畅通无阻

目前golang开发有一些热度,仅仅在github上面就有大量的用go重写的项目或go开发创新项目。 go开发者经常需要使用go get来下载和安装第三方库或软件。经常会碰到go get无法访问,因为这些第三方库或软件或项目对应的网站被墙了。 很多人都是用shadowsocks来翻墙,但是shadowsocks是基于socks5协议的。对于go get并没有什么用处。如果我们能把socks5代理转为http代理,那就可以访问了。 一个牛逼的国人用go开发了一个可以将socks5代理转为http代...阅读全文

阅读:18157 评论:2

golang实践-如何实现高性能的定时任务管理器

前段时间,因为业务需要,实现了单协程、单timer的多定时任务管理器,其特点在于: 1、能够添加一次性、重复性任务,并能在其执行前撤销或频繁更改。 2、支持同一时间点,多个任务提醒。 3、适用于中等密度,大跨度的单次、多次定时任务。 4、支持10万次/秒的定时任务执行、提醒、撤销或添加操作,平均延迟10微秒内 5、支持注册任务的函数调用,及事件通知。 代码比较简单,也分享到github,有兴趣的可以看看:定时器源代码。目前版本还处于维护阶段,接口可能会有点变化,或许还会根据我们的业务调整增加第三...阅读全文

2017-02-22 14:08 qq_26981997
阅读:13625 评论:0

golang并发编程——goroutine使用指南

并发是golang最有核心竞争力的功能,golang的并发依赖的并不是线程,而是协程。协程和线程有什么区别呢?最大的区别就是协程比线程更为轻量。默认情况中一个进程最大可以启动254个线程,这个数值也可以改为无限制,但主机资源消耗就会非常严重。而使用协程就不同了,一个进程可以轻轻松松启动上万个协程而毫无压力。 因此本篇文章就来说说在golang中如何创建使用协程。 golang设计协程的目的,一方面是为了提高并发效率,另外一方面就是尽可能发挥多核CPU的能力。golang内置的调度器,可以让多核C...阅读全文

2017-03-04 16:33 skh2015java
阅读:1535 评论:0

Golang比较两个slice是否相等

Compare two string slices in GoLang 开发中经常会遇到需要比较两个slice包含的元素是否完全相等的情况,一般来说有两个思路: reflect比较的方法 循环遍历比较的方法 这里用检查两个字符串slice是否相等的例子来测试一下这两种思路的效率我当然知道你知道reflect方法效率更差啦 reflect比较的方法 func StringSliceReflectEqual(a, b []string) bool { return reflect.DeepEqual...阅读全文

2017.04.13 03:25 Kenshinsyrup
阅读:5828 评论:0

Gin框架与《Web Development with Go》实践(一)

golang的标准web开发 使用golang的标准库net/http包开发web应用是非常简单的。对于此部分内容,在其他的书中或网上资料里已有详尽说明,在此不再赘述。gin框架简介通过查阅资料及网上讨论,发现了一些现在仍然比较流行的web框架。它们有:beego、iris、gin、echo ……其中gin就是此系列文章将要使用的。关于gin的基本使用方法,请查阅:gin的github地址 Go语言web框架一本质量上乘的好书没办法,这是一本洋书,一本能够深入浅出,质量上乘的洋书;我自己也收集了...阅读全文

2017.06.05 20:09 Cyberpunk_ZYM
阅读:8733 评论:0

记一次获得3倍性能的go程序优化实践,及on-cpu/off-cpu火焰图的使用

先把结论列在前面: Golang的性能可以做到非常好,但是一些native包的性能很可能会拖后腿,比如regexp和encoding/json。如果在性能要求较高的场合使用,要根据实际情况做相应优化。 on-cpu/off-cpu火焰图的使用是程序性能分析的利器,往往一针见血。虽然生成一张火焰图比较繁琐(尤其是off-cpu图),但绝对值得拥有! 之前一直使用Logstash作为日志文件采集客户端程序。Logstash功能强大,有丰富的数据处理插件及很好的扩展能力,但由于使用JRuby实现,性能...阅读全文

阅读:4720 评论:4

面向未来的API —— GitHub GraphQL API 使用介绍

> > 本文根据GitHub开发者文档,整理翻译了GitHub GraphQL API的使用方法,你可以了解到GraphQL的基本概念、GitHub > GraphQL API的使用,两个实际的使用案例,以及使用Explorer查询GitHub GraphQL API 今年5月22日,GitHub 发文 ( http://link.zhihu.com/?target=https%3A//github.com/blog/2359-introducing-github-marketplace-a...阅读全文

阅读:1932 评论:0

ELK5.5+Filebeat分布式日志系统

最近在用k8s管理项目, 每个容器都会打印自己的日志, 目前的解决方案是用ntfs4在线文件系统统一存储, 考虑到性能问题, 还是将日志打印到宿主机, 然后通过elk分布式日志收集. 但如果在每台服务器部署logstash是比较耗资源的, 毕竟是java项目. 好在作者重新用golang写了一套新的采集工具filebeat, 性能更高, 暂用资源也更少, 所以这里在每台服务器部署filebeat采集日志, 然后统一缓存到redis, 而elk所在的服务器通过logstash从redis里面取数据...阅读全文

2017.07.27 00:35* 殷临风
阅读:5079 评论:0

Nginx缓存引发的跨域惨案

1. 前言贵金属wap版直播间上线后,偶尔有用户反馈,在进入wap直播间的时候,出现空白页面,但是重新刷新又可以正常显示了。我们曾一度认为是网络请求异常或兼容问题,直到开发PC版直播间,在进行调试中,同样遇到了“白屏”问题,才引起了足够重视,并进行了问题跟踪与分析。现在跟大家分享一下,这种偶然现象出现的原因。 我们的直播间落地页在fa.163.com 系统,而直播间内容,是通过 向直播间系统 qz.fa.163.com 发起Ajax请求获取的。在出现“白屏”的时候,可以通过浏览器的调试窗口,可以...阅读全文

2017-07-21 00:00 网易乐得技术团队
阅读:1343 评论:0

【GO语言】合理配置GOMAXPROCS提升一倍以上的性能

GOMAXPROCS 用默认的,就是CPU的硬件线程数目, 对于大部分IO密集的应用是不合适的。 至少应该配置到硬件线程数目的5倍以上, 最大256。 具体参见。 这是为什么呢? 我们来复习下Go的线程模型,M/P/G 三种对象,分别代表 操作系统线程、协程执行令牌、协程; 在任何情况下,Go运行时并行执行(注意,不是并发)的goroutines数量是小于等于P的数量的。 如果一个持有P的M,由于P当前执行的G调用了syscall而导致M被阻塞,那么: 注意 注意 注意 关键点:此时,GO的调度...阅读全文

2017-08-09 10:14:40 LinkerLin
阅读:2105 评论:0

剖析使Go语言高效的5个特性(2/5): 函数调用不是免费的

翻译原文链接 转帖/转载请注明出处 英文原文链接 发表于2014/06/07 函数调用不是免费的 一个函数调用有三个步骤。创建一个新的堆栈框(stack frame)并把调用者的详细信息记录下来。把任何会被被调用函数用到的寄存器内容保存到堆栈。计算被调用函数的地址,并执行跳转指令到那个新的地址。 因为函数调用是频繁操作,CPU的设计者花费了很多精力来优化这个过程,但他们不可能消除所有的开销。 根据被调用函数的功能,这个调用开销可能是可以忽略不计的,也可能是非常显著的。有一个降低调用开销的优化技术...阅读全文

阅读:1862 评论:0