GoLang
文章平均质量分 78
GoLang
AirGo.
[WHY]每一个你不满意的当下,都有一个你不曾努力的过去。
展开
-
GoLang 的锁“失效”
GoLang 的锁“失效”和 noCopy原创 2022-09-28 10:35:31 · 664 阅读 · 1 评论 -
GoLang 单元测试打桩和 mock
单元测试,顾名思义对某个单元函数进行测试,被测函数本身中用到的变量、函数、资源不应被测试代码依赖,所谓 mock,就是想办法通过 “虚拟” 代码替换掉依赖的方法和资源,一般需要 mock 掉以下依赖:变量函数/方法MySQLRedishttp 调用。原创 2022-09-06 20:14:43 · 5065 阅读 · 2 评论 -
Go1.18 新特性 — 泛型、Fuzzing、work工作区
本文源码:https://github.com/why444216978/go1.18-features-demoFuzzing Fuzzing,又叫 fuzz testing,中文叫做模糊测试或随机测试。其本质上是一种自动化测试技术,更具体一点,它是一种基于随机输入的自动化测试技术,常被用于发现处理用户输入的代码中存在的bug和问题。 在具体实现上,Fuzzing不需要像单元测试那样使用预先定义好的数据集作为程序输入,而是会通过数据构造引擎自行构造或基于开发人员提供的初...原创 2022-03-16 15:57:49 · 1873 阅读 · 0 评论 -
深入理解高性能字节池 bytebufferpool
字节池 bytebufferpool 源码剖析原创 2021-12-18 20:12:03 · 1365 阅读 · 0 评论 -
深入理解 errgroup,并实现服务优雅关闭和资源回收
发现问题GoLang 为我们提供了 WaitGroup 用来解决当前 goroutine 等待多个 goroutine 结束的问题,但是当我们需要获得协程返回的错误,则无能为力。解决问题为解决上面的问题,官方为我们提供了 errgroup 包,支持返回 goroutine 遇到的第一个错误// Group 等待组结构体定义type Group struct// WithContext 根据传入的ctx返回Group和新的ctxfunc WithContext(ctx conte原创 2021-11-28 16:53:25 · 884 阅读 · 0 评论 -
连接多路复用,同一个端口同时提供 HTTP 和 gRPC 服务
$ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.17.3/protoc-3.17.3-linux-x86_64.zip$ unzip protoc-3.17.3-linux-x86_64.zip$ cp ./protoc/bin/protoc $GOROOT/bin/or$ wget https://github.com/protocolbuffers/protobuf/releases/dow...原创 2021-09-20 21:22:10 · 3017 阅读 · 0 评论 -
高并发下的缓存问题,这篇就够了
缓存 缓存大家都不陌生,目的是为了优化磁盘数据读取的性能问题,缓存 + DB 的架构往往如下如图所示: 但是,缓存也是一把双刃剑,用好了可以让服务性能大幅度提升,用不好,就可能为系统埋下隐患。本文就从缓存最常见的几个问题出发,讨论一下每种问题的解决方案。目前最常用的分布式缓存数据库就是 Redis 了,所以本文代码实例均以 Redis 为准。缓存雪崩 缓存目的是为了解决热点数据的访问,所以当某些数据一段时间没有被访问时,缓存会过期自动失效,假想一下...原创 2021-08-15 21:42:52 · 1176 阅读 · 0 评论 -
我用四种设计模式进行抽象,解决了N家资源方接入问题
需求场景 场景是这样的,我们的业务是医疗场景下的问诊业务,具体场景包括在线咨询和线上复诊,每个场景都分为免费和付费,也就是一共 4 个业务流程,并且相互之间有很大一部分流程相同,但又在部分流程中有或多或少的区别。同时,需要对接医院 HIS 系统的挂号服务,并且每家医院的挂号流程均不相同,比如有些需要手动开收费项来收取挂号诊查费,有些是免费。难点和方案 上面的需求,总结下来就是要求我们的系统需要同时支持 4 种业务流程,且兼容多家 HIS 系统,翻译成代码层面,就是下面几点...原创 2021-08-07 15:23:43 · 572 阅读 · 0 评论 -
从0到1手撕负载均衡算法
轮询package mainimport ( "fmt" "sync/atomic")var ( nodeAddress = map[string]string{ "A": "127.0.0.1", "B": "127.0.0.2", "C": "127.0.0.3", "D": "127.0.0.4", } nodeIndex = []string{"A", "B", "C", "D"} nodeWeight = map[string]i...原创 2021-07-17 17:42:35 · 513 阅读 · 1 评论 -
解决PHP和GoLang写入csv文件用Excel打开乱码
使用CSV打开文件是正常的,但是使用Excel打开文件就出现了中文乱码。导出的CSV文件是UTF-8无BOM编码格式,而我Excel的UTF-8编码格式都是有BOM的,添加BOM之后,乱码就可解决。 private function _write_csv($data) { file_put_contents($this->_file_d...原创 2020-02-10 16:28:41 · 994 阅读 · 0 评论 -
GoLang通过gRPC流处理实现发布订阅服务
目录流式处理服务端流式客户端流式双向流式发布订阅服务pubsub原理代码实现gRPC代码服务端代码订阅端代码发布端代码流式处理所谓流式处理,就是客户端和服务端一方可以源源不断地发送请求,另一方按照发送顺序依次处理请求。流式 RPC 分为三种,分别是服务端流式、客户端流式、双向流式服务端流式客户端发送一个请求给服务端,可获取一个数据流用来读取一系列消息。客户端从返回的数据流里一直读取直到没有更多消息为止。rpc Hello (HelloRequ原创 2021-03-21 18:53:36 · 2478 阅读 · 0 评论 -
初探 gRPC 和 proto import
安装命令go get google.golang.org/protobuf/cmd/protoc-gen-go go get google.golang.org/grpc/cmd/protoc-gen-go-grpc编写proto文件语法参考:https://www.jianshu.com/p/da7ed5914088syntax = "proto3";package pb;message Request { string Name = 1;}message Re原创 2021-03-18 01:46:32 · 1277 阅读 · 0 评论 -
GoLang源码系列之:通过一个最简单的RPC服务探究net/rpc源码实现
前言之前做的服务大多基于 HTTP 实现服务端和客户端,可以通过 API 接口的方式进行调用,优点是不受语言限制、调用方便。但是众所周知 HTTP 是应用层协议,所以对于性能要求较高的服务来说,更适合用基于 TCP 的 RPC 服务。由于最近在转 Go 语言,标准库提供了开箱即用的 RPC 包,之前一直没接触过,最近正好打算学习 RPC,所以通过一个最简单的 RPC 服务来研究了下 net/rpc 包的实现原理。示例代码例子非常简单,客户端发送一个字符串,服务端返回 hello + 字符串作为.原创 2021-03-14 23:21:50 · 1075 阅读 · 0 评论 -
搞不懂协程的同步控制,千万别说自己会GoLang
前言Go 语言提供了协程并发编程模型,那么只要是并发就需要解决协程间同步问题,官方为我们提供了同步工具,sync 包。性能测试参考:https://success.blog.csdn.net/article/details/112339434锁的使用锁有如下特点,使用时需要注意:锁在 Go 语言中都是成对出现的,也就是说每一个加锁操作必须要对应一个解锁操作,我们通常会跟一个 defer 语句进行解锁。 对已锁的锁再次加锁会阻塞当前加锁协程 对未锁定的锁进行解锁会触发 panic,且无原创 2021-02-11 11:25:39 · 913 阅读 · 3 评论 -
Vim打造成GoLang开发环境
源码安装GoLang进入:https://golang.google.cn/dl/下载:wgethttps://golang.google.cn/dl/go1.14.6.darwin-amd64.tar.gz安装:tar -C /usr/local -xzf go1.14.6.linux-amd64.tar.gz配置环境变量:vim ~/.bash_profileexport GOROOT=/usr/local/goexport GOPATH=/Users/why/Desktop..原创 2021-01-09 12:51:58 · 4762 阅读 · 0 评论 -
GoLang测试那些事儿
码字不易,转载请附原链,搬砖繁忙回复不及时见谅,技术交流请加QQ群:909211071单元测试测试命令单用例命令行打印html直观展示多用例(Table-Driven Test)goconvey测试工具基准测试Example测试预告PS:本文中用到的所有 go 生态工具(go test、gotests、goconvey),均未介绍安装过程,请自行百度。单元测试testing为 Go 语言 package 提供自动化测试的支持。通过go tes...原创 2021-01-07 23:15:41 · 1511 阅读 · 0 评论 -
GoLang性能分析利器:pprof
查看命令帮助:go tool pprof -help进入命令交互:通过正在运行的程序取样保存成文件,再进入命令交互:# 下载 cpu profilego tool pprof http://47.93.238.9:8080/debug/pprof/profile\?seconds=10 # 下载 heap profilego tool pprof http://47.93.238.9:8080/debug/pprof/heap\?seconds=10 # 下载原创 2021-01-06 15:58:01 · 791 阅读 · 1 评论 -
GoLang协程原理解读,收藏作为面经再合适不过了
线程实现模型 在操作系统提供的内核线程之上,Go 搭建了一个特有的用户级线程模型。传统的函数调用是将函数指针存储在内存的栈空间上,但是栈空间只允许操作系统进行操作,我们能拿到的只限于堆内存,所以 Go 开发者在堆上申请一块内存,将寄存器 %rsp 以及寄存器 %rbp 指过去,从而将这块内存伪装成用户栈,从而巧妙地实现了并行运行用户级线程 goroutine。要聊 Go 的线程实现模型,必须要知道以下3个核心元素:M:machine 缩写,一个 M 代表一个内核线程。 P:proces...原创 2020-12-28 20:35:10 · 1565 阅读 · 0 评论 -
GoLang使用Goroutine+Channel实现流水线处理,扇入扇出思想解决流水线上下游供需不平衡
package mainimport ( "fmt")func buy(n int) <-chan string{ out := make(chan string) go func(){ defer close(out) for i := 1; i <= n; i++{ fmt.Println("buy", i) out <- fmt.Sprintf("配件%d", i) } }() return out}func build(in <.原创 2020-12-24 19:56:04 · 948 阅读 · 2 评论 -
GoLang中结构体的深拷贝和浅拷贝
先看几个完整的例子:func DeepCopy(dst, src interface{}) error { var buf bytes.Buffer if err := gob.NewEncoder(&buf).Encode(src); err != nil { return err } return gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst)}type User struct { Name strin原创 2020-12-15 20:43:30 · 3626 阅读 · 0 评论 -
Go接口中的值接收者和指针接收者
码字不易,转载请附原链,搬砖繁忙回复不及时见谅,技术交流请加QQ群:909211071先说结论:在实现接口时,应保持接收者定义、结构体定义、断言类型一致等价场景当方法的接收者定义为值类型时,Go 语言编译器会自动做转换,所以值类型接收者和指针类型接收者是等价的,编译不会报错,运行也都可以调用相应方法。package mainimport "fmt"type A interface { echo()}type B struct { b string}func ...原创 2020-11-30 22:09:51 · 860 阅读 · 0 评论 -
手把手教你用dlv和gdb调试GoLang
无论哪种方式,都要配置gdb钥匙串,参考这篇文章:https://blog.csdn.net/qq_33154343/article/details/104784641package mainimport ( "fmt")func a(){ fmt.Println(111);}func main() { a() s := []int{1, 2} s = append(s, 3, 4, 5) fmt.Println(len(s), cap(s))}dlvsi要进入r原创 2020-11-27 23:09:12 · 2071 阅读 · 0 评论 -
关于GoLang的concurrent map writes错误
作为一个GoLang萌新(其实就是并发编程萌新,之前一直在做PHP),对并发下共享资源的竞争了解不多。所以一开始写出了如下代码:type OriginPriceController struct { OriginPriceService *origin_price_service.OriginPriceService}func (self *OriginPriceController) action() { var wg sync.WaitGroup wg.Add(2) go f原创 2020-08-01 20:17:34 · 9495 阅读 · 3 评论 -
【转载】GoLang逃逸分析
写过C/C++的同学都知道,调用著名的malloc和new函数可以在堆上分配一块内存,这块内存的使用和销毁的责任都在程序员。一不小心,就会发生内存泄露,搞得胆战心惊。切换到Golang后,基本不会担心内存泄露了。虽然也有new函数,但是使用new函数得到的内存不一定就在堆上。堆和栈的区别对程序员“模糊化”了,当然这一切都是Go编译器在背后帮我们完成的。一个变量是在堆上分配,还是在栈上分配,是经过编译器的逃逸分析之后得出的结论。这篇文章,就将带领大家一起去探索逃逸分析——变量到底去哪儿,堆还是栈?转载 2020-07-28 17:51:47 · 302 阅读 · 0 评论 -
GoLang redigo包冲突in multiple modules
报错提示:build command-line-arguments: cannot load github.com/gomodule/redigo/redis: ambiguous import: found github.com/gomodule/redigo/redis in multiple modules: github.com/gomodule/redigo v2.0.0+incompatible (/Users/why/Desktop/go/pkg/mod/github.c原创 2020-07-19 18:58:19 · 4309 阅读 · 1 评论 -
GoLang开源微服务框架
https://github.com/air-go/rpc原创 2020-07-07 14:59:50 · 1451 阅读 · 0 评论 -
Go中闭包的隐含问题
问题package mainimport ( "fmt" "sync")var wg sync.WaitGroupfunc main() { for i := 0; i < 10; i++ { wg.Add(1) go func(){ fmt.Println(i) defer wg.Done() }() } wg.Wait()}[why@localhost] ~/Desktop/go/gin-frame$go run test.go 10原创 2020-06-26 15:56:43 · 386 阅读 · 0 评论 -
Golang中的context包详解
控制并发有两种经典的方式,一种是 WaitGroup,另外一种就是 Context,今天我就谈谈 Context。什么是 WaitGroupWaitGroup 以前我们在并发的时候介绍过,它是一种控制并发的方式,它的这种方式是控制多个 goroutine 同时完成。func main() { var wg sync.WaitGroup wg.Add(2) go func() ...转载 2020-03-30 21:32:19 · 1317 阅读 · 0 评论 -
Golang使用有缓冲channel实现协程池限制最大协程数量
package mainimport ( "fmt" "strconv" "time" "sync")var ( maxRoutineNum = 3)type Duration int64const ( Nanosecond = 1 Microsecond = 1000 * Nanose...原创 2020-02-24 18:35:51 · 2054 阅读 · 4 评论 -
部署Golang程序到docker
一、交叉编译参考:https://www.bookstack.cn/read/gin-EDDYCJY-blog/golang-gin-2018-03-26-Gin%E5%AE%9E%E8%B7%B5-%E7%95%AA%E5%A4%96-Golang%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%91.md在项目目录中运行下面命令:GOOS=linux GOARC...原创 2020-02-22 22:17:01 · 1198 阅读 · 0 评论 -
理解golang调度之三:并发
简介当我在解决一个问题尤其是新问题的时候,我开始不会去考虑并发(concurrency)是否合适。我首先会去找一系列的解决方式然后确保它有效。然后在可读性和技术方案评估之后,我会开始去考虑并发是否实际合理。有些时候并发的好处是显而易见的,但是有时候并不是很明显。第一篇文章,我解释了OS调度器的相关内容,我觉得这部分对于你写多线程代码很重要。第二篇里,我讲解了一些Go调度器的一些内容,这部分...转载 2020-02-16 20:21:04 · 375 阅读 · 0 评论 -
理解golang调度之二 :Go调度器
简介第一篇文章解释了关于操作系统层级的调度,我认为这对于理解Go的调度是很重要的。这一部分我会在语义层级解释Go调度器是如何工作的,并且着重关注它的一些高级行为。Go 调度器是一个十分复杂的系统,细节不重要,重要的是对于其工作和行为有一个好的理解,这会让你做出更好的工程方面的决定。从一个程序开始当你的go程序启动,主机上定义的每一个虚拟内核都会为它分配一个逻辑处理器(P),如果你的处理...转载 2020-02-16 20:20:12 · 960 阅读 · 0 评论 -
理解golang调度之一 :操作系统调度
简介golang调度器的设计行为能够使你的多线程go程序更有效率、性能更好,这要归功于golang调度器对于操作系统调度器的支持。对于一个golang开发者来说,同时深刻理解操作系统调度和golang调度器工作原理,能够让你的golang程序设计和开发走到正确道路上。操作系统调度器操作系统调度器十分复杂,它必须要考虑到它所运行的底层硬件层级结构,包括但不限于处理器数和内核数,cpu c...转载 2020-02-16 20:19:13 · 553 阅读 · 0 评论 -
GolangGC的实现原理
Golang从1.5开始引入了三色GC, 经过多次改进, 当前的1.9版本的GC停顿时间已经可以做到极短.停顿时间的减少意味着"最大响应时间"的缩短, 这也让go更适合编写网络服务程序.这篇文章将通过分析golang的源代码来讲解go中的三色GC的实现原理.这个系列分析的golang源代码是Google官方的实现的1.9.2版本, 不适用于其他版本和gccgo等其他实现,运行环境是Ubu...转载 2020-02-16 20:07:26 · 2194 阅读 · 0 评论 -
Golang协程的实现原理
Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱,虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的.这篇文章将通过分析golang的源代码来讲解协程的实现原理.这个系列分析的golang源代码是Google官方的实现的1.9.2版本, 不适用于其他版本和gccgo等其他实现,运行环境是...转载 2020-02-16 19:59:09 · 3727 阅读 · 1 评论 -
Go数组、字符串、切片原理和优化
数组1、赋值和传参数组本身的赋值和传参都是以整体复制的方式处理的,所以为深拷贝,在函数内对数组进行操作,不会影响原数组。package mainimport ( "fmt")func forRange(a [3]int){ for k,v := range a{ fmt.Printf("%d:%d\n", k, v) } a[2] = 9 fmt.Printl...原创 2020-02-16 16:05:05 · 690 阅读 · 0 评论 -
关于GoLang服务的平滑重启
引出问题我们在用go开发的过程中,如果修改了代码,都是control+c杀死运行的进程,然后再go run 或者是 go build之后运行,而当我们的项目上线后,直接杀死进程会导致线上服务中断,在生产环境中是绝对不允许的解决思路更改代码之后,重新编译,重启进程时,当前主进程fork出一个子进程,让它运行改动后的程序。实现细节如何通知进程进行平滑重启呢,答案是通过注...原创 2020-02-08 17:59:41 · 1580 阅读 · 0 评论 -
GoLang生成分布式调用树
package xhopimport ( "bytes" "encoding/hex" "errors" "fmt" "strconv")//// Generally speaking,for every http request, the hierarchy of the http rpc calls is a DAG(directed acycline graph)....原创 2020-02-04 19:54:38 · 394 阅读 · 0 评论 -
GoLang雪花算法和反推
工具代码package logimport ( "crypto/md5" "crypto/rand" "encoding/binary" "encoding/hex" "fmt" "io" "os" "sync/atomic" "time")// LogId is a unique ID identifying a log record. It must be e...原创 2020-02-04 19:53:21 · 1457 阅读 · 0 评论 -
GoLang封装Elasticsearch
封装库:package esimport ( "bytes" "context" "encoding/json" "fmt" "github.com/olivere/elastic" "io/ioutil" "net/http" "why/config" "why/log" "why/util")type Elastic struct { Client *el...原创 2020-01-29 22:10:02 · 2792 阅读 · 0 评论