JWang的博客

一点记录,一点想法,一点思考


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

Web框架Gin的封装处理

发表于 2020-07-01 | 更新于 2025-01-24 | 分类于 Golang
| 字数统计 1.7k

众所周知,Golang非常适合用于开发高性能的API,开源的Web框架也很多,比如国产的Beego,以及在目前最流行的Gin,还有Echo、Iris、Revel等框架。

由于博主之前从事过PHP,相比来说,感觉Go的这些框架都比较轻量,很多时候还需要自己花点功夫再打理一下,比如这些框架都没有处理数据库这块,Beego虽然自带了一个ORM,但是可用性极差,需要我们自己手动去集成一些开源的组件。

就拿我用过比较多的Gin框架( https://github.com/gin-gonic/gin )来说,它属于其中最轻量级的框架,主要功能包括路由、请求参数、中间件、模板等,存在一些缺失的东西,比如:

  • 没有推荐项目结构模块划分,很多人不知道代码咋存放

  • 缺少数据库ORM,虽说Go标准库支持数据库,但是缺少封装,用起来麻烦

  • 缺少配置文件加载功能,任何项目都少不了配置文件

  • 日志处理功能不够强大

所以,我基于Gin加上一些开源的组件,封装了一个不算是框架的框架,这里暂且称其为Gen,主要是便于快速开发,解决一些通用性的问题。

地址:https://github.com/wangbenjun/gen

阅读全文 »

浅谈Go网络编程

发表于 2020-06-22 | 更新于 2024-12-29 | 分类于 Golang
| 字数统计 2.4k

聊一聊Go网络编程开发,说到网络编程开发必然离不开网络协议,大家最熟知的莫过于TCP/IP体系,实际上开发中,大家接触的最多的还是HTTP协议。在理论上,OSI模型把网络分成7层,但实际应用中是分为4层,从下到上分别是物理接口层、网络层、传输层、应用层。

每一层做不同的事情,分工明确,同时便于扩展,比如物理层指的就是网卡,又被称为调制解调器,它负责把电信号和数字信号之间做转换,这一块其实很多人不理解,也是非常难理解的地方,下面咱就聊一聊。

阅读全文 »

浅谈Go定时器应用

发表于 2020-06-18 | 更新于 2024-12-29 | 分类于 Golang
| 字数统计 1.1k

很多人都用过Linux的定时任务,举个例子,我们有一个任务需要每个1分钟运行一次,如果使用Linux的crontab可以用 * * * * *表示,这是系统级的定时器。

在Go标准库里面也有类似的功能实现,我们称之为定时器,非常简单易用,用途非常广泛,下面咱就看一下怎么用吧!

阅读全文 »

Golang限速算法和应用

发表于 2020-06-15 | 更新于 2024-12-29 | 分类于 Golang
| 字数统计 2.8k

今天来说说限速算法,其实这个倒不是什么神秘的事情,本文主要做一个总结,并且从Golang这么语言的角度做一个实践。

假设作为一个完全不懂算法的人,让你去实现一个限速功能(1秒内最多100次),你可能会想到的最简单方式就是记录一个开始时间,然后开始计数,当计数达到100之后限制调用,等待时间间隔达到1秒的时候重置计数器,然后重新计数,如此往复。

这种算法也是日常生活中应用广泛,比如说坐地铁,在北京,很多地铁站在早晚高峰时期都会限流,方法非常简单,地铁站门口有安检员,每过一段时间放几个人进去,虽然安检员也不会掐着表计时,但是基本上是这个规律。

这种方式被称为计数器算法,有些文章也称之为固定时间窗口计数法,因为与之对应的还有一个方法叫作滑动时间窗口计数法。

阅读全文 »

再谈阿里外包

发表于 2020-06-07 | 更新于 2025-01-24 | 分类于 Life
| 字数统计 1.8k

之前有写一篇文章叫作《谈一谈阿里外包工作》 ,至今3个月已经过去了,今天抽空再写点东西补充一下,希望对有些人有用。

1.疫情影响

据我了解,很多在年前没有找工作的同事,基本上都空了3-4个月,因为北京这边大概到了4-5月份招聘才多了起来,而且也很奇怪,这时候找工作好像更简单,很多同事都同时拿到了好几个offer,其中也不乏一些大中型互联网公司。

阅读全文 »

Golang的HttpServer解析

发表于 2020-06-07 | 更新于 2025-01-24 | 分类于 Golang
| 字数统计 3.4k

Golang之所以非常适合用于网络编程的原因之一就是其自带网络库可以非常简单快速的建立一个基于http或者tcp的服务应用,以http服务为例,只需几行代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import "net/http"

func main() {
http.HandleFunc("/", func(writer http.ResponseWriter, r *http.Request) {
_, _ = writer.Write([]byte("Hello"))
})
err := http.ListenAndServe(":8888", nil)
if err != nil {
panic(err)
}
}

上面这几行代码就启动了一个http服务,运行在8888端口,虽然说非常简陋,也不区分GET或者POST,但是其性能缺十分高效,主要是得益于其底层使用了协程,对每一个请求都会分配一个协程去处理,并发能力强。

阅读全文 »

Golang里面slice初始化的坑

发表于 2020-06-06 | 更新于 2024-12-29 | 分类于 Golang
| 字数统计 1k

相信很多人对Golang里面的数组都不陌生,但实际上99%的场景我们使用的都是slice,原因很简单,Go里面的数组类似C数组长度是固定的,局限太多,而slice则是一个变长的数组,可以自动扩容,类似JS、PHP等弱类型语言里面的数组。

但实际使用slice的过程中,我们一般会遇到2种写法,下面咱们就说说这2种方式的差异和存在的坑:

1
2
3
var s []string

var s = make([]string, 0)
阅读全文 »

详解Linux环境下各种代理设置

发表于 2020-05-30 | 更新于 2025-01-24 | 分类于 Linux
| 字数统计 1.9k

做技术的人都知道,有时候为了查询一些信息,必须访问一些国外资源,由于这些资源的服务器位于国外,速度较慢,有时候甚至是根本无法访问(你们懂的),这时候拥有一个VPN或者是代理就非常重要了,这也就是国内大部分人使用代理的主要目的,当然代理还有其它很多好处,比如隐藏自己的IP地址和来源。

首先,咱们常见代理有socks代理和http(s)代理之分,比如socks代理默认端口就是在1080。这2者有啥区别呢?http代理属于应用层代理,类似的还有ftp代理,socks代理与应用层代理不同,socks代理只是简单地传递数据包,而不必关心是何种应用协议(比如FTP、HTTP请求)。所以,socks代理比其他应用层代理要快得多,目前用的最多的就是socks5代理。

阅读全文 »

疫情之下之口罩乱象

发表于 2020-05-16 | 更新于 2024-12-29 | 分类于 Life
| 字数统计 2.2k

这次疫情出人意料的持续时间长,口罩瞬间成为一种刚需和战略物资,虽然很多人可能不太愿意戴口罩,但是在中国如果你不戴口罩是没法出门的,这是一种强制措施。我国人多,对口罩的需求更大,在前期口罩基本上买不到,不仅需要抢,而且需要拖关系,甚至由于口罩闹出很多丑事,比如武汉红十字会。而且很多人喜欢囤积,假如你有找到了货源,你可能不会只买1个,你会买未来2个月的用量,那可能就是几百个。

我2月初回北京的时候只戴了一个布口罩,主要是确实没有医用口罩可用,对于我来说,这种口罩完全是形式大于实际意义,但是你如果不戴口罩是没法出门、坐火车,确实很无赖,对于检查人员来说,他们不关心你戴的是什么口罩,只要把脸遮住,哪怕是自己拿布缝的也没问题。

阅读全文 »

Golang第三方测试库GoConvey

发表于 2020-04-13 | 更新于 2024-12-29 | 分类于 Golang
| 字数统计 1.4k

之前写过一篇Go测试的文章,文章介绍的是Go自带的官方测试库,今天来介绍一下一个非常流行的Go第三方测试库GoConvey,其实官方的文档已经写的非常清楚了,有兴趣的可以查看其 Github主页 ,里面有非常详细的介绍,英文好的话可以看看。

阅读全文 »

Free ~ Will

发表于 2020-03-20 | 更新于 2024-12-29 | 分类于 Life
| 字数统计 902

如果现在你说你要去做一款社交软件APP,我大概率会劝你不做,我可能会从市场、资金、成本等多个方面给你分析一通,然后告诉你成功率非常低,你或许认为我总是从最坏的情况考虑,并没有考虑其中的机遇和意外。也许会有人从其它方面分析一通,然后告诉你大有可为,成功率非常高。如果你仔细一想,你会发现两者都有道理,但是只有你真正做了你才能知道哪个是对的,这就像是薛定谔的猫,你只有打开那个盒子才能知道猫是活的还是死的。

阅读全文 »

Ubuntu Nautilus隐藏文件(夹)

发表于 2020-03-15 | 更新于 2024-12-29 | 分类于 Linux
| 字数统计 410

如何在Ubuntu自带的文件夹管理器Nautilus里面隐藏文件或文件夹呢?

先说一下背景,之所以想到这个问题是因为我的电脑是 Win10+Ubuntu 双系统,有一块硬盘是共享的NTFS格式,在Windows下面分区会有2个文件夹,了解Windows的人应该知道,这是垃圾回收站和磁盘卷信息。

默认情况下在Windows里面这2个文件夹是隐藏的,但是当我切换到Ubuntu的时候,Ubuntu就会给显示出来了,这倒也正常,但是看起来很碍事,不爽,既然不爽我就要搞它。

阅读全文 »

Golang常见加密算法实现

发表于 2020-03-08 | 更新于 2024-12-29 | 分类于 Golang
| 字数统计 1.8k

说完Go里面的md5的用法,这篇文章咱说说用的比较多的加密方式在Go里面如何实现。首先,科普一下,一般待加密的内容被叫作明文,加密使用的关键元素被称为秘钥,加密的结果被称为密文,当然其中还有一个非常关键的加密算法。

一般加密算法可分为对称加密和非对称加密这两个分类,这两者区别很明显,对称加密是指我们拿到秘钥和密文可以解密出明文,在加密和解密时使用的是同一个秘钥;而非对称加密算法需要两个密钥来进行加密和解密,这两个密钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。

阅读全文 »

Golang计算文件MD5

发表于 2020-03-07 | 更新于 2025-01-24 | 分类于 Golang
| 字数统计 678

前面这篇文章<Golang里面MD5的写法和性能>介绍了如何计算字符串的md5,下面我们来说说如何计算文件的md5。

阅读全文 »

Golang计算MD5的写法和性能

发表于 2020-03-05 | 更新于 2024-12-29 | 分类于 Golang
| 字数统计 1.1k

用过PHP的童鞋知道在PHP里面md5很简单,是一个内置函数,可以直接调用:

1
2
3
4
5
jwang@jun:~$ php -a
Interactive mode enabled

php > echo md5("12345");
827ccb0eea8a706c4c34a16891f84e7b

纠正一个错误的说法,很多人一直把md5叫作加密算法,实际上md5并不是加密,它既不是对称加密,也不是非对称加密,它只是一个摘要函数,一般被用于签名或者校验数据完整性。

虽然现在有文章说不推荐使用md5了,因为碰撞几率比较大,实际上,这个几率非常非常非常低,大只是相对于其它摘要函数来说,纯自然的情况下基本不可能碰撞,虽然可以用工具构造出来,但非常复杂。如果实在不放心,可以用sha1或者sha256,或者两者集合起来用,速度会慢一点,但安全性高一点,总之,md5由于速度快,简单易用,现在用的还是蛮多的。

阅读全文 »

如何高效的学习编程?

发表于 2020-03-03 | 更新于 2024-12-29 | 分类于 Life
| 字数统计 2.2k

今天想聊一聊学习这个话题,理想情况下,每个人都应该有适合自己的一套学习方法和节奏,主要因为不同人对知识的理解和吸收速度不一样,举个非常简单的例子,在网上看视频或者电影,有些人觉得2倍速播放刚刚好,而有些人甚至还要降速才能看明白,才能Get到点。即便如此,我觉得有些学习的经验和方法是可以共享的,虽然它不一定适合所有人。

人一生都在学习,学习不一定是在课堂上,特别是在互联网时代,我们可以随时随地打开手机观看各种课程,尤其是在编程行业,更需要不断持续的学习才能保持竞争力。我也是自学入行编程,期间也看过很多网上的视频教程,平时学习的时候也经常看一些博客教程,可以说现在也基本上是靠自学成长,颇有感触。

阅读全文 »

谈一谈阿里外包工作

发表于 2020-03-01 | 更新于 2025-01-24 | 分类于 Life
| 字数统计 4.8k

之前写过几篇文章名字叫《一个野生程序员的北漂之路》,这篇文章应该算是后续吧,聊聊我如何进阿里外包,主要是结合我的经历和我所了解的一些事实谈谈我的感受和看法,仅供其他朋友参考。

上家公司残局

看过前面文章的人应该知道我上一家公司因为是P2P行业受到打击,目前已经处于立案阶段,整个公司几百员工都失业了,我也不例外。刚开始我对公司还抱有希望,在家休息等待了2周之后我才明白公司是真的没了,自己找工作吧,当时公司为了不仅欠了我们半月工资,而且连社保也没钱缴纳(财务账户被冻结),甚至都无法给员工办理离职(公章被扣押),没人有操心这几百号员工怎么办,但是社保断了对很多人有很大影响,很多人都在问怎么办,最后公司的HR出来告诉我们可以自己找人代缴,但是由考虑到风险,需要员工签一个离职声明,然后公司才可以把社保做减员处理,于是大家争相签离职声明。

阅读全文 »

那些年,318徒步搭车之旅(二)

发表于 2020-02-25 | 更新于 2024-12-29 | 分类于 Life
| 字数统计 900

每个人对旅行都有自己想法或出于各种目的,对于我当时来说,我并不完全是在旅行,只是把工作和对自由的追求结合在一起。但在这几年的旅行中,我都是独自一人踏遍大江南北,期间也遇到很多和我一样一个人出来旅行的人,我虽不善于交际,但是也在途中结识不少,大多萍水相逢,随后结伴而行度过一段时光,最后各奔东西,相忘于江湖。。。

阅读全文 »

那些年,318徒步搭车之旅(一)

发表于 2020-02-12 | 更新于 2024-12-29 | 分类于 Life
| 字数统计 1.4k

那是2015年8月,我在拉萨停留几日,期间逛了下大昭寺、布达拉宫门口等打卡地点,作为一个非宗教人士,我对拉萨的这些宗教文化并无太多感触,也并不觉得灵魂有什么升华。大街上的商店大部分也都是卖着义乌批发制品,他们的售卖对象其实不是游客,而且来自西藏各地的牧民,但我花了100多买了一双山地运动鞋,扔掉了我脚上穿的特步运动鞋,这双运动鞋我在外穿了几个月,虽然也很便宜但是非常轻便,但是过于轻薄,因为我在策划一场没有安排和计划的318之旅,从拉萨坐火车往回走太远,不如走国道再去云南大理转转。

后记,那双鞋质量很差,差的突破预期。。。

阅读全文 »

Golang测试用例编写

发表于 2020-02-10 | 更新于 2024-12-29 | 分类于 Golang
| 字数统计 1.8k

如果你看过很多开源库的源码,你会发现大部分项目都有很多详细的测试代码,一般来说测试覆盖率越高说明这个项目的质量越高,所以好的项目测试是少不了的。很多公司对代码测试覆盖率也有要求,不为别的,只为更好的代码质量。

1.分类

虽然业界有一直开发模式叫做测试驱动开发(TDD),但是了解的人都知道TDD对开发要求太高了,它要求你先写测试用例然后再写代码,需要你写代码之前思考很多,需要大量时间,我实际开发中并没有采用过这种模式,估计国内都应该很少。

我们可以粗略的把测试用例简单划分为2种类型,一种是单元测试,它是针对某个模块、函数、方法的测试,另一种是功能测试(集成测试),它是针对整个项目功能是否可用的测试。举个例子,你写个了Web服务接口,单元测试可能是针对这个接口里面调用的一个函数测试,而功能测试就是测试这个接口是否可用,因为一个接口可能调用了多个函数。

2.单元测试

Golang里面的测试和其它大部分语言的测试不多,只不过表示形式略有不同,比如Go的单元测试通常情况下是和被测试的代码放在一起的,以xxx_test.go命名并且测试的函数名必须以Test开头。

阅读全文 »

你是否真的需要使用Linux?

发表于 2020-02-10 | 更新于 2024-12-29 | 分类于 Linux
| 字数统计 2k

自从跨入IT编程行业一直都在使用Linux桌面系统办公(尝试过挺多发行版,最终选择Ubuntu),平时生活也在用,不知不觉已经4年多了,也安利了身边很多人使用Linux,从最早的疯狂折腾到现在追求稳定,其实也颇有感触,闲来无事聊一聊。

我和很多人一样,最早接触的都是Windows系统的电脑,我也一度是Windows的爱好者,记得当年还对XP、IE情有独钟,装系统、优化系统这些事情当年也没少做,也没少折腾,基本上到了打开任务管理器,对里面每一个进程的作用以及关闭某个进程会导致什么问题都了解的地步。而当时我对Linux的印象也停留在黑框框上面,觉得很神秘,对技术要求很高,只在很多电影里面看见黑客会用到,毕竟那会我对OS需求只是到用的地步,并没有接触编程开发。

阅读全文 »

谈谈城市化和农村现状

发表于 2020-02-07 | 更新于 2024-12-29 | 分类于 Life
| 字数统计 2.9k

此次疫情爆发,有人说现在农村最安全,因为农村一般都是自建房,分布零散,而城市里面都在小区里面,住在火柴盒一样的格子楼里面,进出同一个楼道,同一个电梯,被感染的几率大很多。

我从小在农村长大,自始至今,依然是个农村人(户口还在农村),大学之后,基本上都在城里面上班工作,但是过年还是在老家。有时候早上还在车水马龙、遍布高楼大厦的城里面,晚上就来到了农村蛙声一片的田野边,一个是现代化的城市,另一个是传统的农村,感触十分之深。

今天我就聊聊我一些关于农村和城市的事和想法,可能比较零散,纯属回忆!

阅读全文 »

“武汉肺炎”小记

发表于 2020-02-06 | 更新于 2024-12-29 | 分类于 Life
| 字数统计 1.4k

截止我写这篇文章的时候,这次肺炎病毒已经感染了数万人,而且还在持续增长!

每天醒来第一件事情就是打开手机,刷新一下数据,从最开始的几百人、到几千人、再到现在的几万人。。。在这里我想说说自己看到或者了解到的一些社会现象,谈谈自己的感受。

在我的记忆力,2003年还非常遥远,那时候我应该还在上初中,记得那时候学校被封闭,外人不得进出,教室每天早上都会有一股浓厚的消毒水味。

阅读全文 »

一个野生程序员的北漂之路(三)

发表于 2020-01-22 | 更新于 2024-12-29 | 分类于 Life
| 字数统计 2.3k

上篇文章说到我二家公司由于经营不善,濒临倒闭,拖欠工资,最终我选择自离找工作。

2018年03月,这次找工作非常顺序,我请假面了大概5个公司拿到2个offer,最后选择了一家我觉得还可以的公司,xx网,工资15k。

xx网实际上是某大型教育公司下面一个部门的网站,专门面向程序员,并不是公司名字,很多学习编程的同学应该看过他们网站的课程。

之前也看过他们网站的课程,觉得很不错,这个部门有100多人,其中技术40多人,在这家公司的上班体验总体还不错,除了每天早上无聊的站会以及每周周会,公司属于业务驱动型,大多做的一些业务开发。

直到2018年底春节放假那天,技术老大拉我进屋,悄悄告诉我,经过公司决定,你今年没有年终奖,我当时一脸懵逼,问他为什么?

阅读全文 »

一个野生程序员的北漂之路(二)

发表于 2020-01-22 | 更新于 2024-12-29 | 分类于 Life
| 字数统计 2.1k

上篇文章说到我第一家公司因为融资断裂,发不起工资,解散了。这时候我们开发里面一位大佬,这里我称他为Q哥,他也刚进公司不久,如果按职级分,他应该属于高级开发工程师,平时带我们做项目,也会参与开发,毕竟当时公司开发人员不多。

当时他说他有个朋友给他介绍了一个公司,这公司非常缺人,可以直接带我们过去,不用技术面试,他和老板聊好了,我们过去见一下老板就行了。

阅读全文 »

一个野生程序员的北漂之路(一)

发表于 2020-01-21 | 更新于 2024-12-29 | 分类于 Life
| 字数统计 1.9k

虽然2020年已经到来,但是真正象征着新的一年的农历新年才刚刚开始,北漂4年多,IT这条路越走越窄,突然萌生出回家的念头,毕竟年龄也不小,算是90后最早一批奔三的人,还未成家,也谈不上立业。

在此回顾一下这些年在北京这几年的职业生涯,作为一种记录,也算是总结吧!

这些年在北京,工作换了很多个,几乎每年面试一次,微信里面同事倒是加了不少,除了聊的好的几个,大部分再也不联系。住的地方也是一年换一次,住过上下铺、地下室、天通苑、自如、一居室。。。

  • 2016年06月 第一家公司 –> 融资失败、解散
  • 2016年11月 第二家公司 –> 濒临倒闭、欠薪
  • 2018年03月 第三家公司 –> 经营不善、裁员
  • 2019年03月 第四家公司 –> 涉及p2p、查封
阅读全文 »

Hexo+Github搭建免费技术博客

发表于 2020-01-08 | 更新于 2025-01-24 | 分类于 Linux
| 字数统计 1.5k

最近想搭建了一个自己的博客网站,经过调研,最终决定使用Hexo+Github的形式搭建,大概花了3个小时的时间,这里简单记录一下过程,备用。

综述

Github提供了一个免费的GIthub Pages功能,简单说就是可以让你存放静态的资源文件,比如css、js、html、image,同时会给你分配一个免费域名,格式:https://xxx.github.io

所以你只需要注册一个Github账号,然后新建一个repository就行了,一毛线都不用花。

由于Github Pages只能托管静态资源,所以像WordPress这类博客肯定是无法运行的,这时候你有2种选择:

  1. 手写静态页面,如果是前端大牛可以尝试这样
  2. 第三方博客工具生成,如Hexo、jekyll
阅读全文 »

解决Golang测试配置文件加载问题

发表于 2019-11-19 | 更新于 2024-12-29 | 分类于 Golang
| 字数统计 843

最近在写Go的项目,使用的框架是Gin,众所周知,Gin是一个比较简单的框架,只提供了核心功能,并没有配置文件模块,所以这块得自己搞了,Go的第三方解析配置的库非常多,无论是ini、yaml、json文件支持都非常好,而且Go的项目一般都是常驻进程的,所以只需要在项目启动的时候解析一次就行可以了。

示例

最简单的办法通常就是定义一个全局的配置变量供其它包使用,在init函数里面初始化加载配置文件,示例如下:

阅读全文 »

浅谈Golang的recover异常处理机制

发表于 2019-11-10 | 更新于 2024-12-29 | 分类于 Golang
| 字数统计 1.6k

1.error

Golang被诟病非常多的一点就是缺少强大方便的异常处理机制,大部分高级编程语言,比如Java、PHP、Python等都拥有一种try catch机制,这种异常捕获机制可以非常方便的处理程序运行中可能出现的各种意外情况。

严格来说,在Go里面,错误和异常是2种不同的类型,错误一般是指程序产生的逻辑错误,或者意料之中的意外情况,而且异常一般就是panic,比如角标越界、段错误。

阅读全文 »

Protobuf入门和实战

发表于 2019-10-22 | 更新于 2024-12-29 | 分类于 Golang
| 字数统计 2.1k

1.简介

Protobuf(Google Protocol Buffer)是 Google公司内部的混合语言数据标准,目前已经开源,支持多种语言(C++、C#、Go、JS、Java、Python、PHP),它是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

说简单点,Protobuf就是类似JSON、XML这样的数据交换格式,当今互联网JSON是最流行的格式了,XML用的也挺多,最初接触到Protobuf是因为gRPC默认使用它作为数据编码,相比于JSON和XML,它更小,更快!

阅读全文 »

GRPC入门和实践

发表于 2019-08-28 | 更新于 2024-12-29 | 分类于 Golang
| 字数统计 2.3k

gPRC

首先,先阐述一个误区,很多人以为gRPC只能go语言使用,以为这个g代表的就是go,其实并不是,这个g应该理解成Google,这个rpc框架是Google出品,不过Go对这个框架的支持确实非常好,看一下官网的介绍:

gRPC is a modern open source high performance RPC framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load balancing, tracing, health checking and authentication. It is also applicable in last mile of distributed computing to connect devices, mobile applications and browsers to backend services.

详细的介绍可以参考官网(grpc.io),简单说,gRPC是一个开源的高性能rpc框架。

说到rpc,很多搞微服务的都喜欢用,特别是Java领域,rpc全称 Remote Procedure Call,翻译过来叫远程过程调用,这个翻译并不是特别好理解。

阅读全文 »

短网址原理和实现

发表于 2019-07-09 | 更新于 2025-01-24 | 分类于 Coding
| 字数统计 1.6k

1.背景介绍

相信很多人手机上都收到过一些营销短信,短信里面有时候会附带一些网址,如下图

这些网址往往都是非常短,但是当我们打开之后,如果你仔细观察,中间会有跳转,最终浏览器地址栏显示的网址并不是你短信里面看到的网址,这就是短网址!

阅读全文 »

Ubuntu 下nvidia显卡驱动安装

发表于 2019-07-01 | 更新于 2024-12-29 | 分类于 Linux
| 字数统计 1.2k

Linux下面的显卡驱动一直是个麻烦事,主要是独立显卡,特别是(NVIDIA)英伟达的显卡,气的当年祖师爷怒竖中指,虽然很多年过去了,情况有所改变,但也不是特别好!

集成显卡

如果你在Linux下面不打游戏,也不搞深度学习,强烈建议你卸载独立显卡已提高性能,当然前提是你使用的intel带集显CPU,大部分intel自带集显的性能已经能满足了

Intel对Linux支持很好,所以Linux下面的intel集显驱动非常好,内核自带,不需要额外安装,流畅度也挺高,1080p下面60fps不是问题,但是如果你使用4k显示器,intel集显大部分都是带不动。

阅读全文 »

Golang的常用数据结构

发表于 2019-06-19 | 更新于 2024-12-29 | 分类于 Golang
| 字数统计 2.4k

闲着无事,随便写写,初学Go,望各位大神轻喷!Go自带的几个复合数据类型,基本数据类型咱就不说了,大部分语言常见的几种复合数据类型大概有数组、字典、对象等,不同语言叫法不一样,用法也有差异,比如说PHP里面数组其实严格来说不算数组。

阅读全文 »

解决sudo command not found 报错

发表于 2019-06-02 | 更新于 2024-12-29 | 分类于 Linux
| 字数统计 393

偶尔发现的一个问题,平时主要使用 Ubuntu 操作系统,有时候安装一些软件会用加一些自定义PATH,往往为了方便都会把配置写到 /etc/environment 里面,这样所有用户包括root都有效:

1
2
3
4
jwang@jwang:~$ cat /etc/environment 
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:
/bin:/usr/games:/usr/local/games:/home/jwang/MyBin:/opt/go/bin"
export GOPATH=/home/jwang/Go
阅读全文 »

Golang的依赖注入简介

发表于 2019-05-15 | 更新于 2024-12-29 | 分类于 Golang
| 字数统计 788

DI - Dependency Injection,即“依赖注入”,是指组件之间依赖关系由容器在运行期决定,与此同时还有一个叫作IOC的词汇,IOC即控制反转。

理论上讲,这2个概念都是基于OOP编程而产生的思想,在OOP编程里面,我们强调对象之间的依赖关系,比如说对象B依赖对象A的某些功能,我们就说B依赖A。

DI毕竟不是Go语言的专利,它是一种编程思想,在很多语言里面都有体现和实现,相信很多具有编程经验的人也有所了解,下面咱们直接开始讲在Go语言里面怎么使用DI。

阅读全文 »

Golang处理TCP“粘包”问题

发表于 2019-05-10 | 更新于 2024-12-29 | 分类于 Golang
| 字数统计 2.2k

1.什么是粘包?

“粘包”这个说法已经被诟病很久了,既然坊间流传这个说法咱们就沿用吧,关于这个问题比较准确的解释可以参考下面几点:

  1. TCP是流传输协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议
  2. TCP没有包的概念,它只负责传输字节序列,UDP是面向数据报的协议,所以不存在拆包粘包问题
  3. 应该由应用层来维护消息和消息的边界,即需要一个应用层协议,比如HTTP

所以,本质上这是一个没有正确使用TCP协议的而产生的问题,有网友说了一句非常形象的话:“打开家里的水龙头, 看着自来水往下流, 然后你告诉我, 看, 自来水粘在一起了, 不是有病?”

阅读全文 »

Ubuntu 4K显示器缩放设置

发表于 2019-05-03 | 更新于 2025-01-24 | 分类于 Linux
| 字数统计 1.2k

开头一张图介绍一下我现在日常生活和开发使用的电脑配置:Ubuntu 16.04 + i7-8700k + 1060 + nvme ssd + 32G RAM + 4k显示器,这个配置倒不算很高端,但是开发用体验很高,系统的流畅程度非常高

阅读全文 »

Go面向对象写法

发表于 2019-04-19 | 更新于 2024-12-29 | 分类于 Golang
| 字数统计 866

Go并不是一个类似于Java、C++,或PHP这样内置面向对象语法的操作的语言,在Go里面名义上是没有类(class)这个概念的,但是这并不代表Go不能面向对象,毕竟面向对象只是一种设计思想!

为什么Go并不原生支持面向对象呢?这是一个问题

接下来,我会从面向对象的三大特性封装、继承、多态这个几个方面来讲讲Go是怎么实现的OOP的。

阅读全文 »

忆往事之富士康

发表于 2019-03-23 | 更新于 2024-12-29 | 分类于 Life
| 字数统计 2.9k

讲述2012年去富士康短暂的工作体验,由于年代久远,记忆可能有所偏差,本着回忆和思考的方向,记录一下当时的我,以及现在的我的一些想法。

2012年冬,郑州市公园的菊花正值盛开,我站在马路立交桥下,看见路边有很多民工摆摊,广告牌上面写着装修水电,其实我对这座城市并没有什么想法,不知为什么会停下脚步。

阅读全文 »

详解中间件设计模式

发表于 2019-03-12 | 更新于 2024-12-29 | 分类于 Coding
| 字数统计 1.3k

说到中间件(middleware),很多人应该都听说过,但是大体有2种意思,一种是一些衔接不同软件活系统的中间软件,比如说数据库中间件、消息中间件。另一种是在Web软件开发中代码层面的一种设计模式,比如说用户认证中间件、日志中间件,这些中间件的主要作用就是以一种集中统一、几乎无侵入的的方式去处理用户请求,而今天我们要讲的就是中间件设计模式。

阅读全文 »

Golang字符串处理函数浅析

发表于 2019-02-12 | 更新于 2024-12-29 | 分类于 Golang
| 字数统计 1.3k
很多从PHP转Go的小伙伴经常会怀恋PHP丰富的字符串函数,Go的标准库针对字符串的操作函数虽然不少但是还是不够丰富,很多时候还得自己造,下面我就结合PHP里面字符串的操作函数来说说Go里面怎么实现。 StringGo是强类型语言,有一个单独的字符串类型 string,如果熟悉Go语言的人应该了解string底层是切片,切片底层是数组,所以字符串也叫字符数组。 举个最简单的例子,有一个字符串 12ab34cd56, 我们要获取其第3到第5个字符之间的元素怎么做呢? 熟悉PHP的童鞋可以会想到PHP里面有一个 substr的函数可以做到,但是Go里面呢? 我们打开IDE看一下,其实标准库里面的 ...
阅读全文 »

Web开发中用到的Cache

发表于 2019-02-01 | 更新于 2024-12-29 | 分类于 Coding
| 字数统计 2.2k

1.什么是Cache?

Cache(音: 侃屎),中文称为缓存,缓存可以说是计算机系统里面一味良药,在很多地方的设计都用到了Cache,比如在CPU里面的一级缓存,二级缓存,好的CPU还有三级缓存。硬盘也有缓存,比如一般1T的机械硬盘会有64M的闪存缓存。

在软件系统里面,缓存更是无处不在,比如浏览器本地缓存、网络缓存、CDN缓存、代理缓存…

阅读全文 »

JWT Token的刷新和作废

发表于 2019-01-21 | 更新于 2024-12-29 | 分类于 Coding
| 字数统计 1.6k

之前一篇简单介绍了下JWT的用法,涉及到token的签发和验证。有人说JWT不适合用于替换传统的 session+cookies 机制用于Web应用的用户登录状态维护,很大原因就是这块问题。

虽然之前的案例里面,我们可以成功在登录后获取一个Token,然后访问服务器的时候带着这个Token,服务器就可以知道当前访问的用户Uid了,假设现在有一下需求:

  • 登录后7天不用重复登录

  • 超过30天没有访问网站则需重新登录,否则一直有效

  • 修改密码功能

阅读全文 »

Token 和 JWT Token

发表于 2019-01-03 | 更新于 2024-12-29 | 分类于 Coding
| 字数统计 1.9k

1.Token的用途

在很多计算机系统里面都少不了用户认证这一步骤,最常见的认证就是账号密码认证,也就是注册、登录这一流程。

在现实生活中,人也需要认证,大家应该都有个 身份证,回想一下这个身份证是从哪里来的呢?
办过身份证的应该都知道,一般情况下,身份证需要本人带着 户口本 去 公安局 (不知道现在改了木有?)办理,工作人员在核对了相关信息,确认无误的情况下会给你颁发一个身份证, 有效期 一般是10-20年,在一些需要认证的时候,你就可以拿出身份证 校验 核对身份,比如买火车票,出国,或者办理其它证件.

阅读全文 »

浅谈Golang协程

发表于 2018-12-10 | 更新于 2024-12-29 | 分类于 Golang
| 字数统计 3.4k

前言

学习和使用golang也有一段时间了,golang最近2年在国内很火,提起golang和其它语言最大区别莫过于协程,不过咱今天先不说协程,我先说一下自己的一些理解。

对c熟悉的人应该对go不陌生,它们都属于强类型静态编译型语言,在语法上和PHP这种弱类型动态解释型语言不一样,虽然差异很大,但是基本语法都是差不多,掌握一种语言之后再去学其它语言语法不是什么大问题。

在IT行业,编程语言之争一直是个很热闹的话题,编程语言之间的区别不仅仅在于语法和特性,语法只是表达编程思想的方式,一个编程语言的背后往往是其强大的生态圈,比如c语言之所以经久不衰,那是因为它几乎可以认为是创世纪语言,是当代编程的起点,而PHP则以快速处理文本,快速搭建web网站出名,JS则是浏览器编程的唯一选择,Python拥有的科学计算库是其它语言没有的。

说到go的优点,一般都集中在静态编译、毫秒级GC、简洁、并发并行等特性上面,go是2008年诞生的,由C语言之父设计,相对其它语言来说比较年轻,可以说在设计之初吸收了各大语言的优点。

阅读全文 »

自建梯子访问Google等学术网站

发表于 2018-12-09 | 更新于 2024-12-29 | 分类于 Linux
| 字数统计 1.6k

这个话题有点敏感,但是我首先说明一下,此处只做一个记录,网上类似的文章超级多,而且我纯粹是拿来上Google学习用,搞web开发的应该没几个不用Chrome的,Chrome配上Google账号同步简直完美。

阅读全文 »

闲谈Linux桌面系统下常用工具

发表于 2018-12-08 | 更新于 2024-12-29 | 分类于 Linux
| 字数统计 1.2k

前言

作为一个编程开发人员,Lin