Go官方进程诊断工具gops详解

gops简介gops 是Go团队提供的命令行工具,它可以用来获取go进程运行时信息。 可以查看: 当前有哪些go语言进程,哪些使用gops的go进程 进程的概要信息 进程的调用栈 进程的内存使用情况 构建程序的Go版本 运行时统计信息 可以获取: trace cpu profile和memory profile 还可以: 让进程进行1次GC 设置GC百分比 示例代码使用Options配置agent。 123456789101112131415161718192021222324252627pac...阅读全文

Go语言充电站 2020-03-15 00:00 Go语言充电站

Go 只读通道/只写通道/有缓冲通道/无缓冲通道【深度解析】

引言 Goroutine 和 Channel 是 Go 语言并发编程的两大基石。Goroutine 用于执行并发任务,Channel 用于 goroutine 之间的同步、通信。 在Golang的并发哲学里,有一句非常著名的话: Do not communicate by sharing memory; instead, share memory by communicating. 意思是:不要通过共享内存来通信,而要通过通信来实现内存共享,它依赖CSP(Communication Sequen...阅读全文

Segmentfault 2020-03-28 09:32:34 carefor

GO语言web框架Gin之完全指南(二)

这篇主要讲解自定义日志与数据验证 参数验证 我们知道,一个请求完全依赖前端的参数验证是不够的,需要前后端一起配合,才能万无一失,下面介绍一下,在Gin框架里面,怎么做接口参数验证的呢 gin 目前是使用 go-playground/validator 这个框架,截止目前,默认是使用 v10 版本;具体用法可以看看 validator package · go.dev 文档说明哦 下面以一个单元测试,简单说明下如何在tag里验证前端传递过来的数据 简单的例子 func TestValidation...阅读全文

Segmentfault 2020-03-28 08:32:33 Paul

golang 每日一包之sync.cond

该包结构如下: sync包结构 1:Cond类型其结构如下:Locker 的传入类型可以为*Mutex 或 *RWMutex cond结构 其主要方法如下:1. 构造方法 该方法用于初始化一个cond实例2. 广播 该方法用于唤醒所有因条件等待的协程3. 单个通知 该方法用于通知获得锁的单个协程4. 等待阻塞 等待 c.L 解锁并挂起 goroutine,在稍后恢复执行后,Wait 返回前锁定 c.L,只有当被 Broadcast 和 Signal 唤醒,Wait 才能返回阅读全文

简书 2020-03-23 15:33:20 Orain

源码解读 Golang 的 sync.Map 实现原理

简介 Go 的内建 map 是不支持并发写操作的,原因是 map 写操作不是并发安全的,当你尝试多个 Goroutine 操作同一个 map,会产生报错:fatal error: concurrent map writes。 因此官方另外引入了 sync.Map 来满足并发编程中的应用。 sync.Map 的实现原理可概括为: 通过 read 和 dirty 两个字段将读写分离,读的数据存在只读字段 read 上,将最新写入的数据则存在 dirty 字段上 读取时会先查询 read,不存在再查询...阅读全文

掘金 2020年03月23日 张凯强zkqiang

Golang字符串遍历

Golang字符串遍历 package main import ( "fmt" ) func main() { v4 :=' 床前明月光, 疑似地上霜. 举着望明月, 低头思故乡. ` v6 := []rune(v4) v7 := "故" for k, v := range v6 { if string(v) == v7{ fmt.Printf("找到字符---\"%s\",\n其索引为%d\n",v7,k) fmt.Printf("%d--%c--%T\n", k, v, v) } } } 将...阅读全文

简书 2020-03-23 14:35:45 stardust_0000

leetcode_36

Golang: 思路:这题很有趣的是,我看到的解法里,暴力法几乎是最优解,而其他的解法貌似最优,实则未必。 代码如下: func isValidSudoku(board [][]byte) bool { matrix:=make([][]int,27) for i,_:=range matrix{ matrix[i]=make([]int,9) } for i:=0;i<len(board);i++{ for j:=0;j<len(board);j++{ if board[i][j]!='.'{...阅读全文

简书 2020-03-23 14:33:03 淳属虚构

leetcode_50

Golang: 思路:快速幂乘法,二分法的一种吧,对其他语言也许有边界上的要求,可是go,那真的是轻巧 代码如下: func myPow(x float64, n int) float64 { if n<0{ n=-n x=1/x } if n==1{ return x } if n==0{ return 1 } temp1:=myPow(x,n/2) temp2:=1.0 if n%2==1{ temp2=x } return temp1*temp1*temp2 }阅读全文

简书 2020-03-23 14:33:02 淳属虚构

PHP高级工程师学习和面试指南(转)

绝知此事须躬行。 为何写这篇文章。因为搜面试题搜到一篇# PHP高级工程师面试题 。看了看,有的会有的不会。想到自己也或多或少看过一些资料,故整理一下。 以下表中,资料列出的就够了。大都足以回答上面的面试题中的问题。 技能 资料 思考 php内核篇 《PHP7内核剖析》《PHP 7底层设计与源码实现》《PHP 7底层设计与源码实现》视频 尽量看细点。php7较之php5怎么节省内存的。比如php7 zvalue中复杂类型的用指针操作,也就是存个指针。php7快在哪里,小到string用了柔性数组...阅读全文

简书 2020-03-23 14:33:02 我是程序汪

源码解读 Golang 的 sync.Map 实现原理

简介 Go 的内建 map 是不支持并发写操作的,原因是 map 写操作不是并发安全的,当你尝试多个 Goroutine 操作同一个 map,会产生报错:fatal error: concurrent map writes。 因此官方另外引入了 sync.Map 来满足并发编程中的应用。 sync.Map 的实现原理可概括为: 通过 read 和 dirty 两个字段将读写分离,读的数据存在只读字段 read 上,将最新写入的数据则存在 dirty 字段上 读取时会先查询 read,不存在再查询...阅读全文

简书 2020-03-23 14:32:49 张凯强_zkqiang

源码解读 Golang 的 sync.Map 实现原理

简介 Go 的内建 map 是不支持并发写操作的,原因是 map 写操作不是并发安全的,当你尝试多个 Goroutine 操作同一个 map,会产生报错:fatal error: concurrent map writes。 因此官方另外引入了 sync.Map 来满足并发编程中的应用。 sync.Map 的实现原理可概括为: 通过 read 和 dirty 两个字段将读写分离,读的数据存在只读字段 read 上,将最新写入的数据则存在 dirty 字段上 读取时会先查询 read,不存在再查询...阅读全文

Segmentfault 2020-03-27 18:32:33 张凯强

Golang中的Defer必掌握的7知识点

在用Golang开发的时候,defer这个语法也是必备的知识,但是我们除了知道他是在一个函数退出之前执行,对于defer是否还有其他地方需要注意的呢。 本文整理的defer的全场景使用情况,部分场景源自网络,加上自己的额外观点和分析,完成了这份defer的7个隐性必备知识点。 提纲如下: 知识点1: defer的执行顺序 知识点2:defer与return谁先谁后 知识点3:函数的返回值初始化与defer间接影响 知识点4:有名函数返回值遇见defer情况 知识点5:defer遇见panic 知...阅读全文

Segmentfault 2020-03-27 17:32:35 aceld

golang slice 必知必会

1.数组是什么,slice是什么 在 golang 中,我们可以像C语言一样创建一个数组,也可以创建一个动态数组 (slice)数组: arr := [2]int{1, 2} arr[0]=3 arr[1]=4 fmt.Println(arr) // output:[3,4] 此时我们创建了一个包含2个元素的数组,[]中只能是常量,因为数组在创建的时候必须是确定的。slice:slice 这个对象在 golang 中是一个比较特殊的存在,从不同的角度观察,有时像引用类型,有时又不像,具体是什么情...阅读全文

Segmentfault 2020-03-27 14:32:36 thomaston

ffmpeg将多个flv文件合成为mp4(golang版)

需求 之前拿python写了个合并flv文件为mp4的脚本,运行感觉有点慢,用go重写下 注意事项 flv文件直接合并生成mp4的话只有第一个flv的内容才能播放,需要先转换成ts再合成mp4 命令行调用ffmpeg,需要自己另外安装,并配置环境变量 -loglevel quiet是调用ffmpeg不输出日志的选项,需要日志的话可以不加 代码 package main import ( "bytes" "flag" "fmt" "io/ioutil" "os" "os/exec" "path/f...阅读全文

简书 2020-03-23 00:32:42 玖零儛

Go 每日一库之 buntdb

简介 buntdb是一个完全用 Go 语言编写的内存键值数据库。它支持 ACID、并发读、自定义索引和空间信息数据。buntdb只用一个源码文件就实现了这些功能,对于想要学习数据库底层知识的童鞋更是不容错过。 感谢@kiyonlin推荐! 快速使用 先安装: $ go get github.com/tidwall/buntdb 复制代码后使用: package main import ( "fmt" "log" "github.com/tidwall/buntdb" ) func main() ...阅读全文

掘金 2020年03月22日 darjun

关于收集,标准化和集中化处理Golang日志的一些建议

依赖分布式系统的公司组织和团队经常使用Go语言编写其应用程序,以利用Go语言诸如通道和goroutine之类的并发功能。如果你负责研发或运维Go应用程序,则考虑周全的日志记录策略可以帮助你了解用户行为,定位错误并监控应用程序的性能。 这篇文章将展开聊一些用于管理Go日志的工具和技术。我们将首先考虑要使用哪种日志记录包来满足各种记录要求。然后会介绍一些使日志更易于搜索和可靠,减少日志资源占用以及使日志消息标准化的技术。 日志包的选择 Go标准库的日志库非常简单,仅仅提供了print,panic和f...阅读全文

Golang三种方式实现超时退出

问题 前段时间发现线上有个服务接口,总是间歇性告警,有时候一天两三次,有时候一天都没有。 告警的逻辑是在一个接口中异步调用了另一个HTTP接口,这个HTTP接口调用出现超时。但是我去问了负责这个HTTP接口的同学,人家说他们的接口相应都是毫秒级别,还截图监控了,有图有真相,我还能说啥。 但是,超时是确实存在的,只是请求还可能没有到人家服务那边。 这种偶发性问题不好复现,偶尔来个告警也挺烦的,第一反应还是先解决问题,思路也简单,失败后重试。 解决方法 且不谈重试策略,先说说什么时候触发重试。 我们...阅读全文

掘金 2020年03月22日 JackieZheng

构建更小Docker镜像的一些建议

背景: 前两天在群里看到有人提到说,自己构建了一个镜像,明明就只往base镜像中增加了tomcat,但是构建好的镜像大小最终却是两倍的tomcat包的大小,最后看到Dockerfile后才发现作者在把tomcat包拷贝进去之后,又使用RUN指令,执行了一次chmod a+x tomcat,我想说,这么搞镜像不大那是不可能的。另外一件事就是前段时间,同事说让搞一个公司级别的base镜像,要稳定并且尽量小,借着这两个事,和大家分享几点Docker镜像相关的事情。 首先,镜像的大小最终取决于如下几点:...阅读全文

简书 2020-03-22 22:32:47 BGbiao