202109-04 分析Go语言中CSP并发模型与Goroutine的基本使用 目录一、并发实现模型1.1、多进程1.2、多线程1.3、协程二、共享内存与CSP三、Goroutine一、并发实现模型1.1、多进程在之前的文章当中我们曾经介绍过,进程是操作系统资源分配的最小单元。所以多进程是在操作系统层面的并发模型,因为所有的进程都是有操作系统的内核管理的。所以每个进程之间是独立的,每一个进程都会有自己单独的内存空间以及上下文信息,一个进程挂了不会影响其他进程的运行。这个也是多进程最大的优点,但是它的... 继续阅读 >
202109-04 浅谈Go语言多态的实现与interface使用 目录一、多态的含义二、抽象类与接口三、Golang中的接口四、总结一、多态的含义对于Java或者是C++而言,我们在使用变量的时候,变量的类型是明确的。但是如果我们希望它可以宽松一点,比如说我们用父类指针或引用去调用方法,但是在执行的时候,能够根据子类的类型去执行子类当中的方法。也就是说实现我们用相同的调用方式调出不同结果或者是功能的情况,这种情况就叫做多态。举个非常经典的例子,比如说猫、狗和人都是哺乳动物。... 继续阅读 >
202108-31 再次探讨go实现无限 buffer 的 channel方法 目录前言实现接口的设计内部实现测试一下优化再测试一下补充遗憾前言总所周知,go里面只有两种channel,一种是unbufferedchannel,其声明方式为ch:=make(chaninterface{})另一种是bufferedchannel,其声明方式为bufferSize:=5ch:=make(chaninterface{},bufferSize)对于一个bufferedchannel,无论它的buffer有多大,它终究是有极限的。这个极限就是该channel最初被make时,所指定的bufferSize。jojo,buffer... 继续阅读 >
202108-31 Go 容器遍历的实现示例 前文回顾前面的文章主要介绍了Go语言中提供了list列表和Map映射关系容器,这两种容器都是我们日常经常使用到的。介绍了好多种的Go语言提供的基础容器,免不了要查询容器中的数据,那么是如何实现遍历的呢?本文将会介绍几种常用容易的遍历及其使用。容器遍历Go语言中range关键字用于for循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中... 继续阅读 >
202108-25 go web 预防跨站脚本的实现方式 目录一 点睛二 先看一个转义的例子三使用 text/template 进行处理四使用 html/template 进行处理一 点睛现在的网站包含大量的动态内容以提高用户体验,比过去要复杂得多。所谓动态内容,就是根据用户环境和需要,Web应用程序能够输出相应的内容。动态站点会受到一种名为“跨站脚本攻击”(CrossSiteScripting,安全专家们通常将其缩写成XSS)的威胁,而静态站点则完全不受其影响。攻击者... 继续阅读 >
202108-22 golang中cache组件的使用及groupcache源码解析 groupcache简介在软件系统中使用缓存,可以降低系统响应时间,提高用户体验,降低某些系统模块的压力.groupcache是一款开源的缓存组件.与memcache与redis不同的时,groupcache不需要单独的部署,可以作为你程序的一个库来使用.这样方便我们开发的程序部署.本篇主要解析groupcache源码中的关键部分,lru的定义以及如何做到同一个key只加载一次。缓存填充以及加载抑制的实现上篇有提到load函数的实现,缓存填充的逻辑也体现在这里。gr... 继续阅读 >
202108-22 Go timer如何调度 目录1.使用场景2.图解源码2.1四叉堆原理2.3timer是如何加入到timer堆上的?2.4Reset时timer是如何被操作的?2.5Stop时timer是如何被操作的?2.6Timer是如何被真正执行的?3.Timer使用中的坑3.1错误创建很多timer,导致资源浪费3.2程序阻塞,造成内存或者goroutine泄露本篇文章剖析下Go定时器的相关内容。定时器不管是业务开发,还是基础架构开发,都是绕不过去的存在,由此可见定时器的重要程度。我们不... 继续阅读 >
202108-06 go语言中http超时引发的事故解决 前言我们使用的是golang标准库的httpclient,对于一些http请求,我们在处理的时候,会考虑加上超时时间,防止http请求一直在请求,导致业务长时间阻塞等待。最近同事写了一个超时的组件,这几天访问量上来了,网络也出现了波动,造成了接口在报错超时的情况下,还是出现了请求结果的成功。分析下具体的代码实现typerequeststruct{methodstringurlstringvaluestringps*params}typeparamsstruct{timeout... 继续阅读 >
202107-22 详解Go与PHP的语法对比 目录概述数据类型变量类型转换数组Maps对象类型函数控制语句If-ElseSwitchFor循环While循环Foreach/Range概述Go是由Google设计的一门静态类型的编译型语言。它有点类似于C,但是它包含了更多的优点,比如垃圾回收、内存安全、结构类型和并发性。它的并发机制使多核和网络机器能够发挥最大的作用。这是GoLang的最佳卖点之一。此外,Go速度快,表现力强,干净且高效。这也是Go如此吸引开发者学习的原因。PHP是一种动态类... 继续阅读 >
202107-17 详解Gotorch多机定时任务管理系统 目录前言cron+守护进程信号处理小结前言先介绍下问题:组内有十来台机器,上面用cron分别定时执行着一些脚本和shell命令,一开始任务少的时候,大家都记得哪台机器执行着什么,随着时间推移,人员几经变动,任务也越来越多,再也没人能记得清哪些任务在哪些机器上执行了,排查和解决后台脚本的问题也越来越麻烦。解决这个问题也不是没有办法:维护一个wiki,一旦任务有变动就更新wiki,但一旦忘记更新wiki,任务就会变... 继续阅读 >
202107-17 详解PHP调用Go服务的正确方式 目录问题服务耦合服务抽取UnixDomainSockets进程间通信简单介绍适用场景代码实现Go实现的Trie树GoServerPHPClient小结效率杂谈问题服务耦合我们在开发过程中可能会遇到这样的情况:进程依赖于某服务,所以把服务耦合在进程代码中;服务初始化耗时长,拖慢了进程启动时间;服务运行要占用大量内存,多进程时内存损耗严重。文本匹配服务,它是消息处理流程中的一环,被多个消息处理进程依赖,每次初始化进程要6... 继续阅读 >
202107-09 go 实现简易端口扫描的示例 我在代码里定义了两个通道,分别用于生产端口和限制连接数,如果不限制连接数,容易被对方检测到或导致对方服务器不能正常运行。//生产端口varport=make(chanint,10)//限制并发数varconnect=make(chanstring,5)可以使用net库的Dial函数做为socket客户端,需要注意的是要设置超时时间,因为若主机不存在,或目标端口是关闭的,往往需要花费数秒才返回错误,这样扫描大量端口时效率会极其低下。在go中可以使用net.Dialer... 继续阅读 >
202107-09 go xorm框架的使用 目录一、创建数据库连接二、操作mysql数据库查询struct结构体1、Get方法2、Exist方法3、Find方法4、Join方法5、Iterate方法6、Count方法7、Rows方法插入更新删除Column属性定义一、创建数据库连接xorm支持单引擎和多引擎,多引擎的场景对于初学者来说,没有必要考虑,所以我们主要学习的是单引擎的数据库连接,为了方便检查SQL,需要启用打印功能,默认不开启varengine*xorm.Enginefuncmain(){varerrerrorengine,err=xo... 继续阅读 >
202107-08 Golang实现AES对称加密的过程详解 AES加密AES对称加密简介AES是一个对称密码,旨在取代DES成为广泛使用的标准。是美国联邦政府采用的一种区块加密标准。AES对称加密过程加密解密算法的输入是一个128位分组。这些分组被描述成4×4的字节方阵,这个分组被复制到数组中,并在加密和解密的每一阶段都被修改。在字节方阵中,每一格都是一个字,包含了4字节。在矩阵中字是按列排序的。加密由N轮构成,轮数依赖于密钥长度:16字节密钥对应10轮,24字节密钥对应12轮,32字节... 继续阅读 >
202107-06 详解Go语言微服务开发框架之Go chassis 目录引言架构获取配置配置项形态配置运行时热加载例子引言https://github.com/go-chassis/go-chassis是一个微服务开发框架,而微服务开发框架带来的其中一个课题就是:当单体应用向微服务转型后,有大量的配置需要管理,而你并不希望登录到远端机器去更改配置,并重启应用,尤其是现在已经是容器的时代了,也不希望因为一个配置的变更,而发布一个新的软件包。那么分布式系统中每个进程的动态配置管理及运行时热加载就成为了一个亟... 继续阅读 >
202107-04 解析Go的Waitgroup和锁的问题 学Go的时候知道Go语言支持并发,最简单的方法是通过go关键字开启goroutine即可。可在工作中,用的是sync包的WaitGroup,然而这样还不够,当多个goroutine同时访问一个变量时,还要考虑如何保证这些goroutine之间不会相互影响,这就又使用到了sync的Mutex。它们是如何串起来的呢?一、Goroutinue先说goroutine,我们都知道它是Go中的轻量级线程。Go程序从main包的main()函数开始,在程序启动时,Go程序... 继续阅读 >