「连载十四」实现导出、导入 Excel

知识点 导出功能的实现 本文目标 在本节,我们将实现对标签信息的导出、导入功能,这是很标配功能了,希望你掌握基础的使用方式。 另外在本文我们使用了 2 个 Excel 的包,excelize 最初的 XML 格式文件的一些结构,是通过 tealeg/xlsx 格式文件结构演化而来的,因此特意在此都展示了,你可以根据自己的场景和喜爱去使用。 配置 首先要指定导出的 Excel 文件的存储路径,在 app.ini 中增加配置: [app] ... ExportSavePath = export/ 修改 setting.go 的 App struct:

用 Go 来了解一下 Redis 通讯协议

Go、PHP、Java… 都有那么多包来支撑你使用 Redis,那你是否有想过 有了服务端,有了客户端,他们俩是怎样通讯,又是基于什么通讯协议做出交互的呢? 介绍 基于我们的目的,本文主要讲解和实践 Redis 的通讯协议 Redis 的客户端和服务端是通过 TCP 连接来进行数据交互, 服务器默认的端口号为 6379 客户端和服务器发送的命令或数据一律以 \r\n (CRLF)结尾(这是一条约定) 协议 在 Redis 中分为请求和回复,而请求协议又分为新版和旧版,新版统一请求协议在 Redis 1.2 版本中引入,最终在 Redis 2.0 版本成为 Redis 服务器通信的标准方式 本文是基于新版协议来实现功能,不建议使用旧版(1.2 挺老旧了)。如下是新协议的各种范例:

「连载十三」优化你的应用结构和实现Redis缓存

前言 之前就在想,不少教程或示例的代码设计都是一步到位的(也没问题) 但实际操作的读者真的能够理解透彻为什么吗?左思右想,有了今天这一章的内容,我认为实际经历过一遍印象会更加深刻 本文目标 在本章节,将介绍以下功能的整理: 抽离、分层业务逻辑:减轻 routers.go 内的 api 方法的逻辑(但本文暂不分层 repository,这块逻辑还不重)。 增加容错性:对 gorm 的错误进行判断。 Redis 缓存:对获取数据类的接口增加缓存设置。 减少重复冗余代码。 问题在哪? 在规划阶段我们发现了一个问题,这是目前的伪代码: if ! HasErrors() { if ExistArticleByID(id) { DeleteArticle(id) code = e.

「连载十二」优化配置结构及实现图片上传

知识点 重构、调整结构 本文目标 这个应用程序跑了那么久了,越来越大,越来越壮,仿佛我们的产品一样,现在它需要进行小范围重构了,以便于后续的使用,这非常重要。 前言 一天,产品经理突然跟你说文章列表,没有封面图,不够美观,!)&¥*!&)#&¥*!加一个吧,几分钟的事 你打开你的程序,分析了一波写了个清单: 优化配置结构(因为配置项越来越多) 抽离 原 logging 的 File 便于公用(logging、upload 各保有一份并不合适) 实现上传图片接口(需限制文件格式、大小) 修改文章接口(需支持封面地址参数) 增加 blog_article (文章)的数据库字段 实现 http.FileServer 嗯,你发现要较优的话,需要调整部分的应用程序结构,因为功能越来越多,原本的设计也要跟上节奏 也就是在适当的时候,及时优化 优化配置结构 一、讲解 在先前章节中,采用了直接读取 KEY 的方式去存储配置项,而本次需求中,需要增加图片的配置项,总体就有些冗余了

Go 的 fake-useragent 了解一下

