go语言
文章平均质量分 59
稳健明
全栈是未来的趋势,做全栈开发。慢慢来,坚持住明天的我会感谢今天的自己。wechat:wzm921128
展开
-
golang标准库中sync.Mutex性能测试
笔者原来是使用C++开发的,一直以为互斥锁时要是进程间通信中信号量的一个特例。在使用golang开发的时候,一直都很谨慎使用互斥锁,能用原子变量实现的就用原子变量实现。直到今天,测试了下golang标准库中sync.Mutex的性能以后,彻底的感觉到自己以前的无知和自以为是。经过笔者测试,两者的性能几乎没差异,有差异估计就是一点点封装消耗的性能成本。查看标准包中sync.Mutex实现的源码发现是...原创 2019-04-09 15:48:47 · 1641 阅读 · 2 评论 -
学习回顾算法(插值查找算法)
插值查找算法概述插值查找算法,是二分法查找算法的改进。将查找点的选择改为自适应选择,可以提高查找效率。 算法注意点和二分法查找一样,都需要列表先排好序。插值查找算法实现1、golang实现package mainimport ( "fmt")func InsertionSearch(values []int, key int) int { if len(values) == 0原创 2017-12-04 13:10:47 · 409 阅读 · 0 评论 -
学习回顾算法(二分法查找)
二分法查找概述二分法查找也称为折半查找,属于有序查找算法。用给定值key先和中间结点的关键字比较,中间结点把线形表分成两个字表,若相等则查找成功;若不相等,再根据key与该中间结点关键字的比较结果确定下一步查找哪个字表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。前提条件 列表中元素必须是有序的,如果是无须的则需要进行排序操作。二分查找示例 假如有一组数为1,3,5,7,9,11,原创 2017-12-04 11:04:50 · 353 阅读 · 0 评论 -
学习回顾算法(顺序查找算法)
顺序查找算法概述顺序查找算法是在一个已知无序(或有序)队列中找出关键字相同的数的具体位置。顺序查找算法原理 让关键字和队列中的数从最后一个开始逐个比较,直到找出与给定关键字相同的数为止。如果扫描结束已让没有找到关键字,表示查找失败。顺序查找算法分析 时间复杂度: 平均:假设每个数据元素的概率相等 (n + 1)/2 查找不成功:n+1 复杂度:O(n)实现1、golang实现(元素为int原创 2017-12-04 10:17:06 · 477 阅读 · 0 评论 -
学习回顾算法(堆排序算法)
堆排序算法简介堆排序(Heapsort)是指利用堆积数(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆要求是每个节点的值都不大于其父节点的值。在数组的非降序排序中,需要使用大根堆。因为最大值一定在堆顶。堆排序原理堆排序利用了大根堆(或小根堆)堆顶记录的值最大(或最小)这一特征。 一、用大根堆排序的基本思原创 2017-11-23 16:29:17 · 342 阅读 · 0 评论 -
学习回顾算法(快速排序算法)
快速排序算法概述快速排序由C.A.R.Hoare在1962年提出。其基本思想是:通过一趟排序将要排序的数据分隔成独立的两部分,其中一部分的所有数据比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序。快速排序算法原理介绍 假设排序的数组是A[0] … A[N - 1],首先取任意一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的都放到它前面,所有比它大的都放它原创 2017-11-21 17:05:30 · 268 阅读 · 0 评论 -
学习回顾算法(归并排序算法)
归并排序概述归并排序(merge-sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个应用。将已有序的自序合并,得到完全有序的序列;即先使每个子序列有序,再使子序列间断有序。再将两个有序表合并成一个有序表。归并排序算法原理 归并过程为:比较a[i]和b[j]的大小,若a[i]<=b[j],则将第一个有序列表中的元素a[i]复制到r[k]原创 2017-11-21 14:58:11 · 294 阅读 · 0 评论 -
学习回顾算法(选择排序)
前言选择排序比冒泡排序算法时间上要优秀一点,主要在于冒泡算法每次比较都要交换位置,而选择排序通过记录最大或最下位置的索引,最后只交换一次位置就可以了。选择排序算法原理 每一次从待排序的元素中选出最小(或最大)的一个元素,存放在序列的起始位置,知道全部待排序的数据排完。例子: 待排序的初始序列为:49、38、65、97、49、13、27、76 排序过程如下 算法分析 (1)时间复杂度 如原创 2017-11-20 17:41:19 · 508 阅读 · 0 评论 -
golang获取服务内存信息
以linux服务为例子,正常情况下,要获取服务内存信息可以通过相关的命令,例如top、ps等命令。这些监控内存使用情况的方法,一般需要编写脚本,执行脚本后将执行结果发送给对应的监控服务,从而达到监控的效果。但是golang自带的包却有一个runtime包,可以轻松获取服务运行时候的各种包括内存使用情况的信息。 使用linux命令,一般情况下只能看服务使用了多少内存。但是服务内存具体的使用情况缺原创 2017-05-12 00:33:25 · 19992 阅读 · 3 评论 -
golang基础(golang压缩文件gzip)
前言曾经,因为不够注重基础吃了好多亏。总是很喜欢去看那些高大上的东西,却忽略了最基本的东西。然后会错误的以为自己懂的很多,但是其实是沙堆中筑高台,知道很多高大上的架构,但是基础的东西却不太了解。我觉得,可能这就是大部分开发工程师的通病吧。正题在软件很多应用开发过程中,经常需要使用到文件压缩。有时候是为了加快存盘速度,有时候是为了节省硬盘空间,有时候是为了提高传输效率。gzip是一种比较通用的压缩程序原创 2017-12-04 19:11:46 · 10275 阅读 · 2 评论 -
golang基础(unsafe包使用)
前言在使用C/C++过程中,很多时候出现的错误都是由于指针操作不合理,导致各种奇奇怪怪的问题。但是,也是由于指针的存在才让C/C++代码的运行效率比其他语言的略高。golang也有指针类型,但是不允许直接对指针类型进行运算。就是像保留指针的有点,规避掉由于指针操作不当而引发的各种奇怪问题。但是有些时候确实需要使用到指针运算的时候,就需要使用到unsafe包了。为什么要用unsafe包呢,说白了,就是原创 2017-12-05 16:35:36 · 1902 阅读 · 0 评论 -
golang基础(基础包链表使用)
前言golang版本包中提供了三种数据结构:list、heap和ring。已经golang的基本数据类型map。这4中数据结构算是日常开发中最常用的数据结构了。最常用的应该是map所以,golang才会将其作为基本类型。golang提供的这些数据结构,并没有保证并发安全的情况。所以最好在开发的过程中操作的时候要加锁,避免造成不必要的麻烦。也不用吐槽为什么map抛出一个不能同时读写的error。lis原创 2017-12-05 18:39:38 · 2677 阅读 · 0 评论 -
golang插件plugin从使用到放弃
前段时间使用beego框架开发了好多web接口,苦于beego框架对http接口的单元测试支持的不是很好,在迭代空隙修直接使用httprouter作为路由。然后写一个rest接口入参为新增接口uri、实现接口的.so路径和实现rest接口的...原创 2018-12-14 15:58:27 · 12119 阅读 · 4 评论 -
记一次rest_api监控提前发现潜在bug
花了大半年开发的项目要上线了,我在上线前一个星期把所有api都加上异常处理,如果api调用引发异常,都会把当前的调用栈和接口入参等信息保存到mongodb中。上线后,并没有收到bug处理通知。但是在mongodb中发现了一些异常数据。其中调用栈如下:"stack" : "goroutine 5297 [running]:\nerror.getFuncStack(0x0, 0xc420016e7...原创 2018-12-06 16:33:02 · 549 阅读 · 0 评论 -
golang中xorm包使用map[string]interface{}
前言:许久没发个人博客了,最近有点忙,很是怀念以前有时间写博客的日子。最近做各种后台服务,写了N个rest接口,其中有相当一部分是和mysql挂钩的,这时候就使用起了golang的xorm包。特意记录下使用时候用到map[string]interface{}的场景。一、map[string]interface{}的使用点:1、去掉加密操作后,一般rest接口使用的数据格式大多为json格式,...原创 2018-09-28 11:41:10 · 5028 阅读 · 0 评论 -
记一次关于golang使用xorm访问mysql事务不关闭引发的问题
事件还原:项目经理带客户体验公司的产品,发现机器前端提示网络异常,鉴于近期阿里云和腾讯云都发生过网络问题没有排查原因。过阵子,测试的同事跑去问qt前端的同事说网络这么久还异常啊。qt前端同事自己测试了一下,发现确实接口“有去无回”,就问了下后台的同事看看接口是否调的通。由于他们看的是心跳接口,后台同事一看,有些调用成功。然后就说可能是网络不稳定。ok,刚好后台同事写好需求同步服务后,qt前端的同事...原创 2018-07-31 11:51:50 · 2980 阅读 · 0 评论 -
mongodb性能优化---golang篇
一般来说nosql的插入速度会比mysql等关系型数据库的要快些才对,上次用golang实现了可以在mysql中以2W+/s速度的插入小数据。理论上mongodb的插入速度应该会比mysql快。但是经过测试发现,每次往mongodb插入一条数据的话,插入速度只有1600次每秒。测试代码如下:package mainimport ( "fmt" "log" "ti原创 2018-01-31 18:27:27 · 5364 阅读 · 21 评论 -
使用golang插入mysql性能提升经验
前言golang可以轻易制造高并发,在某些场景很合适,比如爬虫的时候可以爬的更加高效。但是对应某些场景,如文件读写,数据库访问等IO为瓶颈的场合,就没有什么优势了。前提基础1、golang数据库访问 在golang中数据库访问使用”database/sql”包提供的接口,不同的数据库,比如pg、mysql只需要提供对应的驱动就可以了。注意”database/sql”包提供的接口只针对关系型数据库,原创 2018-01-03 20:10:54 · 16314 阅读 · 4 评论 -
学习回顾算法(基数排序算法)
基数排序概述基数排序(radix sort)属于分配式排序,又称为“桶子法”(bucket sort)或bin sort。顾名思义,它是透过键值,把要排序的元素分配到已经排好优先级的“桶”中,以达到排序的作用。比如数字中0,1,2,3,4,5,6,7,8,9。就是已经排好序的桶了。在某些时候基数排序的效率高于其他排序算法。基数排序算法原理基数排序(以整形为例),将整形10进制按每位拆分,然后从低位到原创 2017-11-27 14:49:28 · 319 阅读 · 0 评论 -
学习回顾算法(希尔排序算法)
希尔排序算法概述希尔排序是插入排序的一种。也称为缩小增量排序,是插入排序算法的一种更搞笑的改进版本。希尔排序把记录按下标的一定增量分组,对每组使用直接插入排序算法;随着增量逐渐减少,每组包含的关键词越来越多,当增量减到1时,整个文件恰好被分成一组。希尔排序算法原理先取一个小于n的整数d1作为第一个增量,把列表的记录全部记录分组。所有距离为d1的倍数记录放在同一个组中,先在各组内进行直接直接插入排序;原创 2017-11-24 14:59:03 · 274 阅读 · 0 评论 -
学习回顾算法(直接插入排序)
直接插入排序是一种最简单的排序方法,它的基本操作是将一个记录插入到已经排好的序的表中,从而得到一个新的、记录数增1的有序表。直接插入原理 当前元素的前面元素均为有序,要插入时,从当前元素的左边开始往前找(从后往前找),比当前元素大的元素都往右移一个位置,最后把当前元素放在已经放的位置就行了。直接插入排序过程例子: 从网上找一个以21、25、49、25、16、8为元素的数排序: 算法分析原创 2017-11-14 23:07:06 · 338 阅读 · 0 评论 -
golang访问mongodb
redis、mongodb是最近几年比较兴起的nosql,nosql的意思是not just sql。最近听到一位mongodb的专家说,为什么最近非关系型数据库会火起来,主要是由于现在的存储成本较低了,关系型数据库的产生主要是以前存储成本比较高,在存储的时候需要死扣字段以做到存储效率最大化。大多数应用中,加上很多复杂的关系,还不如直接全量的存储。比如图片、视频、文章等,可以直接存入数据库即可。go原创 2017-11-08 14:30:35 · 3421 阅读 · 0 评论 -
golang设计模式(7)代理模式
golang代理模式原创 2017-10-19 00:52:38 · 1868 阅读 · 0 评论 -
golang设计模式(6)适配器模式
golang适配器模式原创 2017-10-17 23:17:04 · 1430 阅读 · 0 评论 -
golang中http包获取表单
表单是web前端和后台交互最简单的方式之一。这里来看看golang中的http包是如何获取页面输入的表单的。 1、通过http.Request中的ParseForm方法获取解析表单的内容。 2、在http.Request.Form中获取对应表单的内容。 下面以一个例子来看: golang代码:package mainimport ( "fmt" "log" "net/原创 2017-09-21 15:04:34 · 5991 阅读 · 0 评论 -
用golang系统包中的处理方法获取goroutine的调用栈
golang调用栈获取原创 2017-09-19 15:15:47 · 2658 阅读 · 0 评论 -
golang服务健壮性---(异常处理)
golang异常处理、golang服务健壮性原创 2017-09-18 16:06:12 · 5421 阅读 · 0 评论 -
golang命令行解析
golang命令行解析原创 2017-09-26 10:03:23 · 2953 阅读 · 0 评论 -
golang设计模式(1)单例模式
做软件开发工程师两三年了,接触到的第一种设计模式就是单例模式,记得当年第一份工作第一个任务就是用C语言写一个网络抓包的工具。那时候坐旁边的同事就问,你们两写的这个工具有用到什么设计模式吗?当时一脸懵,设计模式是个什么东西,那时候他说计算机专业有学过,但是看公司版本代码,他只看到了单例模式。从那时候开始我知道有设计模式这个事,学习也是从单例模式开始的。当然,设计模式中,单例模式也是最常用的一种。原创 2017-09-25 09:58:54 · 4336 阅读 · 0 评论 -
cgo的个人总结
cgo个人体会原创 2017-03-30 21:13:19 · 1878 阅读 · 0 评论 -
golang设计模式(2)工厂模式
golang 工厂模式原创 2017-10-02 09:26:19 · 710 阅读 · 0 评论 -
golang中struct和[]byte的相互转换
golang struct和[]byte转换原创 2017-10-10 20:17:14 · 33160 阅读 · 5 评论 -
C/C++中打印函数的一个小注意点
C/C++ 打印函数问题原创 2017-11-07 10:43:52 · 2168 阅读 · 0 评论 -
学习回顾算法(冒泡排序)
前言笔者对算法和数据结构方面的印象也算是比较深刻,在读大学的时候,由于专业是应用电子技术,没有学过算法数据结构。大四找工作的时候找嵌入式相关的工作,由于和计算机相关的有些擦边球,所以也找了写C/C++方面的工作,笔试的题目基本是都是算法数据结构,后面阴差阳错的走上了服务后台开发。由于公司开发的时候大多是在固定的框架里边加对应的业务代码,所以也 很少使用数据结构和算法。终于有一次突然想去面试看看自己水原创 2017-11-13 14:13:52 · 238 阅读 · 0 评论 -
GO1.8特性---plugin(go 动态库)
简介: 在go1.8出现以前,一直觉得go语言不能像C/C++一样可以使用动态库的方式动态修改服务。每次升级操作都不得不重新编译整个工程,重新部署服务。这对于很多比较重型的服务来说是一个很致命的弱点。 目前在go1.8只在linux和Darwin系统下支持plugin.从go1.8源码中plugin包中plugin.go文件开头中有对应的说明。在go1.8中plugin包在操作系原创 2017-03-30 20:37:37 · 15329 阅读 · 1 评论 -
golang设计模式(5)原型模式
golang原型模式原创 2017-10-17 01:27:19 · 883 阅读 · 2 评论 -
golang设计模式(10)外观模式
golang 外观模式原创 2017-10-24 22:06:50 · 741 阅读 · 0 评论 -
golang设计模式(4)建造者模式
golang建造者模式原创 2017-10-15 23:56:23 · 1843 阅读 · 0 评论 -
golang设计模式(9)装饰模式
golang装饰模式原创 2017-10-24 10:33:35 · 1720 阅读 · 0 评论 -
golang设计模式(3)组合模式
golang 组合模式原创 2017-10-15 00:18:35 · 1111 阅读 · 0 评论