go语言
文章平均质量分 94
phantom_111
这个作者很懒,什么都没留下…
展开
-
记一次 Golang 的奇怪错误
看报错的内容中包括「# runtime/cgo」,盲猜是在开发的程序引用了 cgo,毕竟有今天必现提测的大山压着,不管三七二十禁用 cgo 试试。出现这个问题的根本原因,可能是编译器升级后对 C++ 的语法校验更加严格,之前是 warning 的错误,在严格后作为 error 报出。本着排查的思路,写了一个最简单的 「hello world」的程序,发现并不会报错。遇到这个错误,笔者表示十分懵逼,但是作为一个专业的软件开发工程师,遇到问题不可怕,可怕的是没有排查的方向。答案:不可以的,但是发现。原创 2022-09-13 19:28:09 · 1121 阅读 · 0 评论 -
CGO 从入门到放弃
文章目录1. 写在最前面2. CGO 调用方式2.1 引入 C 源码2.1.1 将 C 源码嵌入 go 文件2.1.2 将 C 的源文件嵌入到 go 项目2.2 引入链接库的方式2.2.1 链接库源文件的定义2.2.2 在 go 源文件中引用动态链接库3. CGO 调用 C++3.1 demo3.1.1 C++ 部分定义3.1.2 C 部分定义3.1.3 go 部分定义4. 坑点4.1 内存4.2 栈4.3 线程模型5. 碎碎念6. 参考资料1. 写在最前面作为一只弱小可怜又无助的 go 开发,在接原创 2021-06-16 21:02:08 · 1087 阅读 · 0 评论 -
golang pprof 的原理分析
文章目录1. 写在最前面2. pprof 提供的能力2.1 查看方式3. pprof 使用3.1 server 服务3.2 非 server 服务4. pprof 源码分析4.1 思考4.2 细节说明4.2.1 SIGPROF 信号4.2.2 pprof 数据写入过程5. 碎碎念6. 参考资料1. 写在最前面最近在改面向集群 profiling 服务代码的时候,想到 golang 原生支持单机的 profiling。原本对比两种实现的异同,但是目前并不能够完全理解集群 profiling 服务的实现原原创 2021-01-12 21:15:27 · 2663 阅读 · 0 评论 -
golang程序性能分析
最近在使用GraphQL编写golang程序,但GraphQL框架在golang上的实践比较少,很多性能上的资料也不够全面。考虑到线上抗压的问题,笔者决定对自己开发的服务模块进行性能压测,评估下服务的整体性能。测试的工具链使用Vegeta+PPof+go-torch,PProf、go-torch上一篇文章Golang工具链 已经总结过不再赘述,vegeta会简单讲解下。工具-vegetaV...原创 2018-04-22 18:22:59 · 2408 阅读 · 0 评论 -
golang 之关于 map 不知道的事
笔者使用 map 作为一个全局的 cache,测试之后发现,即使删除了不需要使用 key,但随着写入数据量的增加,map 占用的内存也开始不断增加。 分析原因,map 是通过 key 和 hash 值来分布和查找对象。map 不会收缩「不再使用」的空间,即使把 map 中的键值对,它依然保留内存空间继续使用。一、正确的使用姿势预估 map 容量性能测试: map_tes...原创 2018-07-19 20:33:15 · 6856 阅读 · 4 评论 -
golang 之 map 新玩法
笔者接触 golang 也有两年的时间了,最常用的以string为key map 类型无非就是 map[string] 基础类型(int、string、float等)、map[string]interface{}、map[string]struct 这几类,说来惭愧,以前抽象数据结构,在用多维 map 的时候都是将第二维的 map 用一个单独的 struct 包装之后再使用。以前都是这么用的:...原创 2018-08-31 20:19:59 · 4465 阅读 · 1 评论 -
golang 之 slice 排序
虽然 golang 自带了 sort 包,但笔者之前用的并不多,最近需要对一个 []struct 的结构进行排序,顺手整理下使用的细节,以后用的时候查资料就可以啦(ps 撒花)用 slice 实现归并排序由简单的 []int 开始学习,假定提供一个 int 类型的 slice,需要按照顺序进行排序,猜测机智的你可能会这么实现:func merge(left, right []int...原创 2018-09-11 18:45:52 · 8953 阅读 · 0 评论 -
一个死锁引发的思考
笔者在转到 golang 之后使用最多的就是 Grpc 的库,这次裸写 tcp 的 client ,由于 client 的 write 阻塞间接导致了代码死锁,在此处记录下。client write 的分类写成功「写成功」指的是 write 调用返回的 n 与预期要写入的数据长度相等,且 error 为 nil 。函数原型如下:func (c *TCPConn) Write(b []by...原创 2018-09-24 17:55:36 · 658 阅读 · 0 评论 -
正确使用 protobuf 的姿势
Protobuf 总结用途Protobuf 是 google 出品的序列化框架,可跨平台、跨语言使用,扩展性良好。与 XML, JSON 等序列化框架相同,Protobuf 广泛的应用于数据存储,网络传输,RPC 调用等环境。序列化: 将 数据结构或对象转换成二进制串的过程反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程笔者认为序列化和反序列化可理解为上学的时候...原创 2018-11-21 21:44:28 · 3020 阅读 · 0 评论 -
用 mutex、channel、自旋锁进行同步
背景Goroutine 是原生支持的一种轻量级线程——协程。协程的优势在于上下文切换的代价非常小,但进程中执行数以万计的协程,依旧能够保持很高的性能。进程、线程、协程的关系和区别:进程拥有独立的堆和栈,既不共享堆,也不共享栈,由操作系统负责调度。线程拥有独立的栈和共享的堆,由操作系统负责调度(内核线程)。协程拥有独立的栈和共享的堆,有 golang 的调度器负责调度。想象一个场景,...原创 2018-12-04 21:21:16 · 652 阅读 · 0 评论 -
小白的实时通信之路
1. 定义1.1 背景介绍通信: 客户端和服务端的一次交互过程。可以简述为如下步骤:客户端发出请求服务端接收,处理,返回结果客户端接收结果实时通信:所谓「实时通信」就是要求客户端能够收到服务端实时更新的结果,其实简单理解就是在通信这个词上加了「实时的」这个形容词,所以本质上通信的双方还是客户端和服务端。举个生活中实时通信的例子,约会中,为了实时获取到对方的位置,可能采用...原创 2018-12-22 17:52:52 · 404 阅读 · 0 评论 -
vscode 的重装之旅 — 调试适配器进程意外终止
笔者想要研究下 channel 的源码,但是发现 vscode 的 debug 功能居然不能用了,真的是惨绝人寰,惨无人道啊,只能被迫开启重装之旅了。1. 报错笔者的英语水平有限,给 vscode 安装了中文的插件,所以提示的报错如下:中文 -> 调试适配器进程意外终止英文 -> Error: Debug Adapter Process Has Terminated Unex...原创 2019-05-20 21:54:20 · 4322 阅读 · 0 评论 -
Golang工具链
Go语言的工具链对开发者非常友好,内置了很多性能调优、测试的工具,比如CPU分析器pprof、Uber开源的用于生成火焰图的go-torch、流量拷贝工具goreplay等,这些工具极大的提高了开发者效率,下面就笔者的使用分别进行总结。pprofGo的强大之处是它已经在语言层面集成了profile采样工具,允许程序在运行时使用它们,使用Go的profiler能获取以下样本信息:c...原创 2018-04-17 21:57:22 · 2030 阅读 · 0 评论 -
golang之条件编译
Go语言可以通过go/build包里定义的tags和命名约定来让Go的包可以运行不同的代码。标签编译在源代码里添加标注,通常称之为编译标签(build tag)。编译标签采用靠近源代码文件顶部用注释的方式添加。go build在构建一个包的时候会读取这个包里的每个源文件并且分析编译便签,这些标签决定了这个源文件是否参与本次编译。编译标签由空格分隔的编译选项(options)以”或”的...原创 2018-03-05 21:51:58 · 12474 阅读 · 1 评论 -
《Go语言学习笔记》-测试
整理自《go 语言学习笔记》第十一章单元测试 单元测试不仅需要测试逻辑算法是否符合预期,而且还要承担监控代码质量的责任。单元测试本身就是对即将实现的算法做复合预演,包括输入条件和返回预期结果。 可将测试、版本管理工具,以及自动发布整合。单元测试可自动化进行,能持之以恒。 工具链和标准库自带单元测试框架: 1、测试代码须放在当前包以“_test.go”结尾的文件中。 2、测试函原创 2016-10-17 21:30:59 · 450 阅读 · 0 评论 -
golang包学习之sync
锁golang中sync包实现了两种功能的锁Mutex(互斥锁)和RWMutex(读写锁) type Mutex func (m *Mutex) Lock() func (m *Mutex) Unlock() type RWMutex func (rw *RWMutex) Lock() func (rw *RWMutex) RLock()原创 2016-11-28 20:21:42 · 537 阅读 · 0 评论 -
golang中使用package json遇到的问题
问题描述:首先,服务端使用Grpc+protobuf3进行服务各模块的通信。测试服务时,发送Http请求调用服务暴露的API接口,发现即使后端的服务已按照要求输入数据,但是在API层无法按照预期返回数据。解决方案原因:定义结构体的时候使用了json的tag并且使用omitempy的描述。json在Marshal的时候,如果传递的是默认值,在Marshal的时候会默认忽略。 json:"Offset原创 2016-12-09 19:11:11 · 528 阅读 · 0 评论 -
Golang 学习之“”、nil 和 len(s)的对比
1.”“用法使用”“判断string变量是否为空。 输入: var s string if s == "" { fmt.Println("s is empty") } else { fmt.Println("s is not empty") } 输出: s is empty2.nil用法使用nil判断结构体的指针是否为空。 输入: var Str s原创 2017-01-22 20:24:13 · 13578 阅读 · 0 评论 -
golang跨平台编译
交叉编译介绍本地编译:本地编译就是在当前的操作系统下(x86的CPU下),直接编译出可执行程序,其可以直接在当前的环境,即当前x86的CPU下运行。交叉编译:就是可以编译出在其它操作系统下运行的程序,比如在Linux下编译后在Windows系统中运行,或者说在32位下编译在64位下运行。原创 2017-12-29 18:25:50 · 900 阅读 · 0 评论 -
golang之goroutine调度的理解
系统内核已经有一个thread scheduler,为什么golang还自己实现了一套runtime scheduler。主要有两个原因,一个是,线程的很多特性(比如context上下文切换的耗时,thread自己的信号掩码等)对go程序来说是累赘。另一个原因是go的垃圾回收需要所有的goroutine停止,使得内存存在一个一致的状态。垃圾回收的时间点是不明确的,如果依靠系统自身的schedule...原创 2018-01-08 17:40:37 · 1593 阅读 · 0 评论 -
golang之slice、array、map
Arrayarray是固定长度的数组,使用前必须确定数组长度。所以动态数组slice更通用。数组是一个值类型 ,可以直接用它来进行赋值操作,但是数组的类型同时包括数组的长度和元素类型 ,数组类型完全相同才能相互赋值。array 声明和初始化//声明一个长度为10的int类型的数组var array0 [10]int //声明并初始化var array1 [5]int...原创 2018-03-07 09:54:29 · 594 阅读 · 0 评论 -
golang之new和make
golang提供的内建函数new()和make()。二者做的是不同的事情并且应用于不同的类型,但是因为规则类似,所以在使用过程中经常容易混淆。new这是用来分配内存的内建函数,它不初始化内存,只是将其置零。也就是说,new(T)会为T类型分配置零的存储,并返回它的地址(*T)。在Go的术语中,其返回一个指向新分配的类型为T的指针,这个指针指向的内容的值为零。注意并不是指针为零 。对于不...原创 2018-03-07 19:37:29 · 325 阅读 · 0 评论 -
golang之defer、panic、recover
go中可以抛出一个panic的异常,然后在defer中通过recover捕获异常,然后生成终止函数(程序) defer介绍defer语法介绍1.defer函数的参数被计算在defer被声明的的时候。func a() { i := 0 defer fmt.Println(i) i++ return}//结果: 打印的i值为0,因为i值为...原创 2018-02-27 22:10:14 · 440 阅读 · 0 评论 -
golang之闭包
什么是闭包?一个持有外部环境变量的函数就是闭包(可以描述为引用了自由变量 的函数或者描述为闭包是指内层函数引用了外层函数中的变量) 。理解闭包通常有以下几个关键点:函数自由变量环境举个例子:func a(x, y int) { //函数a的作用域则是环境 fmt.Println(x, y) //此处x,y均不是自由变量 func b() { fmt.p...原创 2018-02-28 20:26:20 · 332 阅读 · 0 评论 -
golang之Channel
Channel是Go中的一个核心类型,可以将其看成一个管道,通过它并发单元就可以发送或者接收数据进行通信(communication)。Do not communicate by sharing memory; instead, share memory by communicating.channel基础知识创建channel使用内建函数make创建channel:u...原创 2018-03-08 20:15:23 · 1637 阅读 · 0 评论 -
《Go语言编程》-并发编程
整理自《go语言编程》-第四章1、并发基础多进程:多进程是在操作系统层面进行并发的基本模式。同时也是开销最大的模式。在Linux平台上,很过工具链正是采用这种模式在工作。比如某个Web服务器,它会有专门的进程负责网络端口的监听和链接管理,还会有专门的进程负责事务和运算。这种方法的好处在于简单、进程间互不影响,坏处是系统开销大,因为所有的进程都是由内核管理的。 多线程:多线程在大部分操作系统上都属于原创 2016-09-30 17:28:02 · 774 阅读 · 0 评论