有的网站会根据 User-Agent 的不同,跳转到不同(PC、M)的站点,也有根据版本的不同给出不一样的提示等等,而 User-Agent 的变化更是爬虫里的基础姿势 使用 Go 编写网络爬虫或需要模拟浏览器头(User-Agent)的时候,你是否会觉得很麻烦,获取请求头(Request Headers)的 User-Agent 还得找来找去,挺繁琐。先前我也遇到了这个问题,因此有了这个项目 fake-useragent,用来解决你我的痛点 项目地址:https://github.com/EDDYCJY/fake-useragent 支持 All User-Agent Random Chrome InternetExplorer (IE) Firefox Safari Android MacOSX IOS Linux IPhone IPad Computer Mobile 安装 $ go get github.

「连载十一」Cron定时任务

知识点 完成定时任务的功能 本文目标 在实际的应用项目中,定时任务的使用是很常见的。你是否有过 Golang 如何做定时任务的疑问,莫非是轮询,在本文中我们将结合我们的项目讲述 Cron。 介绍 我们将使用 cron 这个包,它实现了 cron 规范解析器和任务运行器,简单来讲就是包含了定时任务所需的功能 Cron 表达式格式 字段名 是否必填 允许的值 允许的特殊字符 秒(Seconds) Yes 0-59 * / , - 分(Minutes) Yes 0-59 * / , - 时(Hours) Yes 0-23 * / , - 一个月中的某天(Day of month) Yes 1-31 * / , - ?

了解一下Golang的市场行情

项目地址:https://github.com/go-crawler/lagou_jobs 如果对你有所帮助,欢迎 Star,给文章来波赞,这样可以让更多的人看见 :) 目标 在工作中 Golang 已是一份子,想让大家了解一下 Golang 的市场行情,也想让更多的人熟悉它。因此主要是展示数据分析的结果 目标站点是 某招聘网站 的职位数据抓取和分析,爬取城市分别为 北京、上海、广州、深圳、杭州、成都,再得出一个结论 分析 首先需要进行页面分析,找到我们的抓取方向 搜索 golang 关键字,打开页面 F12 就能看到它发送了四个请求,留意 positionAjax.json 这个请求 我们仔细研判这个接口的入参和出参 入参 1、Query String Param city:请求的城市

「连载十」定制 GORM Callbacks

涉及知识点 GORM 本文目标 GORM itself is powered by Callbacks, so you could fully customize GORM as you want GORM 本身是由回调驱动的,所以我们可以根据需要完全定制 GORM,以此达到我们的目的,如下: 注册一个新的回调 删除现有的回调 替换现有的回调 注册回调的顺序 在 GORM 中包含以上四类 Callbacks,我们结合项目选用 “替换现有的回调” 来解决一个小痛点。

爬取汽车之家 二手车产品库

项目地址:https://github.com/go-crawler/car-prices 目标 最近经常有人在耳边提起汽车之家,也好奇二手车在国内的价格是怎么样的,因此本次的目标站点是 汽车之家 的二手车产品库 分析目标源: 一页共 24 条 含分页,但这个老产品库,在 100 页后会存在问题,因此我们爬取 99 页 可以获取全部城市 共可爬取 19w+ 数据 开始 爬取步骤 获取全部的城市 拼装全部城市 URL 入队列 解析二手车页面结构 下一页 URL 入队列 循环拉取所有分页的二手车数据 循环拉取队列中城市的二手车数据 等待,确定队列中无新的 URL 爬取的二手车数据入库 获取城市 通过页面查看,可发现在城市筛选区可得到全部的二手车城市列表,但是你仔细查阅代码。会发现它是 JS 加载进来的,城市也统一放在了一个变量中

「番外」Golang 交叉编译

知识点 跨平台编译 本文目标 在 连载九 讲解构建 Scratch 镜像时,我们编译可执行文件用了另外一个形式的命令,如下: $ CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o go-gin-example . 我想你可能会有疑问,今天本文会针对这块进行讲解。 说明 我们将讲解命令各个参数的作用,希望你在阅读时,将每一项串联起来,你会发现这就是交叉编译相关的小知识 也就是 Golang 令人心动的特性之一跨平台编译 一、CGO_ENABLED 作用: 用于标识(声明) cgo 工具是否可用