![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Golang
文章平均质量分 78
go语言
机智的程序员小熊
《Go语言进阶之路开源书》作者,监控云领域,大厂横跳,掌握Go、Python,熟悉C++、算法。拥有完整的前后端运维产品服务团队。
展开
-
一期Go群问答-并发控制-数据竞争-错误与异常
每周更新Go技术交流群的群问答内容,有需要可发我Go加群讨论学习。并发控制waitGroup.done()不是必须写在main方法中吗? 为什么我的协程没有成功等待?熊:如果用了wait group,请求就直接卡住了,如果只有一个goroutine那和直接调用函数没有区别其实。你是想请求立刻返回,然后其他数据稍后返回的话,用中间件比如kafka。或者用回调callback错误现场错误原因:没有能成功等待goroutine执行完,done要放goroutine里,外面是wait。参考用例var原创 2023-01-22 01:41:22 · 299 阅读 · 1 评论 -
GO并发之好用的sync包
本节源码位置 https://github.com/golang-minibear2333/golang/tree/master/4.concurrent/4.9-sync/原创 2022-12-28 13:02:35 · 526 阅读 · 0 评论 -
Go并发之原子操作
代码中的加锁操作因为涉及内核态的上下文切换会比较耗时、代价比较高。针对基本数据类型我们还可以使用原子操作来保证并发安全,因为原子操作是Go语言提供的方法它在用户态就可以完成,因此性能比加锁操作更好。Go语言中原子操作由内置的标准库提供。大多数情况下我们都是针对基本数据类型进行数据操作,能不加锁就不加锁。首先很多人都不相信基本类型并发修改会出现竞态问题。不妨尝试一下,并发加一。无论输出多少次都无法达到10000。原创 2022-12-28 12:59:00 · 531 阅读 · 0 评论 -
go并发与锁
电子书 https://golang.coding3min.com并发安全,就是多个并发体在同一段时间内访问同一个共享数据,共享数据能被正确处理。很多语言的并发编程很容易在同时修改某个变量的时候,因为操作不是原子的,而出现错误计算,比如一个加法运算使用中的变量被修改,而导致计算结果出错,典型的像统计商品库存。个人建议只要涉及到共享变量统统使用channel,因为channel源码中使用了互斥锁,它是并发安全的。我们可以不用,但不可以不了解,手中有粮心中不慌。原创 2022-12-27 09:45:00 · 607 阅读 · 1 评论 -
Go定时器
很多时候需要周期性的执行某些操作,就需要用到定时器。定时器有三种思路。原创 2022-12-19 22:53:23 · 396 阅读 · 0 评论 -
从源码的角度看Go语言flag库如何解析命令行参数!
我上周五喝酒喝到晚上3点多,确实有点罩不住啊,整个周末都在休息和睡觉,文章鸽了几天,想不到就有两个人跑了。不得不感叹一下,自媒体的太残酷了,时效就那么几天,断更就没人爱。你们说好了爱我的,爱呢?哼昨晚就在写这篇文章了,没想到晚上又遇到发版本,确实不容易,且看且珍惜。标准库 flag命令行程序应该能打印出帮助信息,传递其他命令行参数,比如-h就是flag库的默认帮助参数。./goapi -hUsage of ./goapi: -debug is debug -ip stri原创 2021-08-10 21:05:57 · 223 阅读 · 0 评论 -
Go语言append缺陷引发的深度拷贝讨论
看完苏炳添进入总决赛,看得我热血沸腾的,上厕所都不敢耽搁超过 5 分钟。这历史性的一刻,让本决定休息的我,垂死病中惊坐起,开始肝文章。引子今天的文章从我周六加班改的一个bug引入,上下文是在某个struct中有个Labels切片,在组装数据的时候需要为其加上配置变量中的标签。大家看看会出现什么问题。for i := range m{ m[i].Labels = append(r.Config.Relabel, m[i].Labels...) ...}debug发现,i=0时正原创 2021-08-03 10:31:30 · 339 阅读 · 0 评论 -
讲透Go中的并发接收控制结构select
本节源码位置 https://github.com/golang-minibear2333/golang/blob/master/4.concurrent/4.5-select4.5.1 select与switch让我们来复习一下switch语句,在switch语句中,会逐个匹配case语句(可以是值也可以是表达式),一个一个的判断过去,直到有符合的语句存在,执行匹配的语句内容后跳出switch。func demo(number int){ switch{ case num.原创 2021-07-28 13:17:41 · 131 阅读 · 0 评论 -
面试高频:Go语言死锁与goroutine泄露问题谈论
本节源码位置 https://github.com/golang-minibear2333/golang/blob/master/4.concurrent/4.4-deadlock/什么时候会导致死锁在计算机组成原理里说过 死锁有三个必要条件他们分别是 循环等待、资源共享、非抢占式,在并发中出现通道死锁只有两种情况:数据要发送,但是没有人接收数据要接收,但是没有人发送发送单个值时的死锁牢记这两点问题就很清晰了,复习下之前的例子,会死锁a := make(chan int)a <.原创 2021-07-22 09:47:37 · 371 阅读 · 0 评论 -
Go语言核心知识channel
到这里你正在接触最核心和重要的知识!认真学习的你很棒!本节源码位置 https://github.com/golang-minibear2333/golang/blob/master/4.concurrent/channel.go什么是 channelGo 是一门从语言级别就支持并发的编程语言, 它有一个设计哲学很特别 不要通过共享内存来通信,而应通过通信来共享内存 ,听起来是有一点绕。在传统语言中并发使用全局变量来进行不同线程之间的数据共享,这种方式就是使用共享内存的方式进行通信。而 Go 会原创 2021-07-19 20:57:09 · 178 阅读 · 0 评论 -
Golang并发等待
上节答疑上一节有读者问goroutine stack size一般是多大,我进行了详细的查询关于 goroutine stack size(栈内存大小) 官方的文档 中所述,1.2 之前最小是4kb,在1.2 变成8kb,并且可以使用SetMaxStack 设置栈最大大小。在 runtime/debug 包能控制最大的单个 goroutine 的堆栈的大小。在 64 位系统上默认为 1GB,在 32 位系统上默认为 250MB。因为每个goroutine需要能够运行,所以它们都有自己的栈。假如每个g原创 2021-07-17 09:40:23 · 726 阅读 · 0 评论 -
go 语言中的并发特性
本节源码位置 https://github.com/golang-minibear2333/golang/blob/master/4.concurrent/4.1-goroutine/以前我们写并发的程序一般是用多线程来实现,自己维护一个线程池,在恰当的时候创建、销毁、分配资源。go 在并发方面为我们提供了一个语言级别的支持, goroutine 和 chan 相互配合,这决定了他的先天优势。goroutine 的概念类似于线程, Go 程序运行时会自动调度和管理,系统能智能地将 goroutin.原创 2021-07-16 09:48:20 · 167 阅读 · 0 评论 -
go语言map拷贝陷阱、slice更新陷阱
开源电子书 https://golang.coding3min.commap 可以拷贝吗?map 其实是不能拷贝的,如果想要拷贝一个 map ,只有一种办法就是循环赋值,就像这样originalMap := make(map[string]int)originalMap["one"] = 1originalMap["two"] = 2// Create the target maptargetMap := make(map[string]int)// Copy from the orig原创 2021-07-09 00:25:10 · 473 阅读 · 0 评论 -
小熊肝了十个小时,搞出一本 go 语言精进之路
小熊肝了十个小时,搞出一本 go 语言精进之路这本书基于 Go 语言版本 1.16 版本,后续可能会再调整,目录也还未明确,正在努力持续更新中,整体进度未明。这也是一本持续更新迭代的书籍。这本书有什么特点开源链接:https://golang.coding3min.com《Go 语言精进之路》是一本开源电子书,带有 github 评论功能,是由我主导创作,开放共同创作能力的书籍,欢迎大家随时在评论区提问和贡献。本书给快速入门学习 Go 语言使用。更偏向于实战,计划扫清 Go 语言一切障碍,包括原创 2021-06-27 16:43:42 · 1481 阅读 · 0 评论 -
golang异常处理详解
小熊今天有意外收获,忍不住给大家分享我愉快的心情!昨天中午下楼取外卖的时候被一个同事认出来了,他问我:“是不是【编程三分钟】的作者,文章写的不错”。你知道吗!我当时就是一愣,然后差点感动到哭出来,虽然小熊的号比不上大牛的号,不能随便发一篇文章都有成千上万的阅读量;但是非常开心的是,我还有你们,默默的关注我,爱你们~!今天想和大家聊聊 golang 的异常处理异常处理思想在 go 语言里是没有 try catch 的概念的,因为 try catch 会消耗更多资源,而且不管从 try 里面哪个地方跳出原创 2020-05-28 22:03:13 · 3657 阅读 · 0 评论 -
官方golang包管理神器,值得一试!
这是一篇很短的文章,诉说着高效的包管理工具 go mod我们上次说过如何让一个项目在 Goland 编译器跑起来,但是要自己去下包,要花不少时间找包下包,是不是很麻烦?java 里有一个叫 maven 的包管理工具, go 也有一个叫 go mod 的管理工具,可以管理项目引用的第三方包版本、自动识别项目中用到的包、自动下载和管理包。怎么用?找到你的项目,直接执行go mod init main.go执行完会自动识别项目中用到的第三方包,并生成一个 go.mod 文件$ cat go.mo原创 2020-05-20 00:02:44 · 705 阅读 · 0 评论 -
go中的接口与多态
小熊不小心把自己的电脑刷成砖了。哭了。。本来想格式化下盘,谁知道格式化完以后啥都没有,连系统都没了,几乎和 rm -rf / 有得一拼!按官网给的方法试了,启动 u 盘制作不成功,制作成功了识别不出来,尝试网络恢复发现只能连美国的服务器,好不容易连上了,等了两个小时结果无法验证 OS !搞了两天到现在都没搞定,只能等明天再背去公司试试了。今天和大家聊聊 golang 的接口( interface )接口接口同 java 一样,可以把一堆有共性的方法定义在里面,但是比 java 灵活的是,不原创 2020-05-17 23:53:32 · 448 阅读 · 0 评论 -
go 结构体的思考
小熊工作做不完了,周末又要加班了, c++ 项目好不容易在不同的指令集编译出来,结果一跑就挂,连日志都没有,难受!go 语言中的结构体和 c++ 的结构体类似,如下定义一个结构体类型。type Body struct { name string age int}像这样就可以使用var body Bodybody.name = "coding3min"body.age = 12fmt.Println(body)输出{coding3min 12}go 中的类结构体在 go.原创 2020-05-15 23:25:01 · 569 阅读 · 5 评论 -
`golang` 指针讨论
golang 指针讨论好几天没有更新了,因为小熊给老板打了包票,要把 10 天的工作,压缩在 5 天,怎么压缩,靠加班咯。今天回家以后连不上那几台服务器,加班不成,写写文章。这两天特别惨,我的眼镜还丢了,上班只能靠很近才能看清。本来申请的显示器,被配送员送到其他同事那里了,结果那同事明知道箱子上的名字不是自己的还拆开用,要等明天才有的用了。我怎么这么倒霉??go 语言的教程拖拖拉拉写了好久了,本身比较简单,按部就班的写影响到了我的学习进度,所以我要加速度了,从这一篇开始。话不多说现在开始。指针c原创 2020-05-13 23:24:53 · 246 阅读 · 0 评论 -
go语言 切片知识补充 复制、截取、排序
上一节说了切片与数组的区别,动态增加,len cap append copy 的知识,下面我补充一点。切片的复制切片的复制,回顾一下,我们原来是用copy函数 slice2 := make([]int, len(slice1), cap(slice1)) /* 拷贝 slice1 的内容到 slice2 */ copy(slice2, slice1) // 注意是后面的拷贝给前面切片...原创 2020-05-06 22:54:25 · 327 阅读 · 0 评论 -
快速掌握 Go 语言中的集合(map)
快速掌握 Go 语言中的集合(map)我本来下午打算对新系统,好好研究下模块划分,但因为上一个版本提测,于是我改了一个下午的bug。现在是晚上 9 点钟我开始写这篇文章,给大家分析分析Go语言中的map。映射关系容器 mapGo语言提供的映射关系容器为 map , map 使用散列表hash实现。查找复杂度为O(1),和数组一样,最坏的情况下为O(n),n为元素总数。这就是Go中map的...原创 2020-05-06 22:19:08 · 428 阅读 · 0 评论 -
Go语言中的数组和切片 len cap append copy
先来看看Golang中的数组其实在循环那一节用到过数组,我快速介绍一下。数组中是固定长度的连续空间(内存区域)数组中所有元素的类型是一样的 var a1 [10]int //初始化数组 var b1 = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}多维数组//声明二维数组,只要 任意加中括号,可以声明更多维,相应占用空间指数上指 v...原创 2020-05-05 23:39:53 · 1017 阅读 · 0 评论 -
三分钟学Go语言——函数深度解析(上)
基本原理函数,几乎是每种编程语言的必备语法,通过函数把一系列的动作汇总起来,在不同的地方重复使用。我们在数学中曾经就使用过函数,他的形式类似于y=f(x),这就是一个完整的调用过程,y就是函数计算后得到的值,x就是传入的变量。怎么用?相信在看这个教程的人肯定已经接触过其他的编程语言,我就不多废话了,就是干。go语言中最基本的函数是这样的,以func为关键字标记函数func funct...原创 2020-04-26 00:05:10 · 462 阅读 · 2 评论 -
三分钟学 Go 语言——range深度解析
小熊最近两天加班比较严重,要处理的事情很多,但是学习的热情永远不会减少,前面讲述的go语言语法是非常非常简单的,所以没有做深入的剖析,后面会从各种角度解析语法,fighting!!range(范围)range 关键字在 go 语言中是相当常用好用的语法糖,可以用在 for 循环中迭代 array、slice、map、channel、字符串所有涉及到遍历输出的东西。基本原理怎么用?我们在...原创 2020-04-18 16:50:45 · 691 阅读 · 4 评论 -
三分钟学 Go 语言——循环语句的多种形式、死循环、break/continue
是不是觉得今天的知识更新的量好大,完全顶不住了,对于小熊来说,这就是团结了力量啊!感谢西邮白白的投稿。今天 go 语言的内容是循环。由于在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。go 语言的循环和其他的没什么不同,只是语法上略微有些差别。定义一个数组for 循环方式 1 和 c++、java 相似nums := []int{1, 2, 3, 4...原创 2020-04-15 22:56:12 · 840 阅读 · 1 评论 -
三分钟学 Go 语言——条件语句+switch和type switch
ifelseif 20>0{ fmt.Println("yes") }输出yesifelseif 20<0{ }else{ fmt.Println("no") }输出noswitch 和 type switchswitch 好理解,是一个替代if else else else接口而提出的,如下,switch 后跟变量,case 后跟常...原创 2020-04-14 20:56:17 · 593 阅读 · 0 评论 -
三分钟学 Go 语言——常量+各种类型转换
代码位置常量常量就是不可变的变量,定义方式const identifier [type] = value约定常量全大写表示const A int = 1const B = 1const C, D, E = 1, 1, 1一般常量被用于枚举 const ( Success = 0 UnKonw = 1 Error = 2 )不过要枚举还是用 go 自带...原创 2020-04-14 20:14:47 · 518 阅读 · 3 评论 -
三分钟学 Go 语言——声明【变量】的各种方式
声明【变量】的各种方式讲变量就要先知道 go 语言有哪些数据类型。数据类型数据类型的出现是为了把数据分成所需内存大小不同的数据。布尔型(bool): 值只可以是常量 true 或者 false。数字类型: 整型 int 和浮点型 float,支持复数(业务代码用不到),其中位的运算采用补码。字符串类型(string): 使用UTF-8编码标识Unicode文本。其他:指针、数组、结...原创 2020-04-13 21:52:24 · 395 阅读 · 0 评论 -
三分钟学 Go 语言——开始
三分钟学 Go 语言系列教程第一章、前言学 Go 语言,我有一些小骄傲!为什么要学 go 语言?让你的 Golang 项目在 IDE 里跑起来我发现每次更新都得搞到这个点,还好没有到 0 点,吓出一身冷汗。我已经习惯了每天抽 30 分钟在 github 上打卡,连着更新完了整个 go 语言系列的学习过程,当然了我会一直维护这个项目到天荒地老,后面我学到新知识或者看到很棒的代码片也...原创 2020-04-13 00:01:28 · 321 阅读 · 2 评论 -
学Go语言,我有一些小骄傲!
久等了!!!嘿我的朋友,我是小熊,我之前工作中多用到的是 python ,但是未来工作会用到大量的 go 语言,所以我抽时间进行了深入学习。目前我已经成功给一个开源项目 prometheus (go 语言写的)贡献过代码,也在公司里提交了不少相关代码最近睡前的时候读完了 go 语言教程。我还在 github 上建了一个项目,star 还不多,这个项目是 go、python 的学习教程,记...原创 2020-04-11 23:09:10 · 367 阅读 · 1 评论 -
让你的Golang项目在IDE里跑起来(Goland使用入门-GOROOT、GOPATH、src、 pkg、bin、import)
前言每次新建项目,不熟悉go的项目结构,一般跑都跑不起来,每次都要重新搞一遍,好几回跑项目都会报类似File is invalid的错误有时候报其他奇怪的错误,今天就下决心整理一下,理一理概念 GOROOT、GOPATH、src、 pkg、bin,希望以后不要再出现这样的问题了,同时给看到文章的你一些帮助。熟悉golang项目目录结构要想让你的程序跑起来,要按照这样的目录结构,正常情况...原创 2020-03-09 22:56:57 · 5856 阅读 · 14 评论 -
go语言语法备忘
这篇文章会不断的更新,我会记录我在使用过程中一时想不起的语法。数组//给二维数组中追加值var ResRow [][]intres_col := make([]int, len)ResRow = append(ResRow,res_col)二维数组初始化值row, column := 3, 4 var answer [][]int for i := 0; i &l...原创 2020-03-06 22:27:15 · 1282 阅读 · 0 评论 -
怎么用go写api?
简单http服务端在golang中,实现一个普通的http接口可以处理get请求和x-www-form-urlencoded类型的post请求,而如果想实现处理json数据的post请求,则需要用另外的方式实现,接收的参数要从request.Body中读取:import ( "net/http" "encoding/json" "log")func main()...原创 2020-03-04 11:56:09 · 7496 阅读 · 9 评论 -
golang基础-编写单元测试
Go测试Go有一个内建的测试指令go test以及testing包,联合给出一个最小但完整的测试体验,标准工具链同时包含性能测试和基于语句的测试。我这一次打算用GolandIDE来进行单元测试单元测试的特性第一个也是唯一的参数必须是t *testing.T函数名称以Test开头,紧接着以大写字母开头的单词或短语。通常被测试的方法会长这样 TestValidateClient调用t....原创 2020-03-04 11:55:23 · 1942 阅读 · 0 评论