go
文章平均质量分 61
司青-已停止更新
本博客已停更;
展开
-
Go使用chromedp库操作headless-chrome爬取"JS画出来的"网站
随着类似Vue、Angular这类通过JS将web页面"画"出来的前端框架的流行,爬取网页不再像以前那样随便发个GET请求,解析HTML就能搞定了。对于使用这类框架制作的SPA(Single Page Web Application)网站来说,必须使用一个全功能浏览器将JS脚本执行一遍才能获得想要的数据,除此之外别无他法。这里我们介绍如何使用Go语言的chromedp库来操作headless-chrome模拟浏览器操作,然后抓取网页数据的方案。"无头"Chrome与远程调式协议所谓headless-ch原创 2020-05-09 16:08:52 · 3705 阅读 · 0 评论 -
Go1.14(即将发布)中的性能改进
Go1.14即将于2020年2月底发布,这个版本有一些值得注意的性能改进,如下:defer跟正常的函数调用相比,defer几乎已经没有额外的开销了。你可以在对性能极度敏感的代码中放心的使用defer了。调度器Goroutine支持真正意义上的抢占式调度了。我们知道在老版本中,goroutine只有当遇到I/O操作、管道/同步操作或者用户主动调用了runtime.Gosched()时...原创 2020-02-25 01:20:47 · 1021 阅读 · 0 评论 -
Go Web系统中的错误处理(可能是最佳)实践
文章目录不要直接无脑返回error使用runtime.Caller()添加代码位置信息使用错误嵌套保存原始错误错误的分类在讨论所有的错误处理实践之前首先要接受一个事实,那就是每调用一个函数/方法都要检查一下返回值中的err是否为空的操作是无法避免的,这可能是很多从Java转过来的开发者们除语法习惯以外最大的不适应。当然Go里也可以通过panic来模拟抛出"异常"然后中断执行流跳转到错误处理函数的...原创 2019-12-19 11:47:36 · 1242 阅读 · 0 评论 -
用Go写业务系统需要制造哪些轮子?
如果之前主要是用Java做业务系统 ,那么想用go重写的话还是比较痛苦的,最主要的原因就是你会发现要啥没啥,需要自己重写(造轮子)。下面列举了一些需要施工的基础设施。错误处理在Java中,只要你没有刻意的使用4参数的Exception构造方法去定义自己的异常类,那么默认情况下都是会记录调用栈的,这样基本上就能马上定位到事故第一现场,排查效率很高。Go则不然,如果使用默认的error机制,那么在...原创 2019-07-26 18:15:07 · 769 阅读 · 0 评论 -
Go中方法接收者是指针类型和值类型的根本区别, 看这一篇就足够了
要理解使用指针接收者和使用值接收者的根本区别只需要明确一点就够了:它们的方法名是不一样的。方法名我们拿Man和Woman两个简单的结构体举例:type Man struct {}type Woman struct {}我们分别使用指针接收者和值接收者给它们添加一个Say()方法:// Say()方法的全名为(*Man).Say()// 即只有指针类型*Man才有Say()方法...原创 2019-08-02 16:48:34 · 1863 阅读 · 3 评论 -
从Go语言实现模板设计模式浅谈Go的抽象能力
首先抛出一个观点,那就是Go的抽象能力的确不如Java这种严格的OOP语言强。具体表现之一就是模板模式的实现。模板的实现模板模式是OOP编程中的一把神兵利器,用好了能够提高代码的复用程度,大大提高开发效率。例如,我们可以在父类中定义完成一个任务的几个步骤并分别给出一个默认实现,然后子类继承父类,子类只需要重写自己感兴趣的方法即可,剩余逻辑都可以复用父类的代码。Spring源码中就大量充斥着这样...原创 2018-11-25 03:08:46 · 1390 阅读 · 0 评论 -
Go FastHttp优雅关闭实现方案
使用Go开发web服务时很多情况下都会使用号称比标准库快10x的FastHttp, 但fasthttp(版本: 20180529.0.0)至今也没有提供优雅关闭的方法,默认情况下退出服务只能kill。下面谈几个实现方案。首先,要明确所谓的优雅关闭是要求我们在调用close()时要做到以下几点:拒绝接受新连接等待正在处理的请求完成,然后关闭连接关闭剩余空闲的连接要做到第一点,我们...原创 2018-07-31 14:52:22 · 3532 阅读 · 0 评论 -
Filebeat如何保证在日志文件被切割(或滚动rolling)时依然正确读取文件
我们的日志收集系统使用Filebeat来收集日志文件,部署时并没有多想,只配置了一下监控的日志文件名。上线几个月,日志监控从没出过问题。后来想想其实这里面有很多点需要考虑的,没出问题真是感谢Filebeat默认配置下想的就很周全。业务系统使用logback作为日志框架。通过查看源码,发现logback日志切割用的是JDK里File#renameTo()方法。如果该方法失败,就再尝试使用复制数据的方式原创 2017-12-18 12:13:18 · 15358 阅读 · 1 评论 -
Go语言: 万物皆异步
同步和异步、堵塞和非堵塞首先要明确的是,同步(Synchronous)和异步(Asynchronous),堵塞(Blocking)和非堵塞(Non-Blocking)是两种完全不同的概念。前者指的是一种事件通知、处理机制,而后者则是程序控制流程的差异。我们以A调用B为例来说明两者之间的区别: - 堵塞 只有当B任务完成后,程序控制权才会返回给A, A得以继续执行。非堵塞 B马上返回,此时B并原创 2017-12-24 11:31:09 · 5595 阅读 · 0 评论 -
【leetcode】通过递归反转单链表 - Go语言实现
问题描述见leetcode第206题:https://leetcode.com/problems/reverse-linked-list/#/description思路使用迭代的方式反转链表大家已经很熟了,其实递归调用栈的特性,我们也可以轻松做到链表反转。 链表反转后,原链表的最后一个结点,会变成新表的头结点。因此我们可以设递归函数总是返回当前链表的最后一个结点,这样最深的一层递归调用就是原链表的原创 2017-05-07 11:08:14 · 3141 阅读 · 0 评论 -
使用Jetbrains的Gogland IDE阅读Consul源码
IDE专业户 Jetbranins 为Go语言新推出了一款IDE, 名叫 Gogland, 目前还处于 preview 版本,但是已经能正常使用了(https://www.jetbrains.com/go/)。IDE强大的定义跳转功能可以给我们的代码阅读提供极大的便利。本文介绍如何配置Gogland来阅读Consul代码,并不对源码本身做分析。创建项目目录通过命令行创建项目目录consul, 切换到原创 2017-03-01 17:37:23 · 3407 阅读 · 0 评论