
GoLang
文章平均质量分 65
梅雨心情
人最大的悲哀,莫过于拒绝当英雄
展开
-
使用Goroutine和channel实现并发的多个例子
在现实场景中,因为业务需求,可能需要实现function level的并发,并且需要控制发送者或者控制接收者的数量。所以我稍稍总结了一下,具体发送者和接收者不同的示例,而不是简单使用随机数什么的控制并发的停止。一、一个发送者和多个接收者的例子import ( "fmt" "strings" "sync")// sender: 1, receivers: Mconst ( N...原创 2020-03-08 13:30:39 · 1118 阅读 · 0 评论 -
Golang内存管理(转)
一、没有虚拟内存的问题最开始,CPU执行指令,通过内存地址将物理内存中的数据载入到寄存器,然后执行机器指令。但之后出现了问题:1、内存访问冲突:多个程序使用同一块内存空间,会导致数据读写错乱2、内存不够用:一个程序直接申请一块内存3、程序开发成本高:开发者需要考虑程序需要的内存容量和相应的内存地址二、虚拟内存虚拟内存:用户程序只需通过虚拟内存地址获取数据,系统会将虚拟地址翻译成实际的物...转载 2019-04-19 10:56:41 · 3237 阅读 · 0 评论 -
Golang的变量内存分配和逃逸分析
内存分配方式逃逸分析总结一、内存分配方式一个执行的程序在内存中的分配总共有五部分:1、text:存储程序的二进制指令和一些静态内容2、data:存储已经初始化的全局变量,静态分配3、bss:存储未被初始化的全局变量,静态分配4、stack:栈,主要用来函数调用时存储局部变量。内存由系统管理,通过压栈的方式自动分配和通过出栈的方式自动释放。5、heap:堆,用于动态分配内存,由...原创 2019-04-18 09:40:47 · 3039 阅读 · 0 评论 -
有关Golang channel关闭的优雅方式
今天看到了一篇很不错的文章,读完之后我简单重写了示例代码,文字内容也不一致,有兴趣的同学可以去读一下原文或译文。有关channel的问题保证channel关闭一次的方式关闭channel的优雅方式一、有关channel的问题Golang面试有关channel的问题肯可能会问到:Q:如何关闭一个channelA:close()Q:怎么判断一个channel已经关闭了A:(1...原创 2019-04-03 15:21:14 · 2348 阅读 · 2 评论 -
乐观锁、悲观锁以及CAS机制的研究
乐观锁:拿数据的时候都认为在使用该数据的过程中,别人不会修改它,所以在此过程中不会上锁。而当更新数据之后,会判断在此期间有没有其他人更改这个数据。悲观锁:拿数据的时候都认为在使用过程中,别人会修改它,所以一开始就会上锁,别人想拿该数据就会阻塞,直到获取到锁。(共享资源只给一个线程使用,其他线程阻塞,直到资源使用完后释放锁,其他线程才有权限访问该资源)乐观锁:适用于多读的类型,可以提高吞吐量。...原创 2019-04-10 08:45:12 · 495 阅读 · 0 评论 -
goka——基于kafka的go语言流处理框架
一、goka简单介绍(第一和第二部分基于官方博客,对部分内容进行精简翻译原文地址)为了实现组合性、可扩展性和容错性,Goka鼓励开发者通过使用emitters(发射者)、processors(处理者)和views(视图,group表的持久高速缓存)三种组件来分解application到微服务中。下图描绘了使用的三种组件、kafka和扩展的API的架构图。emitters.发射者,在kafk...原创 2019-03-14 17:51:03 · 5777 阅读 · 0 评论 -
Golang有关defer延迟函数的讨论与研究
延迟函数defer是Golang的一个语法糖,逻辑上defer是与普通函数适配的。所以在使用defer时,应该对应到一个函数中,而不是一个for循环语句内或一个代码块中,因为这样做是危险和无意义的。import ( "fmt" "sync")func main() { /* 问题一:defer nil函数 */ func(){ var run func() = nil ...原创 2019-03-05 16:17:28 · 348 阅读 · 0 评论 -
BUG: golang.org/x/crypto/ssh/terminal/util.go undefined: unix.IoctlGetTermios
最近使用到logrus库,但是logrus依赖于golang.org/x/crypto/ssh/terminal, 这个库在gopath下不在vendor里是不会报错的,但是添加到vendor后,会报下面的错误,开始感觉可能是go版本,或者是mac系统的原因。后来我做了一些尝试,Mac系统下,golang.org/x/crypto/ssh/terminal库装在GOPATH下而不在vendor...原创 2019-02-26 14:37:59 · 2573 阅读 · 0 评论 -
goroutine并发控制方式的总结
一、sync.WaitGroup{} 进行goroutine的控制WaitGroup等待组是控制goroutine并发的一种方式,在我看来真正的意义是照顾弱势的“子goroutine”,通过Add()方法,确定预期要运行的goroutine的个数,然后goroutine内部通过defer延迟函数执行Done()方法,对一个goroutine运行结束后,进行计数减一,最后在“父goroutine”...原创 2019-03-01 17:41:44 · 552 阅读 · 0 评论 -
Go语言time库的深入研究
本人机器的go版本为1.10.3,所以对于time库的研究是基于go1.10.3,下面是time库下的所有go文件。先排除xxx_test.go文件,主要的文件为:time.goformat.gozoneinfo.gosleep.gotick.go其他的sys_xxx.go和zoneinfo_xxx.go都是zoneinfo.go的附庸,兼容不同平台打开$GOROOT/lib...原创 2019-02-21 15:55:22 · 832 阅读 · 0 评论 -
spf13/viper——Go应用程序的完整配置解决方案
spf13/viper——Go应用程序的完整配置解决方案一、viper的简单介绍1.viper支持的功能:1、可以设置默认值2、可以加载多种格式的配置文件,如JSON,TOML,YAML,HCL和Java属性配置文件3、应用程序运行过程中,保持监听和重新读取配置文件4、可以从环境变量读取配置5、可以从远程配置系统读取配置6、可以读取命令行标志作为配置7、可以从缓冲区中读取8、设...原创 2019-01-15 22:08:57 · 6818 阅读 · 0 评论 -
golang下载非标准库包的曲径通幽~~
今天在学习github.com/spf13的时候,跑它的测试代码,发现需要关联一堆的包。然后借助Goland的强大功能下载,紧接着便遇到了下载不了golang.org/x/sys和golang.org/x/text两个包。第一反应是没有翻墙的问题,但是电脑可以连外网依然下载不成功。import ( "golang.org/x/sys/unix" "golang.org/x/text/tran...原创 2019-01-04 18:25:30 · 442 阅读 · 0 评论 -
go语言map转struct,使用mitchellh/mapstructure,mapstructure.Decode遇到的坑
Golang中的map转strcut在go语言的项目中,map与struct相互转换的需求很常见。网上有一些简单粗暴的解决方法,利用json的序列化和反序列化进行map与struct的转换,但是当map或struct有比较复杂的复合结构时,这种方法会忽略复杂结构的字段。所以这里介绍一种比较好的转换方式。使用mapstructure.Decode先直接上代码吧!type params str...原创 2018-11-30 18:47:52 · 11137 阅读 · 3 评论 -
protobuf的安装和入门
protobuf的安装和入门mac环境下protobuf的安装1.安装google protocol buffer 编译器,点击这里下载合适的压缩包。2.安装golang protobuf,点击这里下载压缩包。3.将下载后的protobuf编译器解压后,将bin目录下的可执行文件protoc复制到$GOPATH/bin目录下。4.解压golang的protobuf,将整个proto...原创 2018-11-02 11:26:01 · 495 阅读 · 0 评论 -
go语言的类型转换 整型转字符串 字符串转整型
golang是强类型语言,在应用过程中类型转换基本都会用到。下面整理一下常用的类型转换,会持续更新。整形转字符串fmt.Println(strconv.Itoa(100))该方法的源码是:// Itoa is shorthand for FormatInt(i, 10).func Itoa(i int) string { return FormatInt(...转载 2018-08-22 20:27:42 · 6431 阅读 · 0 评论 -
Go语言字符串拼接的三种方式
Go语言字符串拼接的三种方式使用bytes.Buffer实现字符串拼接通过创建一个缓冲byte类型的缓冲器str1,然后通过WriteString方法将传入的字符串放入缓冲器的尾部,已达到拼接的作用,然后调用缓冲器str1的String()方法,可以返回放入缓冲器中的内容(实际返回的是缓冲器中未读的部分),返回类型为string。 var str1 bytes.Buffer ...原创 2018-08-22 20:08:14 · 11999 阅读 · 0 评论 -
govendor的安装与实践
govendor的安装与实践 govendor是Golang的依赖包管理工具,它的出现可以避免不同用户在clone同一个项目后从外部获取不同依赖库版本的问题。govendor会将项目需要的依赖包添加到项目的vendor目录下,并且该目录中vendor.json文件会保存添加的依赖包的路径等信息。 Golang项目中的go文件在查找依赖的顺序是,先在vendor中查找,vendor没找...原创 2018-08-13 21:41:02 · 13961 阅读 · 0 评论