Go
PHPerJiang
一只有理想的程序猿
展开
-
GO goroutine暴涨与response.Body.Close()的关联
背景项目接口压测过程中发现goroutine暴涨头脑风暴看到暴涨我第一时间想的不是网络问题,而是代码层面的问题,因为我知道我代码里没有写.Body.Close(),没有手动关闭链接,导致协程无法正常关闭,从而goroutine暴涨代码review我看了下generate_url中使用http包的地方,发现咱们用的框架的http被二次封装过,看框架源码, 代码层面已经有一个Body.Close(),所以外层调用默认参数下,都是会关闭请求资源的所以理论上讲,我外层并不需要..原创 2020-09-07 09:58:20 · 1202 阅读 · 0 评论 -
Golang & PHP 正则大小写差异
背景app_url_handle重构过程中,我们采取尽量避开正则操作,但是事与愿违,还是有场景用正则,结果就踩了个大小写的坑PHP版正则/(https|http):\/\/(item|item.m)\.(jd)\.(com|hk)(\/product)?\/(\d+)\.html/iPHP版正则提取了多个地方的数据,但是只用了其中的id, 并且忽略大小写,如果你把正则原封不动的甩到golang正则编译器里,绝对报错,原因是两种语言的大小写语法不通GO版正则(?i)(...原创 2020-09-07 09:55:06 · 521 阅读 · 0 评论 -
Golang & PHP 针对base64的差异
背景在重构app_url_handle的时候,有一段逻辑的数据是需要使用base64处理的,身为老鸡贼的我,本能的去看了下golang的文档,果然,用起来没有我想象的那么容易,两种语言还是有差异的,接下来我给大家举例并分析一波,以便理解。概念这里需要先普及一个概念和一个索引表 base64双向的编码/解码协议,根据一个64字符的字符集定义,RFC 4648标准化了两种字符集。默认字符集用于MIME(RFC 2045)和PEM(RFC 1421)编码;另一种用于URL和文件名,用'-'和'_原创 2020-09-07 09:53:25 · 1165 阅读 · 0 评论 -
Golang 指针nil问题、结构体判空 踩坑-1
背景 1有两个方法A 、B 以及一个结构体 P , AB中传递的是P的指针问题1 代码如下此代码看着没有明显报错,当你编译的时候不会报错,能打包,但是你运行的时候会报错,panic: runtime error: invalid memory address or nil pointer dereference , 提示是个空指针。分析为什么会这样呢,我们首先是初始化了一个结构体指针p,此时它的值是nil,但是我们并没有进行数据存储操作,所以p的指向不变,仍然是ni...原创 2020-09-07 09:49:47 · 8079 阅读 · 1 评论 -
vscode配置go环境
前提是本地配置好了go环境如果想省事,可以直接下载goland,这个是专门用来写golang的,支持的很完美,传送门https://www.jetbrains.com/go/promo/?gclid=EAIaIQobChMIrY7pxbvB6gIVQteWCh1QLw-YEAAYASAAEgI5UfD_BwE如果你想用vscode撸代码,那么你需要做下面的事情1.打开vscode,在应用商店中搜索Go, 安装go插件,如下图2.打开一个终端 1) 输入命令e...原创 2020-09-03 15:56:04 · 6667 阅读 · 0 评论 -
Golang 原子操作的应用及踩坑
背景gener_url常驻内存获取配置优化常驻内存的相关请见博文Golang 常驻内存学习并使用优化原因由于需要将3个redis-key改为常驻内存,一开始我是逐个key获取并判断err,有问题则终止本次操作,虽然常驻内存的启动仅在项目启动时、每分钟一次更新,但我希望尽量不写冗余操作,所以做了如下优化:使用pipeline处理key 将之前为了处理map类型与unsafe指针转换而额外引入的结构体指针给清除掉。原子操作golang中会出现并发读取变量,那么为了防止数...原创 2020-09-03 14:57:24 · 1248 阅读 · 0 评论 -
Golang 常驻内存学习并使用
背景 link重构过程中,发现一个问题,存在2个大key(很大那种),在PHP版代码下,是通过构造函数读取redis拿到,众所周知,PHP每次请求结束后都会销毁, 那么就意味着PHP版会反复读取这个大key,虽然现在线上没问题,但是却是一颗毒瘤。思考既然我们用golang重构项目,那么我们是不是需要发挥go的语言特性来优化掉这个地方呢?同事建议使用常驻内存在做这块,充分发挥go的特性,项目初始化的时候我们读一次放到内存里,然后使用go的定时器,每分钟获取一次配置更新内存中的配置,这...原创 2020-09-03 14:52:11 · 1476 阅读 · 0 评论 -
Golang json解析踩坑
背景众所周知,PHP是弱类型,Go是强类型,所以Go的json解析注定曲折。有一段json如下:{"name":"Gopher","age":23,"marray":false}PHP使用:json_decode函数解析,解出的数据类型并不重要Go解析: 使用json.Unmarshal函数,此函数如果使用原生函数 ,目标结构体字段数字类型定义为字符串类型,那么解析结果中会丢失数字类型,即原生解析,无法把数字类型解析为字符创类型解决方案如果场景中确实需要将数字类型的数据.原创 2020-09-03 14:50:54 · 4420 阅读 · 0 评论 -
go中值引用与指针引用
值接受者与指针接受者的一个小坑:1.值接收者:(variabletype)func()值接受者可以给接收值、也可以接收指针,因为go会对接收的指针进行解引用。但是!variable传递进函数的只是副本,他们都是在variable的副本上进行操作,并不影响variable的原本的值。2.指针接受者:(variable *type)func()指针接收者接收的是var...原创 2019-08-22 15:22:58 · 1072 阅读 · 0 评论 -
Goland常用快捷键
快捷键 作用 备注ctrl + n 导航到类名ctrl + shift + n 导航到文件ctrl + e/ctrl + shift + e 打开到最近的文件/打开最近修改的文件ctrl + shift + i 简短地查看源定义ctrl + alt + m 重构表达式为函数 光标在表达式的末尾ctrl + space 快速返回实现 return 字段后使用ctrl+ shift+ a...原创 2019-04-30 22:50:35 · 612 阅读 · 0 评论 -
Goland下载安装破解
下载安装破解https://blog.csdn.net/u014044812/article/details/87621168转载 2019-04-27 09:07:56 · 2338 阅读 · 0 评论 -
区块链(初识)
区块链分类区块链主要分为三类共有链 任何人都可以读取的链比如以太坊和EOS 私有链 开发节点 测试节点等 联盟链 Fabric R3联盟 以太坊EEA 轻松筹的阳光链等区块链的认知区块链可以认为是一种特殊的分布式数据库,主要作用是存储数据,任何人都可以架设节点,所有节点都是平等的,我们可以向任何节点写入数据,以为数据最后都是要同步到各个节点的 区块链是去...原创 2018-09-10 09:01:59 · 693 阅读 · 0 评论 -
区块链(初识二)
区块链技术框架核心技术 密码学和数字签名用于身份地址标识 共识算法用于工作量证明 分布式存储技术用于储存交易记录和区块,分布式网络技术用于网络通信和节点发现 区块链的本质 区块链的本质是一个分布式的数据库 区块链是一个共有的数据库,不是私有数据库,所有人都可以进行查阅但是不能更改 区块链是加密货币和智能合约的基础 实现区块的结构 在区块链中储存有效信息的是区...原创 2018-09-15 17:42:16 · 208 阅读 · 0 评论 -
Go学习笔记(三)
高级数据类型数组类型 package _arrayimport "fmt"//数组的声明方法与其他语言不同,声明格式为 type name []int 由关键字type、类型名称和类型字面量组成。func Show_array1() { var arr = [3]string{"PHPerJiang","CoderJiang","GoerJiang"} for key,va...原创 2018-08-31 15:02:22 · 148 阅读 · 0 评论 -
Go学习笔记(二)
数据类型数据类型种类有很多不一一说明 值得注意的是所占内存,int8的意思是数值为整形,大小为八位即一个字节,打印出所占大小为1 另外要注意的是不加数字后缀的int类型是可变的,跟随系统变化,比如win32,int就默认为32位,win64,int即默认64位数据声明var全局变量可以在函数体内外声明 var在函数体内可以省略,但省略的同事需要使用 : ,比如 var i int...原创 2018-08-30 09:14:41 · 131 阅读 · 0 评论 -
Go学习笔记(四)
字符串操作(包strings内置函数)package mainimport ( "fmt" "strings")const NAME = "PHPerJiang"func main() { //func EqualFold判断两个utf-8编码字符串(将unicode大写、小写、标题三种格式字符视为相同)是否相同。 fmt.Println(strings.EqualFo...原创 2018-09-01 13:49:56 · 129 阅读 · 0 评论 -
Go学习笔记(一)
下载安装go下载地址:https://golang.org,下载对应系统的go,然后傻瓜式安装goland下载地址:https://www.jetbrains.com/go Go命令行工具go build: 用于编译源码文件、代码包、依赖包 go run : 可以编译并运行Go源码文件 go get : 动态获取远程代码包 Go基础语法package关...原创 2018-08-29 15:03:57 · 129 阅读 · 0 评论