![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
golang
文章平均质量分 66
gongpulin
这个作者很懒,什么都没留下…
展开
-
golang语言并发与并行——goroutine和channel的详细理解(二)
Go语言的并发和并行不知道你有没有注意到一个现象,还是这段代码,如果我跑在两个goroutines里面的话:var quit chan int = make(chan int)func loop() { for i := 0; i 10; i++ { fmt.Printf("%d ", i) } quit 0}func mai转载 2017-12-19 21:02:53 · 273 阅读 · 0 评论 -
golang 如何判断变量的类型
方法一package mainimport ( "fmt")func main() { v1 := "123456" v2 := 12 fmt.Printf("v1 type:%T\n", v1) fmt.Printf("v2 type:%T\n", v2)}123456789101112131415output:...原创 2018-02-24 15:12:24 · 1056 阅读 · 0 评论 -
Go语言并发编程总结
微信公众号:Golang语言社区如有问题或建议,请公众号留言或者微信群、QQ群提问Golang :不要通过共享内存来通信,而应该通过通信来共享内存。这句风靡在Go社区的话,说的就是 goroutine中的 channel …….他在go并发编程中充当着 类型安全的管道作用。1、通过golang中的 goroutine 与sync.Mutex进行 并发同步import( "fmt" "...转载 2018-03-31 21:43:40 · 292 阅读 · 0 评论 -
golang-字符串拼接性能对比
下面代码,分别比较了 fmt.Sprintf,string +,strings.Join,bytes.Buffer,方法是循环若干次比较总时间。性能由高到低依次是(bytes.Buffer) > (string +) > (fmt.Sprintf) > strings.Join测试代码如下:package mainimport ( "bytes" "fmt"...原创 2018-05-22 17:00:14 · 4504 阅读 · 0 评论 -
golang-sync包介绍
一、lockMutex互斥锁,也是全局锁;Lock()加锁,Unlock()解锁.func main() { var l *sync.Mutex l = new(sync.Mutex) l.Lock() defer l.Unlock() fmt.Println("1")}线程安全maptype SafeStringMap struct { sync.RWMutex M ma...原创 2018-05-30 16:09:06 · 960 阅读 · 0 评论 -
Golang 单元测试和性能测试
开发程序其中很重要的一点是测试,我们如何保证代码的质量,如何保证每个函数是可运行,运行结果是正确的,又如何保证写出来的代码性能是好的,我们知道单元测试的重点在于发现程序设计或实现的逻辑错误,使问题及早暴露,便于问题的定位解决,而性能测试的重点在于发现程序设计上的一些问题,让线上的程序能够在高并发的情况下还能保持稳定。本小节将带着这一连串的问题来讲解Go语言中如何来实现单元测试和性能测试。Go语言中...转载 2018-05-30 17:21:42 · 2330 阅读 · 0 评论 -
深入解析 Go 中 Slice 底层实现
转载:https://halfrost.com/go_slice/切片是 Go 中的一种基本的数据结构,使用这种结构可以用来管理数据集合。切片的设计想法是由动态数组概念而来,为了开发者可以更加方便的使一个数据结构可以自动增加和减少。但是切片本身并不是动态数据或者数组指针。切片常见的操作有 reslice、append、copy。与此同时,切片还具有可索引,可迭代的优秀特性。一. 切片和数组关于切片...转载 2018-06-24 15:40:52 · 1065 阅读 · 0 评论 -
golang并发的非阻塞缓存函数返回结果
并发的非阻塞缓存本节中我们会做一个无阻塞的缓存,这种工具可以帮助我们来解决现实世界中并发程序出现但没有现成的库可以解决的问题。这个问题叫作缓存(memoizing)函数(译注:Memoization的定义: memoization 一词是Donald Michie 根据拉丁语memorandum杜撰的一个词。相应的动词、过去分词、ing形式有memoiz、memoized、memoizing),也...转载 2018-07-08 11:51:58 · 2472 阅读 · 0 评论 -
open-falcon transfer rpc实现
1、为了防止一下子起很多goroutine,使用一个带缓冲channel的信号量限制并发起的goroutine起的数量package semaphoreimport ()type Semaphore struct { bufSize int channel chan int8}func NewSemaphore(concurrencyNum int) *Semaphore { ...原创 2018-07-02 17:49:46 · 685 阅读 · 0 评论 -
国内的go get问题的解决
go get golang.org/x 包失败解决方法由于各种问题,国内使用 go get 安装 golang 官方包可能会失败,如我自己在安装 collidermain 时,出现了以下报错:$ go get collidermainpackage golang.org/x/net/websocket: unrecognized import path "golang.org/x/net/we...转载 2018-07-09 16:06:40 · 27607 阅读 · 0 评论 -
Go Channel 详解
Channel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(communication)。它的操作符是箭头 <- 。12ch <- v // 发送值v到Channel ch中v := <-ch // 从Channel ch中接收数据,并将数据赋值给v(箭头的指向就是数据的流向)就像 map 和 slice 数据类型一样,...转载 2018-07-03 14:39:38 · 139 阅读 · 0 评论 -
golang sort —— 排序算法
sort —— 排序算法该包实现了四种基本排序算法:插入排序、归并排序、堆排序和快速排序。 但是这四种排序方法是不公开的,它们只被用于sort包内部使用。所以在对数据集合排序时不必考虑应当选择哪一种排序方法,只要实现了sort.Interface定义的三个方法:获取数据集合长度的Len()方法、比较两个元素大小的Less()方法和交换两个元素位置的Swap()方法,就可以顺利对数据集合进行排序。...转载 2018-06-28 15:23:32 · 28289 阅读 · 6 评论 -
golang-map的实现
map的实现Go中的map在底层是用哈希表实现的,你可以在 $GOROOT/src/pkg/runtime/hashmap.goc 找到它的实现。数据结构哈希表的数据结构中一些关键的域如下所示:struct Hmap{ uint8 B; // 可以容纳2^B个项 uint16 bucketsize; // 每个桶的大小 byte *buckets; // 2^B个...转载 2018-06-28 15:42:20 · 6633 阅读 · 0 评论 -
Go性能优化小结
1 内存优化1.1 小对象合并成结构体一次分配,减少内存分配次数做过C/C++的同学可能知道,小对象在堆上频繁地申请释放,会造成内存碎片(有的叫空洞),导致分配大的对象时无法申请到连续的内存空间,一般建议是采用内存池。Go runtime底层也采用内存池,但每个span大小为4k,同时维护一个cache。cache有一个0到n的list数组,list数组的每个单元挂载的是一个链表,链表的每个节点就...转载 2018-06-28 20:38:31 · 520 阅读 · 0 评论 -
golang-defer浅析
转载自:https://tiancaiamao.gitbooks.io/go-internals/content/zh/03.4.html defer和go一样都是Go语言提供的关键字。defer用于资源的释放,会在函数返回之前进行调用。一般采用如下模式:f,err := os.Open(filename)if err != nil { panic(err)}defer...转载 2018-08-10 21:50:24 · 192 阅读 · 0 评论 -
go基础-面向对象
面向对象前面两章我们介绍了函数和struct,那你是否想过函数当作struct的字段一样来处理呢?今天我们就讲解一下函数的另一种形态,带有接收者的函数,我们称为methodmethod现在假设有这么一个场景,你定义了一个struct叫做长方形,你现在想要计算他的面积,那么按照我们一般的思路应该会用下面的方式来实现package mainimport "fmt"转载 2017-12-17 16:36:28 · 205 阅读 · 0 评论 -
go中方法的接收者是值或者指针区别
参考文章:http://studygolang.com/articles/1113希望解决的问题如下假设有两个方法,一个方法的接收者是指针类型,一个方法的接收者是值类型,那么:对于值类型的变量和指针类型的变量,这两个方法有什么区别?如果这两个方法是为了实现一个接口,那么这两个方法都可以调用吗?如果方法是嵌入到其他结构体中的,那么上面两种情况又是怎样的?值类型的变转载 2017-12-28 15:38:09 · 1023 阅读 · 0 评论 -
golang语言并发与并行——goroutine和channel的详细理解(三)
Go语言并发的设计模式和应用场景以下设计模式和应用场景来自Google IO上的关于Goroutine的PPT:https://talks.golang.org/2012/concurrency.slide本文的示例代码在: https://github.com/hit9/Go-patterns-with-channel生成器在Python中我们可以使用yield关转载 2017-12-19 21:03:26 · 587 阅读 · 0 评论 -
Go语言并发编程总结
Golang :不要通过共享内存来通信,而应该通过通信来共享内存。这句风靡在Go社区的话,说的就是 goroutine中的 channel .......他在go并发编程中充当着 类型安全的管道作用。1、通过golang中的 goroutine 与sync.Mutex进行 并发同步import( "fmt" "sync" "run转载 2017-12-19 21:08:59 · 230 阅读 · 0 评论 -
golang语言并发与并行——goroutine和channel的详细理解(一)
如果不是我对真正并行的线程的追求,就不会认识到Go有多么的迷人。Go语言从语言层面上就支持了并发,这与其他语言大不一样,不像以前我们要用Thread库 来新建线程,还要用线程安全的队列库来共享数据。以下是我入门的学习笔记。Go语言的goroutines、信道和死锁goroutineGo语言中有个概念叫做goroutine, 这类似我们熟知的线程,但是更轻。转载 2017-12-19 21:02:15 · 385 阅读 · 0 评论 -
go安装配置
下载地址:https://dl.gocn.io/ linux下载地址:wget https://dl.gocn.io/golang/1.9.2/go1.9.2.linux-amd64.tar.gzGOROOT就是go的安装路径,GOPATH,go install/go get和 go的工具等会用到GOPATH环境变量.GOPATH是作为编译后二进制的存放目的原创 2017-12-16 15:43:19 · 213 阅读 · 0 评论 -
go命令工具
1、go build这个命令可以直接使用,也可以带上代码包或源码文件使用。 如果是直接使用,表示试图编译当前目录所对应的代码包,如果当前目录不是一个有效的代码包(包含在 $GOPATH/src 目录下)则会报错;如果带上代码包名,则表示编译指定的代码包;如果带上源码文件,则表示编译指定源码文件。 GO语言的源码文件分为三类,包括命令源码文件、库源码 文件和测试源码文件。原创 2017-12-16 16:49:54 · 941 阅读 · 0 评论 -
goroutine的使用陷阱
在项目开发中,遇到一个奇怪的问题,goroutine调用的函数中的参数值和调用前不一致,代码如下: func test(){ for _,v:=range mydata { fmt.Print(&v) //语句1 go handle(&v) } } func handle(转载 2017-12-25 17:03:18 · 838 阅读 · 0 评论 -
go基础-函数
函数函数是Go里面的核心设计,它通过关键字func来声明,它的格式如下:func funcName(input1 type1, input2 type2) (output1 type1, output2 type2) { //这里是处理逻辑代码 //返回多个值 return value1, value2}上面的代码我们看出关键字func用来声明一个函数f转载 2017-12-17 15:25:08 · 240 阅读 · 0 评论 -
go基础
变量定义//定义一个名称为“variableName”,类型为"type"的变量var variableName type定义多个变量//定义三个类型都是“type”的变量var vname1, vname2, vname3 type定义变量并初始化值//初始化“variableName”的变量为“value”值,类型是“type”va原创 2017-12-16 16:59:13 · 397 阅读 · 0 评论 -
go基础-interface
interfaceGo语言里面设计最精妙的应该算interface,它让面向对象,内容组织实现非常的方便,当你看完这一章,你就会被interface的巧妙设计所折服。什么是interface简单的说,interface是一组method签名的组合,我们通过interface来定义对象的一组行为。我们前面一章最后一个例子中Student和Employee都能SayHi转载 2017-12-17 16:55:28 · 153 阅读 · 0 评论 -
go通过共享变量实现并发
协程之间的通信只能够通过通道。但是我们习惯于共享变量,而且很多时候使用共享变量能让代码更简洁。比如一个Server有两个状态开和关。其他仅仅希望获取或改变其状态,那又该如何做呢。可以将这个变量至于0通道中,并使用一个协程来维护。下面的例子描述如何用这个方式,实现一个共享变量。//共享变量有一个读通道和一个写通道组成type sharded_var struct { rea原创 2017-12-26 14:26:59 · 3942 阅读 · 0 评论 -
go语言make()和new()
make 函数make 也是内建函数,你可以从 http://golang.org/pkg/builtin/#make 看到它, 它的函数原型 比 new 多了一个(长度)参数,返回值也不同。 函数原型是:func make(Type, size IntegerType) Type 1第一个参数是一个类型,第二个参数是长度返回值是一个类型官方描述为:原创 2017-12-26 15:15:15 · 306 阅读 · 0 评论 -
go习题
最近在很多地方看到了golang的面试题,看到了很多人对Golang的面试题心存恐惧,也是为了复习基础,我把解题的过程总结下来。面试题1. 写出下面代码输出内容。package mainimport ( "fmt")func main() { defer_call()}func defer_call() { defer func() {转载 2017-12-26 21:04:56 · 1188 阅读 · 0 评论 -
go习题二
能力模型级别模型初级primary熟悉基本语法,能够看懂代码的意图;在他人指导下能够完成用户故事的开发,编写的代码符合CleanCode规范;中级intermediate能够独立完成用户故事的开发和测试;能够嗅出代码的坏味道,并知道如何重构达成目标;高级senior能够开发出高质量高性能的代码;能够转载 2017-12-26 21:06:20 · 1311 阅读 · 0 评论 -
Go 语言中的方法,接口和嵌入类型
概述在 Go 语言中,如果一个结构体和一个嵌入字段同时实现了相同的接口会发生什么呢?我们猜一下,可能有两个问题:编译器会因为我们同时有两个接口实现而报错吗?如果编译器接受这样的定义,那么当接口调用时编译器要怎么确定该使用哪个实现?在写了一些测试代码并认真深入的读了一下标准之后,我发现了一些有意思的东西,而且觉得很有必要分享出来,那么让我们先从 Go 语言中的方法开始转载 2017-12-28 14:59:48 · 322 阅读 · 0 评论 -
Golang开发新手常犯的50个错误
《50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs》原文地址:http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/index.html详细blog:https://blog.csdn.net/tuobicu...转载 2018-10-07 10:02:53 · 2164 阅读 · 0 评论