GO小知识之如何做JSON美化
[原文地址](https://zhuanlan.zhihu.com/p/65905512) http接口测试或一些其他情况常需要打印 JSON 返回,但是默认的json展示形式是紧凑型的,不易阅读,或许很多人习惯于使用在线格式化工具。但如果能用代码直接 JSON 美化,为什么还要多开一次浏览器呢? ## 非string类型的结构体、map等类型的Marsh美化 比如有这样一个map或者结构体。 u := map[string]interface{}{ "id": ...阅读全文
聊聊Golang中的make和new
概述 根据官方文档描述 make是用来分配并且初始化slice,map,chan等类型的对象 new也是用来分配内存的,返回对应内向的0值的指针,但并不初始化对象 看下面例子,就很明显了 a := new([]int) b := make([]int,1) fmt.Println(a) fmt.Println(b) fmt.Println(unsafe.Sizeof(*a)) fmt.Println(unsafe.Sizeof(b)+unsafe.Sizeof([1]int{})) output...阅读全文
一键解决 go get golang.org/x 包失败
问题描述 当我们使用 go get、go install、go mod 等命令时,会自动下载相应的包或依赖包。但由于众所周知的原因,类似于 golang.org/x/... 的包会出现下载失败的情况。如下所示: $ go get -u golang.org/x/sys go get golang.org/x/sys: unrecognized import path "golang.org/x/sys" (https fetch: Get https://golang.org/x/sys?go-...阅读全文
Golang 大杀器之性能剖析 PProf
Golang 大杀器之性能剖析 PProf 前言 写了几吨代码,实现了几百个接口。功能测试也通过了,终于成功的部署上线了 结果,性能不佳,什么鬼????? 想做性能分析 PProf 想要进行性能优化,首先瞩目在 Go 自身提供的工具链来作为分析依据,本文将带你学习、使用 Go 后花园,涉及如下: runtime/pprof:采集程序(非 Server)的运行数据进行分析 net/http/pprof:采集 HTTP Server 的运行时数据进行分析 是什么 pprof 是用于可视化和分析性能分...阅读全文
golang pprof分析net/http的性能瓶颈
前言: 同事写了一个api网关服务,需要我进行并发和稳定性压测。一说压测大家会想起ab, wrk工具。 apache的ab性能有点差强人意,虽然事件用的也是epoll,奈何是单线程,不能泡满cpu。wrk是个好东西,基于redis ae_event封装的事件池,另外可以多线程模式和lua脚本。但如果压测的逻辑比较复杂,那么lua就不好搞了,尤其需要第三方模块引入的时候。 作为两三年经验的gopher来说,自然会使用golang写压力测试脚本。 该文章后续仍在不断的更新修改中, 请移步到原文地址 ...阅读全文
golang函数调用的执行逻辑
golang中的函数调用底层是靠栈帧实现的,翻看了好多文章发现很少有从最终机器码层面进行解释的,我跟踪发现要比golang汇编复杂一些,具体为什么要有这个命令为啥这么扩容,扩容多少这都是编译器算出来的,我们不需要知道。这篇文章的目的是对函数调用的一个更深层次的认识,当然如果要学好golang中的汇编还需要去看golang汇编相关的知识讲解。从实际开发中需要明白golang汇编就好。 以下代码环境: 1,Linux version 3.10.0-957.12.2.el7.x86_64 2,go v...阅读全文
linux IO多路复用笔记
什么是IOio是数据的接收和发送操作,linux进程无法直接操作io设备,需要通过系统调用请求内核来完成io操作,内核为每个设备维护一个缓冲区。用户进程发送操作的一个完整io包括两部分:用户空间将数据发送到内核,内核将数据发送到io设备。用户进程接收操作的一个完成io也是包括两部分:内核从io设备中接收数据到缓冲区,从内核缓冲区复制数据到进程空间5种io模型阻塞io:进程发起io操作后,进程被阻塞,转到内核空间处理,整个io处理完后返回进程。特点:需要为每一个io请求分配一个进程或线程来处理非阻...阅读全文
[译]使用Go处理每分钟百万请求
这篇文章在medium上很火,作者以实际案例来分析,讲得很好。 我们经常听说使用Go的goroutine和channel很容易实现高并发,那是不是全部代码都放在goroutine中运行就可以实现高并发程序了呢?很显然并不是。这篇文章将教大家如何一步一步写出一个简单的, 高并发的Go程序。 正文 我在几家不同的公司从事反垃圾邮件,防病毒和反恶意软件的工作超过15年,现在我知道这些系统最终会因为我们要每天处理大量数据而变得越来越复杂。 目前,我是smsjunk.com的CEO和 KnowBe4的首席...阅读全文
打造世界最快的go模板引擎gorazor 2.0
自2014年与 @于康 等小伙伴发布gorazor后,我其实没有想过还会再给它做更新,因为近些年,网站的开发基本朝前后端分离的方向发展,一个供后端使用的模板引擎其实使用场景不多。gorazor应该是go语言的第一个支持将模板编译成为go代码的“预编译式”模板引擎。采用预编译一个显而易见的好处当然是渲染速度;没想一晃五年过去,go的后端模板引擎居然层出不穷,而相比起后来出现的这些模板,gorazor的渲染速度,赫然是最慢的一个:<img src="https://pic3.zhimg.com/v2...阅读全文
golang server epoll client 使用连接池 15万+ qps
epoll 加连接池 前几天看了epoll 使用,今天写了一个测试脚本,测试一下epoll加连接池的性能 50万个请求,连接池使用2000连接,发送 "test" 服务端接受后 转成大写返回,处理完所有的请求耗时3.731506996s,性能很强大(注意:需要在linux环境下测试) 为什么要使用连接池? 拿数据库举例,频繁的建立、关闭连接,会极大的降低mysql的性能,因为建立连接,释放连接引起的大量性能开销。 连接池技术带来的优势: 1、资源重用 由于tcp得到重用,避免了频繁创建、释放连接...阅读全文
“三次握手,四次挥手”你真的懂吗?
目录 什么是“3次握手,4次挥手” TCP服务模型 TCP头部 状态转换 为什么要“三次握手,四次挥手” 三次握手 四次挥手 “三次握手,四次挥手”怎么完成? 三次握手 四次挥手 为什么建立连接是三次握手,而关闭连接却是四次挥手呢? “三次握手,四次挥手”进阶 ISN 序列号回绕 syn flood攻击 无效连接的监视释放 延缓TCB分配方法 使用SYN Proxy防火墙 连接队列 半连接队列满了 全连接队列满了 命令 小结 “三次握手,四次挥手”redis实例分析 总结 参考资料 记得刚毕业找...阅读全文
深度解密HTTP通信细节
目录 HTTP报文截获 背景介绍 抓包 mac本地 远程docker 请求 && 分析 关闭服务进程 关闭docker 重启docker 正常请求 HTTP协议分析 整体介绍 编码 MIME类型 URI/URL/URN HTTP方法 状态码 报文格式 HTTP协议进阶 代理 缓存 cookie 实体和编码 国际化支持 重定向与负载均衡 HTTP重定向 DNS重定向 HTTP连接 并行连接 持久连接 管道化连接 小结 参考资料 上一篇文章中,我们学会了用wireshark和tcpdump来分析TC...阅读全文
Go组件学习——cron定时器
1 前言 转到Go已经将近三个月,写业务代码又找到了属于Go的条件反射了。 后置声明和多参数返回这些Go风格代码写起来也不会那么蹩脚,甚至还有点小适应~ 反而,前几天在写Java的时候,发现Java怎么启动这么慢,Java怎么能够容忍这些用不到的代码还理直气壮的躺在那……等等,这些话在哪听过类似的??? “Go为什么要后置声明,多别扭啊” “Go里面为啥要定义这么多的struct,看的头晕” …… 其实,没有最好的语言,只有最适合的。 前面《Go语言学习》系列主要介绍了一些Go的基础知识和相较于...阅读全文
Go 编程: 一分钟实现管道 pipe 功能
乘着打盹的时间看了一眼前两天写的日期转换的开源工具: ts。发现管道 pipeline 的功能点可以放大一下, 就此记录一下以备将来只需。 管道是什么 但凡在类 Unix 系统上敲过命令的人,大多使用过管道功能. 所谓管道,就是将A程序的标准输出作为B程序的标准输入。而在类 Unix 系统只需要使用 | 符号,连接 A 和 B 程序即可, 即 A | B。通过多次管道连接,就可以实现非常强大的功能。所以在类 Unix 系统上开发命令行程序有个著名的原则: KISS,即 Keep It Simpl...阅读全文
golang const 内itoa 用法详解及优劣分析
首先itoa 是什么 const 内的 iota是golang语言的常量计数器,只能在常量的表达式中使用,,即const内。 iota在const关键字出现时将被重置为0(const内部的第一行之前),const中每新增一行常量声明将使iota计数一次。 可以参照行号理解,也就是说将iota理解为const语句块中的行索引。 关于其特性举例如下: 通过例子说明其各种特性。 1、每次 const 出现时,都会让 iota 初始化为0. const a = iota // a=0 const ( b...阅读全文
Go 最小硬件编程(第一部分)
我们能够让 Go 在多低的配置下运行并做一些实用的事情呢? 最近我购买了这个特别便宜的开发板: [![STM32F030F4P6](https://ziutek.github.io/images/mcu/f030-demo-board/board.jpg)](https://ziutek.github.io/2018/03/30/go_on_very_small_hardware.html) 购买它,我基于以下三个理由:第一,我(作为一个程序员)从未搞过 STM32F0 系列的...阅读全文
YourNovel-基于Golang的开源小说搜索引擎&免费小说阅读网站发布啦
YourNovel - 开源小说搜索引擎 项目地址: https://github.com/DemonFengY... 官网: http://www.yournovel.cn 起源 项目起源于Github上另外一个类似的小说搜索引擎项目 https://github.com/howie6879/... 该项目给小说爱好者带来极大的福利(无广告、清爽的界面)。但是, 该项目作者貌似马上要关闭网站了, 想想自己手上有多余的服务器并且刚学完Golang, 马上行动起来使用Golang花了几天的时间开发...阅读全文
解决go get golang.org/x 包失败
某天在用golang写代码,需要用到ssh功能,于是在网上搜了一下发现有个golang.org/x/crypto/ssh包,很自然就想到要安装 go get -u golang.org/x/crypto/ssh 你会发现由于golang.org官网各种网络问题,很难安装 哈哈,找到一种goproxy的解决方案,该方案适用于go 1.13及以上的版本 ding@ding-Lenovo:~$ go version go version go1.13.1 linux/amd64 ding@ding-L...阅读全文
Golang程序员开发效率神器汇总!
一. 开发工具1)sql2go用于将 sql 语句转换为 golang 的 struct. 使用 ddl 语句即可。例如对于创建表的语句: show create table xxx. 将输出的语句,直接粘贴进去就行。http://stming.cn/tool/sql2go.html2)toml2go用于将编码后的 toml 文本转换问 golang 的 struct.https://xuri.me/toml-to-go/3)curl2go用来将 curl 命令转化为具体的 golang 代码....阅读全文