
Golang
moxiaomomo
虚怀若谷,大爱无疆
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
[Go菜牛系列]通过go-wrk进行HTTP接口压力测试
http 接口压力测试示例‵go-wrk是一个用Go语言实现的轻量级的http基准测试工具,类似于wrk,本文将简单介绍一下如何使用go-wrk`实现接口的性能(压力)测试。安装 go-wrkhttps://github.com/wg/wrk# 本次采用go-wrk测试https://github.com/adjust/go-wrkgit clone git://github.com/adeven/go-wrk.gitcd go-wrk# 开启go modules的情况, 需要初始化配原创 2020-08-06 23:19:40 · 3984 阅读 · 0 评论 -
[Go菜牛系列]go module与本地包导入
场景需求假设当前同一个项目中有多个模块,每个模块有单独的go.mo, 结构如下所示:├── package1│ ├── go.mod│ └── main.go└── package2 ├── go.mod ├── hello │ └── hello.go └── package2.gopackage2包相关代码// package2/package2.gopackage package2import "fmt"func New(){原创 2020-07-26 23:37:43 · 354 阅读 · 0 评论 -
[Go菜牛系列]net/http包知识点
划重点关于 net/http 包:net/http本身基于goroutine实现, 通过新建协程处理新的连接任务;默认是长连接: net/http客户端发起请求时header标记HTTP/1.1;连接可复用:默认创建连接池;关于连接池使用:池中找不到空闲连接时,会重新new一个连接,而不会阻塞等待一个连接;关于连接断开:如果对端关闭连接,由于Go Runtime会在底层进行epoll wait,监听close事件并关闭相关fd资源,上层应用可以被告知哪些连接已关闭,从而进行相关的逻辑处理;关原创 2020-05-17 23:58:10 · 426 阅读 · 0 评论 -
[Go菜牛系列]研究database/sql
关于数据库访问,Golang中提供了标准库database/sql。不过它不是针对某种具体数据库的逻辑实现,而是一套统一抽象的接口。真正与数据库打交道的,是各个数据库对应的驱动Driver;在使用时需要先注册对应的驱动库,然后就能通过标准库sql中定义的接口来统一操作数据库。创建sql.DB连接池我们来看一下如何创建sdl.DB连接池,以MySQL为例:import ( "log" "os" "database/sql" _ "github.com/go-sql-driver原创 2020-05-17 23:54:22 · 379 阅读 · 0 评论 -
[Go菜牛系列]结构体转换为JSON字符串的一个坑
通过json.Marshal来将结构体数据转换为json字符串时,需要注意结构体内成员变量的首字母大小写的问题,很容易会掉进坑里.来看一下这个例子:package mainimport ( "encoding/json" "fmt")type Student struct { Name string age int}func main() { var s Student...原创 2020-04-28 00:41:52 · 812 阅读 · 0 评论 -
[Go菜牛系列]理解go build与go install
两者用途go build: 可用于测试编译包,并在项目(main包同级目录)下生成可执行文件;go install: 主要用来生成库和工具可执行文件。1) 编译包文件(没有main包),编译后的包文件会放到($GOPATH/pkg)下; 2)编译生成可执行文件(没有main包),可执行文件会放到($GOPATH/bin)下.两者主要共同点都可以生成二进制可执行文件.两者主...原创 2020-04-27 00:10:48 · 632 阅读 · 0 评论 -
[Go菜牛系列]常见并发模式
本文来瞅瞅常见并发模式的用法. 在大多数语言中,为了解决线程同步问题都会用到加锁的方法;Go也不例外,但是Go也提供了另外的方式来解决同步通信问题:将共享的值通过通道来进行传输.实践中通过goroutine和channel的配合使用实现了这一特性.通过互斥锁实现同步通信package mainimport ( "fmt" "sync")func m...原创 2020-04-23 22:09:18 · 672 阅读 · 0 评论 -
[Go菜牛系列]25个关键字用法示例
var & const:声明变量(var)和常量(const)var num intconst str string = "test"// 批量定义变量var ( username string = "xiaomo" emails []string)// 批量定义常量const ( host = "127.0.0.1" port = 8080)packag...原创 2020-04-11 12:15:22 · 359 阅读 · 0 评论 -
[golang]使用hmset代替hset提高写入效率
在往redis写入hash集合类型数据时,如果使用hset可能需要进行多次操作调用,采用hmset可以完成批次写入,提高写入效率。示例代码:package mainimport ( "fmt")func main() { // 获取redis连接 rConn := ... defer rConn.Close() var args []interface{} = []int...原创 2020-04-08 22:15:32 · 3296 阅读 · 0 评论 -
[Golang]调用外部shell程序处理文件
在需要对文件进行操作的一些场景,比如文件合并,计算文件hash或大小,除了可以完全使用golang来处理,也可以借助外部shell或bash来完成。shell是应用程序和linux内核之间的接口程序,而bash可简单理解为shell的加强版,支持更多的命令;通过bash来完成运维相关的工作是比较常见的场景,设计到文件的处理更是常态。因此大多数情况下,golang调用外部shell来处理文件也是合...原创 2020-04-03 00:07:31 · 1020 阅读 · 0 评论 -
[golang]结合url.Values发送post请求
server端示例:package mainimport ( "fmt" "net/http")func main() { http.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { var ...原创 2020-03-21 08:50:07 · 7571 阅读 · 0 评论 -
[golang]关于数据库sql.DB连接的几个参数优化
关于sql.DB,在建立和使用数据库连接方面有几个参数我们可以根据实际场景来进行优化一下,配置得当的话可以有效提高性能和降低系统资源消耗。SetMaxOpenConns 用于设置最大打开的连接数,默认值为0,表示不限制。SetMaxIdleConns 用于设置闲置的连接数,默认值为2;SetConnMaxLifetime 可以限制一个连接使用的最大时长,默认值为0,表示不限制。SetM...原创 2020-03-21 08:48:23 · 4751 阅读 · 1 评论 -
[golang]通过github下载golang官方工具包
如果无法科学上网, 国内网络将无法访问 golang.org。而golang的官方工具包(golang.org/x/)这种情况下也无法直接安装,会给开发工作带来很大的麻烦。以下简单介绍如何通过github迂回解决这个问题 (golang库其镜像托管在github.com/golang/上)。方法1.github上下载对应的工具包后,移动到golang.org下对应的目录首先下载Github上...原创 2020-03-16 15:36:25 · 3666 阅读 · 0 评论 -
[golang]结构体(slice)如何转map(slice)
需求:有一个切片,其元素是不固定类型的结构体,如何转换为元素为map类型的切片。以下例子是通过反射reflect的方法来完成这个转换过程。package mainimport ( "fmt" "reflect")type Student struct { Name string `json:"name"` Age uint `json:"age"...原创 2020-03-01 21:30:30 · 5297 阅读 · 0 评论 -
[leetcode]两数相加
空闲时间用Go刷了一道水题, 题目和题解如下:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -...原创 2020-01-01 22:11:50 · 281 阅读 · 0 评论 -
基于jaeger和grpc实现的rpc调用链跟踪模块
grpc-jaeger说明具体源码可参考我的github源码grpc-jaeger是基于Go的针对gRPC的一种拦截器实现,用于结合jaeger来实现rpc调用链跟踪;可用于集成到微服务的分布式trace功能中。grpc包中对外暴露了两个接口:grpc.UnaryClientInterceptor及grpc.UnaryServerInterceptor, 只要将这两个函数重写即可以自定...原创 2018-06-17 22:03:46 · 4725 阅读 · 0 评论 -
基于环形队列和令牌桶实现的限流模块
概述在分布式服务架构下,比如微服务架构,一般需要构建一个独立的gateway模块。gateway模块的主要作用包括流量控制,规则路由,负载均衡,鉴权,熔断等等;而gateway一般是stateless的,因此可自由弹性伸缩集群规模,以应对实际的访问场景。 本文主要介绍通过golang实现限流模块的一种方案,其关键点主要有两个:环形队列(ring queue)令牌桶算法(token b...原创 2018-06-15 09:29:58 · 1887 阅读 · 0 评论 -
Go之FAQ(一)
纯粹业余兴趣翻译,能力有限水平业余,欢迎拍砖。 文中还有一些句子没作翻译,是因为我完全没弄懂:-) 问题较多, 分part翻译,本文为第一part。 原文: Frequently Asked Questions (FAQ)起源What is the purpose of the project?非系统底层语言的出现已经有十多年的时间, 而在这期间计算环境已经发生了巨大变化。以下是几大发展趋势:翻译 2016-04-28 18:04:53 · 4164 阅读 · 0 评论 -
[golang]pprof性能分析工具
1. 关于pprofpprof是golang程序一个性能分析的工具,可以查看堆栈、cpu信息等。2. 源码示例package mainimport ( "flag" "log" "net/http" _ "net/http/pprof" "sync" "time")func Counter(wg *sync.WaitGroup) { time原创 2017-08-11 14:02:22 · 18414 阅读 · 0 评论 -
[golang]函数用例
基本用法golang函数是不支持嵌套(但是可以使用匿名函数实现嵌套)、默认参数、重载, 但支持: - 不定长度的变参 - 多返回值(类似python的返回元组?) - 显式命名返回值参数 - 匿名函数 - 函数闭包以下是一些基本用法示例:// 一般用法, 无返回值func funcName1(input1 type1){ //do something}// 多参数, 一个返回值原创 2017-08-07 11:06:11 · 623 阅读 · 0 评论 -
[golang]array与slice
array类型1)基础特性array为固定长度的数组, 其内存分配为连续的, 使用前需确定长度;数组为值类型, 赋值操作的新变量是原数组的一份完整拷贝;作为函数的传递参数, 实际也是数组的一份拷贝, 效率也就比传递指针低;数组长度也是Type一部分, 如[4]int和[2]int类型不一样.2)声明与初始化package mainimport "fmt"// 只声明, 不作初始化var原创 2017-08-07 11:07:07 · 737 阅读 · 0 评论 -
[golang]map/set类型
map类型1. 基础特性map是一种无序的键值对的集合; 所以可以类似数组/slice一样进行迭代map的值可以使内建类型, 也可以是struct类型内部使用hash表实现, map的hash表包含了一个collection of buckets(桶集合)2. 声明与初始化package mainimport ( "fmt")// map[keyType]valueTypefun原创 2017-08-07 11:07:49 · 2640 阅读 · 0 评论 -
[golang]简单文件上传服务
利用net/http库及gorilla/mux库实现了一个简单的文件上传服务,示例如下:package mainimport ( "fmt" "github.com/gorilla/mux" "io" "net/http" "os")const uploadHTML = `<html> <head> <title>选择文件</titl原创 2017-09-11 09:29:03 · 3375 阅读 · 0 评论 -
[Golang]另一角度理解goroutine
偶然看到一条关于goroutine有趣的QA: https://news.ycombinator.com/item?id=12459841 发现可以以另一种方式来理解goroutine,欢迎拍砖。关键概念说明:M: machine, M对应于内核线程;P: processor, P是一种在M上运行的context, 维护了goroutine的列表;G: goroutine核心结构, 维护了g原创 2017-11-09 20:03:20 · 840 阅读 · 0 评论 -
golang知识点整理(持续更新)
对golang的整体理解Go是一种编译型语言,结合了解释型语言的优点(如调试效率,跨平台),动态类型语言的优点(如开发效率),以及静态类型的优点(如安全性);Go是静态类型语言,类型系统没有层级,因此无需在类型关系定义上耗费过多时间;Go是垃圾回收型的语言,并为并发执行与通信提供了基本的支持;Go目标是要成为一种现在的系统语言,不过目前更多用来构建支持高性能高并发web服务。列出常用的一些原创 2017-11-14 13:45:22 · 4187 阅读 · 0 评论 -
golang内存管理
最近粗略看了下golang内存初始化相关的代码,结合大牛们的一些源码分析,自己整理了一下学习总结。几个关键数据结构mspan 由mheap管理的页面,记录了所分配的块大小和起始地址等mcache 与P(可看做cpu)绑定的线程级别的本地缓存mcenter 全局空间的缓存,收集了各种大小(67种)的span列表mheap 分配内存的堆分配器,以8kb进行页管理fixalloc 固定原创 2017-11-16 00:19:36 · 2744 阅读 · 0 评论 -
[Golang]通过interface实现"泛型"的用例
目前Golang最新版本为1.9, 暂时不支持泛型。 不过可以通过interface实现”泛型编程”效果, 下面以slice类型数据的添加/删除元素为例, 供大家参考一下:package mainimport ( "errors" "fmt")var ( ERR_ELEM_EXISTS = errors.New("element exits.") ER原创 2017-12-06 10:39:33 · 6288 阅读 · 0 评论 -
基于Docker的Consul集群部署方案
基于Docker的Consul集群部署方案关于ConsulConsul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件.Consul 由 HashiCorp公司用Go语言开发, 基于Mozilla Public License 2.0的协议进行开源. Consul 支持健康检查,并允许 HTTP 和 DNS 协议调用 API 存储键值对.命令行超级好用的虚拟机管理软件 vgra原创 2017-07-07 16:38:06 · 7796 阅读 · 2 评论 -
golang并发下载多个文件
背景说明假设有一个分布式文件系统,现需要从该系统中并发下载一部分文件到本地机器。 已知该文件系统的部分节点ip, 以及需要下载的文件fileID列表,并能通过这些信息来拼接下载地址。 其中节点ip列表保存在xx_node.txt, 要下载的fileID保存在xx_fileID.txt中。代码示例package mainimport ( "bufio" "flag" "fm原创 2018-01-03 17:27:37 · 8320 阅读 · 0 评论 -
[分布式协议]Go实现raft协议
之前对raft算法是有所了解但无深究,偶然机会下读了下大牛的goraft代码 后,决定自己实现一把。 目前代码基本完成,本人水平有限,代码基本能用,未经严格测试,欢迎指导:源码github地址 以下是项目说明README:raft协议的go版本,实现功能包括:选主投票节点心跳日志同步成员变更日志压缩存在的问题或需要解决的问题:完善snapshot快照同步逻辑...原创 2018-05-28 15:21:12 · 2840 阅读 · 0 评论 -
微服务开发之熔断器
一般在微服架构中,有一个组件角色叫熔断器。顾名思义,熔断器起的作用就是在特定的场景下关掉当前的通路,从而起到保护整个系统的效果。在微服务架构中,一般我们的独立服务是比较多的,每个独立服务之间划分责任边界,并通过约定协议接口来进行通信。当我们的调用链路复杂依赖多时,很可能会发生雪崩效应。假设有这么一个场景,有A, B, C, D四个独立服务,A会依赖B,C,D;当D发生负载过高或网络异常等导...原创 2018-06-22 17:47:39 · 4545 阅读 · 0 评论 -
Gin Web框架简介
翻译自: https://github.com/gin-gonic/gin/blob/develop/README.mdGin Web框架 Gin是用Golang实现的一种Web框架。基于 httprouter,它提供了类似martini但更好性能(路由性能约快40倍)的API服务. 如果你希望构建一个高性能的生产环境,你会喜欢上使用 Gin。$ cat test.gopackage翻译 2016-04-14 18:01:07 · 44226 阅读 · 1 评论