Go语言中文网 为您找到相关结果 210

【GoLang笔记】遍历map时的key随机化问题及解决方法

之前的一篇笔记曾分析过,Go的map在底层是用hashmap实现的。由于高效的hash函数肯定不是对key做顺序散列的,所以,与其它语言实现的hashmap类似,在使用Go语言map过程中,key-value的插入顺序与遍历map时key的访问顺序是不相同的。熟悉hashmap的同学对这个情况应该非常清楚。 所以,本文要提到的肯定不是这个,而是一个比较让人惊奇的情况,下面开始说明。 1. 通过range遍历map时,key的顺序被随机化 在golang 1.4版本中,借助关键字range对Go语言的map做遍历访问时,前后两轮遍历访问到的key的顺序居然是被随机化的! 这个现象在其它语言中是很少见的,比如C语言实现hashmap时,通常会用数组(即一段连续的内存空间)来存key,虽然key的...阅读全文

Go语言atomic原子操作

atomic是最轻量级的锁,在一些场景下直接使用atomic包还是很有效的。 下面内容摘秒自《GO并发编程实战》—— 原子操作: CAS操作的优势是,可以在不形成临界区和创建互斥量的情况下完成并发安全的值替换操作。 这可以大大的减少同步对程序性能的损耗。 当然,CAS操作也有劣势。在被操作值被频繁变更的情况下,CAS操作并不那么容易成功。 原子操作共有5种,即:增或减、比较并交换、载入、存储和交换 1. 增或减 被用于进行增或减的原子操作(以下简称原子增/减操作)的函数名称都以“Add”为前缀,并后跟针对的具体类型的名称。 不过,由于atomic.AddUint32函数和atomic.AddUint64函数的第二个参数的类型分别是uint32和uint64,所以我们无法通过传递一个负的数值来...阅读全文

博文 2015-03-11 15:44 xcltapestry

golang对共享内存的操作

不同进程间的内存是互相独立的,没办法直接互相操作对方内的数据,而共享内存则是靠操作系统提供的内存映射机制,让不同进程的一块地址空间映射到同一个虚拟内存区域上,使不同的进程可以操作到一块共用的内存块。共享内存是效率最高的进程间通讯机制,因为数据不需要在内核和程序之间复制。 共享内存用到的是系统提供的mmap函数,它可以将一个文件映射到虚拟内存的一个区域中,程序使用指针引用这个区域,对这个内存区域的操作会被回写到文件上,其函数原型如下: void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset); 参数fd为即将映射到进程空间的文件描述字,一般由open()返回,同时,fd可以指定为-1,此时须指定f...阅读全文

golang make()内置函数

内建函数 make 用来为 slice,map 或 chan 类型分配内存和初始化一个对象(注意:只能用在这三种类型上),跟 new 类似,第一个参数也是一个类型而不是一个值,跟 new 不同的是,make 返回类型的引用而不是指针,而返回值也依赖于具体传入的类型 make()函数在golang的代码如下: func make(t Type,size IntegerType) Type 使用make来创建slice,map,chanel说明如下: slice: var slice_ []int = make([]int,5,10) fmt.Println(slice_) var slice_1 []int = make([]int,5) fmt.Println(slice_1) var s...阅读全文

博文 2015-03-26 23:34 happinessaflower

golang 内置函数new() 和struct{} 初始化的区别

new() 这是一个用来分配内存的内置函数,它的第一个参数是一个类型,不是一个值,它的返回值是一个指向新分配的 t 类型的零值的指针。 在golang的代码定义如下: func new(t Type) *Type strut{} 直接使用struct{} 来初始化strut时,返回的是一个struct类型的值,而不是指针两者是不一样的 两者对比代码如下: type Student struct{ id int name string } func main(){ var s_1 *Student = new(Student) s_1.id = 100 s_1.name = "cat" var s_2 Student = Student{id:1,name:"tom"} fmt.Println...阅读全文

博文 2015-03-26 22:45 happinessaflower

go内存管理和垃圾收集简介

go语言的内存分两部分,一部分用作堆,供内存分配用,另一部分是bitmap,用来管理堆。两部分从同一地址开始,向高地址方向增长的是内存池,向低地址方向增长的是bitmap。 ##内存分配## 对于较大的内存申请,直接从堆上申请,释放时也直接返回给堆。 而当一个go routine申请小于32k字节的内存,则从go routine私有的内存池中分配内存。因为是私有的,所有在多数情况下,分配内存不需要上锁。如果私有内存池没有内存了,则需要向中心内存池申请内存,中心内存池是共享数据,此时需要上锁。如果中心内存池也没有内存了,则从堆里申请内存。 私有内存池和中心内存池里的内存都是按照大小分开管理的,这样,分配和释放内存都非常快,而且也不容易产生碎片。通常,中心内存池从堆上申请...阅读全文

如何优雅地等待所有的goroutine退出

Table of Contents 1. 通过Channel传递退出信号 2. 使用waitgroup goroutine和channel是Go语言非常棒的特色,它们提供了一种非常轻便易用的并发能力。但是当您的应用进程中有很多goroutine的时候,如何在主流程中等待所有的goroutine 退出呢? 1 通过Channel传递退出信号 Go的一大设计哲学就是:通过Channel共享数据,而不是通过共享内存共享数据。主流程可以通过channel向任何goroutine发送停止信号,就像下面这样: func run(done chan int) { for { select { case <-done: fmt.Println("exiting...") done <- 1 break de...阅读全文

Go语言 传值和传指针性能对比

载自达达的博客 以往的C编程经验告诉我们,指针传参会有更好的性能,在Go语言中,这条经验也是通用的。但是需要留意两个问题: 指针传参会导致参数的操作领域不确定,到底函数内部会不会改变传入的对象呢?Go语言中没有类型C那样的const关键字,所以无法控制。Go语言是有GC的,并且这个GC还不是很完善,受对象数量影响较大,传递指针意味着可能多创建不必要的对象,到底指针传参带来的性能提升能不能抵消创建对象产生的GC压力呢?这是一个不好观察到的数据。(原作者达达这里应该是有错误的,首先传值也是复制,要产生一个新对象,分配内存地址传到新的函数中,其次指针一般来说64个字节,复制的代价远小大中型数据传值,因此在都产生一个新对象的情况下,指针还是远优先于传大中型的值结构) 下面是性能消耗的测试代码: pa...阅读全文

博文 2014-04-20 21:11 abv123456789

为什么我要选择erlang+go进行服务器架构

服务器非业余研究http://blog.csdn.net/erlib 作者Sunface 估计很多同学看到这里都会觉得迷惑,go的大名已经如雷贯耳了,但是erlang?这个东东是神马?难道是编程语言?怎么从来没听说过。 这里请允许我先介绍一下使用Erlang开发的比较有名的应用: 一:whatsapp 只凭32个技术人员,如何应付4.5亿的用户?对于刚刚被Facebook用190亿美元收购的WhatsApp来说,答案是Erlang——一种诞生于上世纪80年代的编程语言,终于在此时走到了聚光灯下。 这个应用把erlang的特性发挥到了极致,利用到了它最好的vm、 集群基础设施、数据库mnesia, 消除了非常多的数据Scale、内存池和锁的问题, 提到的技术和修正点非常值得我们参考。 虽然大部...阅读全文

博文 2015-02-23 22:24 robslove

c,golang 条件变量的使用对比

看到golang 标准库 sync package 提供了传统的mutex, once, cond, rwmutex 等基于共享内存的同步原语,就想写个代码实验一下。 type Cond struct { // L is held while observing or changing the condition L Locker // contains filtered or unexported fields } Cond 结构包含一个可导出的Locker 对象 func NewCond(l Locker) *Cond NewCond 函数 接受一个实现Locker 接口的对象, 返回一个指向Cond 的指针; pthread_cond_t 对应于此 func (c *Cond) Bro...阅读全文

博文 2015-01-15 13:24 yujian0231

Go Runtime hashmap实现

前两天有小伙伴问道是否看过 Go 语言 map 的实现,当时还真没看过,于是就花了一点时间看了一遍 runtime 源码中的 hashmap 实现。map 的底层实现就是一个 hash 表,大体结构上和平时在脑海里的 hash 表差不多,但确实有很多细节(“Devils in the details”)。 hashmap 通过一个 bucket 数组实现,所有元素将被 hash 到数组中的 bucket 中,bucket 填满后,将通过一个 overflow 指针来扩展一个 bucket 出来形成链表,也就是解决冲突问题。这也就是一个基本的 hash 表结构,没什么新奇的东西,下面总结一些细节吧。 注意一个 bucket 并不是只能存储一个 key/value 对,而是可以存储8个 key/...阅读全文

golang 基于beego web框架写的 web页面自由配置nginx虚拟主机

nginxconf web页面自由配置nginx虚拟主机 该项目基于golang的 beego web框架 主要实现了一下功能 创建新的nginx代理配置文件 并自动调用 nginx reload 命令 暂时没有实现删除配置文件命令 应用场景 nginx需要实现代理访问多个主机,操作人员无需懂得nginx配置只需要在web页面点击下鼠标即可 多个 golang 应用程序在服务器后台运行在非80端口,nginx更具不同的域名代理访问不同的golang应用程序 改造后可以做什么? 增加设置多个nginx配置模板,可以实现负载均衡、自动配置虚拟主机等高级的nginx的功能 nginx配置模板为nginxconf/template/domainlocalconf.tpl 该项目使用帮助 由于我在wi...阅读全文

博文 2015-03-20 19:48 young-轻人

channel in Go's runtime

Go语言有一个非常大的亮点就是支持语言级别的并发。语言级别提供并发编程,究竟有多重要,可能需要你亲自去体会多线程、事件+callback等常见的并发并发编程模型后才能准确的感受到。为了配合语言级别的并发支持,channel组件就是Go语言必不可少的了。官方提倡的一个编程信条——“使用通信去共享内存,而不是共享内存去通信”,这里说的”通信去共享内存”的手段就是channel。 channel的实现位于runtime/chan.c文件中。 channel底层结构模型 每个channel都是由一个Hchan结构定义的,这个结构中有两个非常关键的字段就是recvq和sendq。recvq和sendq是两个等待队列,这个两个队列里分别保存的是等待在channel上进行读操作的goroutine和等待在...阅读全文

[翻译]飞翔的 gob

这个题目的原文叫做《Gobs on the wire》,作者巧妙的用了“gob”这个词。gob本来是Golang的一个关于网络通信协议的包。而在这里,我感觉标题也可以翻译为《关于线上的那一大陀……》。好吧,我得承认,这么翻译实在不雅。 ————翻译分割线———— 飞翔的 gob 这周,我想跟大家谈谈如何用 Go 编写基于同步请求和异步事件通知的 Client/Server 系统。 为了帮助学习 Go,我克隆了一个Conserver 命令行服务。当然,现在对于世界来说没必要有另外一个命令行服务。然而由于Go语言带给开发者的特性,非常适合用来做命令行服务,所以这将会是一次非常有趣的体验。命令行服务的任务是从一个或者多个串口上汇总输出(或者说各种系统上的一个或者多个实现了使用TCP连接的Rteln...阅读全文

简约语言:golang; CSP式的并发模型

用python开发也有几年了,很喜欢它的简洁。最近在看golang,感觉和python很像,语法简洁,标准类型相识,标准库也是一样的丰富。引用一段文字(http://blog.csdn.net/myan/article/details/2028545): 所谓”魔幻语言“,主要代表作品有C++、Perl、Javascript和Ruby。这些语言拥有丰富的特性,聪明的技 巧和意想不到的奇效,永远有发掘不完的奇技淫巧,总能找到让人匪夷所思的”yet another way"。反过来,“简约语言”崇尚清晰直接,够用就行,要求从代码容易理解,宁可笨一点、累一点、多写一点代码,反对出人意料的技巧,反对故弄玄虚。 C、PHP、Python和Lua这一派语言的代表作。 看来golang也是“简约语言”。 ...阅读全文

Go语言数据结构

当向一个新程序员解释Go语言时,我发现如果解释Go的数据是如何在内存中表示的,将有助于建立编写高效程序的良好直觉。 转载地址:http://www.open-open.com/lib/view/open1390373069882.html 基础类型 让我们从一些简单的例子开始: 变量i是int类型,在内存中占用一个32位的存储单位。(上图拿32位系统来举例;对以上的例子,只有指针才会在64位的机器上占用更多的空间——int始终是32位——然而我们仍然可以选择64位的系统。) 变量j是int32类型,因为它经过了显式的类型转化。尽管i和j有着同样的内存布局,但它们的类型是不一样的:像这样的赋值i = j会产生类型异常,必须通过显式的类型转换:i = int(j) 。 变量f是个浮点类型,上例中...阅读全文

博文 2015-04-04 10:40 Decadent_2014

Go语言是如何处理栈的

Go语言是如何处理栈的 十一 05 bigwhite技术志 cloudflare, Go, Golang, Google, goroutine, heap, Memory, OS, runtime, Stack, Thread, vitualmemory, 垃圾回收, 栈, 线程, 虚拟内存, 运行时 No Comments Go 1.4Beta1刚刚发布,在Go 1.4Beta1中,Go语言的stack处理方式由之前的"segmented stacks"改为了"continuous stacks"。关于Go语言对stack的处理机制、发展历史、存在问题等,CloudFlare的一篇官方blog进行了系统的阐述,这里的内容就是 翻译自CloudFlare的那篇blog:《How Stacks...阅读全文

Go 语言指针

Go 语言指针Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务。接下来让我们来一步步学习 Go 语言指针。我们都知道,变量是一种使用方便的占位符,用于引用计算机内存地址。Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。以下实例演示了变量在内存中地址:package main import "fmt" func main() { var a int = 10 fmt.Printf("变量的地址: %x\n", &a ) }执行以上代码输出结果为:变量的地址: 20818a220现在我们已经了解了什么是内存地址和如何去反问它。接下来我们将具体介绍指针。什么是指针一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址。类似于变量和常量,...阅读全文

博文 2015-11-29 16:45 u011225629

Go和C如何共享内存资源

Go语言作为一个现代化的编程语言以及支持垃圾内存的自动回收特性(GC). 我们现在关注的是C语言返回的内存资源的自动回收技术. CGO初步 Go语言的cgo技术允许在Go代码中方便的使用C语言代码. 基本的用法如下: package rand /* #include */ import "C" func Random() int { return int(C.random()) } func Seed(i int) { C.srandom(C.uint(i)) } 其中"C"是导入一个虚拟的包, 用于引用C语言的符号. Go语言和C语言通讯交互主要是通过传递参数和返回值. 其中参数和返回值除了基本的 数据类型外, 最重要的是如何相互传递/共享二进制的内存块. Go向C语...阅读全文

golang协程——通道channel阻塞

新的一年开始了,不管今天以前发生了什么,向前看,就够了。 说到channel,就一定要说一说线程了。任何实际项目,无论大小,并发是必然存在的。并发的存在,就涉及到线程通信。在当下的开发语言中,线程通讯主要有两种,共享内存与消息传递。共享内存一定都很熟悉,通过共同操作同一对象,实现线程间通讯。消息传递即通过类似聊天的方式。golang对并发的处理采用了协程的技术。golang的goroutine就是协程的实现。协程的概念很早就有,简单的理解为轻量级线程,goroutine就是为了解决并发任务间的通信而设计的。golang解决通信的理念是:不要通过共享内存来通信,而应该通过通信来共享内存。golang解决方案是消息传递机制,消息的传递就是通过channel来实现的。 channel的使用很简单,...阅读全文

博文 2016-02-15 16:39 xiaofengshuyu

Golang 1.3 sync.Atomic源码解析

上一篇文章我们说到sync.Mutex的源码实现,核心就是使用到了CPU指令CAS,从并发性能上来说atomic的效率是要高于mutex的,毕竟mutex做了不少的其他步骤,而atomic的核心其实就是和处理器密切关系的,通过一两个指令就能完成的原子操作,我们接下来来看看atomic在golang中的一些细节。 通过目录: 64bit_arm.go asm_amd64p32.s asm_linux_arm.s atomic_test.go race.go asm_386.s asm_arm.s asm_netbsd_arm.s doc.go asm_amd64.s asm_freebsd_arm.s atomic_linux_arm_test.go export_linux_arm_test...阅读全文

博文 2014年10月19日 毛, 剑

Go语言的优点(oschina讨论)

Go语言的优点:并发/网络/性能/工具(fmt/pprof/test)/标准库(http/json/log/flags/atomic)/GoogleGo语言垃圾回收器真正致命的缺陷是,会导致整个进程不可预知的间歇性停顿。像某些大型后台服务程序,如游戏服务器、APP容器等,由于占用内存巨大,其内存对象数量极多,GC完成一次回收周期,可能需要数秒甚至更长时间,这段时间内,整个服务进程是阻塞的、停顿的,在外界看来就是服务中断、无响应,再牛逼的并发机制到了这里统统失效。垃圾回收器定期启动,每次启动就导致短暂的服务中断,这样下去,还有人敢用吗?这可是后台服务器进程,是Go语言的重点应用领域。更多缺点: http://blog.csdn.net/liigo/article/details/2369945...阅读全文

博文 2015-01-15 05:59 findumars

Go语言slice的那些坑

Go语言Google开发的适用于多核编程的语言。我感觉它像是C语言的现代版本,简单,并发支持友好,部署轻松。GO语言中保留关键字就只有25个,这也足以说明它的学习成本并不高。 然而,Go语言里面slice这个东西并不简单。初学者容易掉入坑中。此文件就试图把slice给讲解清楚。 下面先讲一下slice的一些基本特性。 1. slice内部有三个变量,分别是:ptr, len, cap ptr是用来存储数据的数组 cap是ptr数组的长度 len是实际数组的长度 2. 如何在初始化的时候,指定slice的长度? a := make([]int, 10) 这里make的时候,第2个参数,就是这个slice的长度。 这个时候它的capacity是多少呢? fmt.Println(cap(a)) 这...阅读全文

博文 2015-12-03 10:44 zhanchenxing

初识golang之函数

声明: func funcName(input1 type1, intput2 type2) (output1 type1, output2 type2) { ……………… //可以有多个返回值 return val1, val2 } 说明:golang中通过func来声明一个函数,函数可以有一个或者多个参数,每个参数后面带类型,通过,分隔;函数可以返回多个值,返回的个数要于声明时定义的返回个数相同,声明时可以不写返回的变量名,而直接使用类型(如果只有一个返回值且不声明返回值变量,那么可以省略返回值的括号,如果没有返回值,那么就直接省略最后的返回信息定义) 例: func SumAndProduct(a, b int) (int, int) { return a+b, a*b } func ...阅读全文

Go语言学习笔记(四) [array、slice、map]

日期:2014年7月22日 一、array[数组] 1、定义:array 由 [n] 定义,n 标示 array 的长度,而 标示希望存储的内容的类型。 例如: var arr[10] int arr[0] = 1 arr[1] = 2 数组值类型的:将一个数组赋值给 另一个数组,会复制所有的元素。另外,当向函数内传递一个数组的时候,它将获得一个数组的副本,而不是数组的指针。 2、数组的复合声明。a :=[3]int{1,2,3}或简写为a:=[...]int{1,2,3}(Go会自动统计元素个数) 3、多维数组 例如:a := [2][2]int{ [2]int{1,2}, [2]int{3,4} } 等价于a := [2][2]int{ [...]int{1,2...阅读全文

博文 2014-07-23 14:20 whxaing2011

[golang note] 协程通信

channel基本语法 • channel介绍 √ golang社区口号:不要通过共享内存来通信,而应该通过通信来共享内存。 √ golang提供一种基于消息机制而非共享内存的通信模型。消息机制认为每个并发单元都是自包含的独立个体,并且拥有自己的变量,但在不同并发单元间这些变量不共享。每个并发单元的输入和输出只有一种,那就是消息。 √ channel是golang在语言级提供的goroutine间的通信方式,可以使用channel在两个或多个goroutine之间传递消息。 √ channel是进程内的通信方式,如果需要跨进程通信,建议使用分布式的方法来解决,比如使用Socket或HTTP等通信协议。 √ channel是类型相关的,即一个channel只能传递一种类型的值,需要在声明cha...阅读全文

博文 2016-03-15 18:02 heartchord

go中string和slice no-copy转换

在go里面,string和slice的互换是需要进行内存拷贝的,虽然在底层,它们都只是用 pointer + len来表示的一段内存。 通常,我们不会在意string和slice的转换带来的内存拷贝性能问题,但是总有些地方需要关注的,刚好在看vitess代码的时候,发现了一种很hack的做法,string和slice的转换只需要拷贝底层的指针,而不是内存拷贝。当然这样做的风险各位就要好好担当了: func String(b []byte) (s string) { pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b)) pstring := (*reflect.StringHeader)(unsafe.Pointer(&s)) pstring...阅读全文

博文 2014-04-12 17:10 siddontang

Go的变量到底在堆还是栈中分配

Go的变量到底在堆还是栈中分配 2015-10-22 最近试着优化掉一些小对象分配,发现一个很诡异的问题:这段代码会在堆上分配对象! package main import ( "fmt" ) func main() { var a [1]int c := a[:] fmt.Println(c) } 看汇编代码 go tool compile -S test.golang "".main t=1 size=336 value=0 args=0x0 locals=0x98 0x0000 00000 (test.go:7) TEXT "".main(SB), $152-0 0x0000 00000 (test.go:7) MOVQ (TLS), CX 0x0009 00009 (test.go:...阅读全文

关于golang中的引用类型(reference type)

map,指针(pointers),还有slice,按照我的理解,这样的一个变量,存的就是个内存地址,而这样的一个声明 var a map[int]string var p *int var arr []string 在没有初始化之前都是nil,对这样的一个变量进行写(write)操作,都会抛出一个运行异常(a runtime panic),当然,append操作是可以的,或者用在声明的同时用make初始化一下也可以。 现在需要去验证的是,初始化的map或者slice是有一定默认空间的(尤其是map),如果不用append,直接a[x]=n来增加值,会不会越界抛出异常。。...阅读全文

博文 2016-06-13 11:49 hificamera

golang之runtime.SetFinaliz

在实际的编程中,我们都希望每个对象释放时执行一个方法,在该方法内执行一些计数、释放或特定的要求,以往都是在对象指针置nil前调用一个特定的方法,golang提供了runtime.SetFinalizer函数,当GC准备释放对象时,会回调该函数指定的方法,非常方便和有效。 参考: Go 语言中手动内存管理 go语言之初始化的构造函数 Go和C如何共享内存资...阅读全文

Go 语言的并发模型--通过通信来共享内存

载:http://se77en.cc/2014/04/08/share-by-communicating-the-concurrency-slogan-in-golang/ 概述 我一直在找一种好的方法来解释 go 语言的并发模型: 不要通过共享内存来通信,相反,应该通过通信来共享内存 但是没有发现一个好的解释来满足我下面的需求: 通过一个例子来说明最初的问题提供一个共享内存的解决方案提供一个通过通信的解决方案 这篇文章我就从这三个方面来做出解释。 读过这篇文章后你应该会了解通过通信来共享内存的模型,以及它和通过共享内存来通信的区别,你还将看到如何分别通过这两种模型来解决访问和修改共享资源的问题。 前提 设想一下我们要访问一个银行账号: 123456789101112131415161718...阅读全文

博文 2015-02-05 17:31 yugongpeng_blog

修改golang最大内存限制

摘自golang nut You can tune the MHeapMap_Bits in malloc.h and arena_size in malloc.goc to reduce memory usage, as long as they statisfy this: (1UL << (12 + MHeapMap_Bits)) >= arena_size (for example, I changed MHeapMap_Bits to 20, and arena_size to ”4LL<<30“, all tests passed, and the size of bss sections is dropped to about 10MB for bin/go: linux-am...阅读全文

博文 2016-04-06 16:05 sorawa

golang 数组切片(一)

Array与Slice 1、array 静态数组 [len]type,数组类型包括数组长度与元素的数据类型,数据类型完全相同后才可赋值 声明 var array [5]byte //声明时自动将默认初始化为各自类型对应的零值 声明初始化 array := [5]byte{1,2,3,4,5} //长度为5的字节数组 声明初始化 array := […]byte{1,2,3,4,5}//go编译器将根据元素推导出长度 5 2、Slice 动态数组 slice 是对底层数组的抽象和控制。它包含 Go 需要对底层数组管理的三种元数据,分别是: 指向底层数组的指针 slice 中元素的长度 slice 的容量(可供增长的最大值) 声明: //A、创建一个nil slice;slice==nil va...阅读全文

关于常驻内存RES,pprof,heap,threadcreate的疑问

小弟写了个简单后台用来接收POST请求上传过来的文件,并保存到后台本地。在做测试的时候,每一次请求上传5个文件,5个文件大小总和大概在300-400k的范围,测试的时候模拟客户端并发1000个POST上传文件。后台处理完1000请求后 RES直接上到500MB,查看/debug/pprof/下的threadcreate也直接上到400多个,再并发第二次,第三次... 1000个POST请求,RES在600多MB就不再涨了,threadcreate涨到570以后,增长速度就放缓了,此后七八分钟不再有请求发送RES慢慢再回降到100MB左右,但是threadcreate一直没有降过。上个图吧 ##1.服务开启: ####RES: +![开启服务.jpg](http://studygolan...阅读全文

记录一个在线的虚拟机开发环境(go、ruby、python、java...)

https://www.nitrous.io/ 需要注册,开发环境是一个类linux虚拟机,虽然创建虚拟机时需要选择语言,但我测试了,go语言下的虚拟机,其实同时也支持了c/c++、java、python、ruby 可以和 http://ideone.com/ 对比一下,支持语言没有那么多,但是开发限制少了很多,完全可以上传自己的IDE和调试工具。 事实上,这个环境可以基本支持一个博客或者网站了;当然,和购买的空间不一样,这个不能老是开着...阅读全文

博文 2013-09-06 20:08 刘地

go语言学习笔记之并发编程

编译自http://golang.org/doc/effective_go.html#concurrency (翻译错误之处,敬请指正) 1. 通过通讯共享内存(Share by communicating): Do not communicate by sharing memory; instead, share memory by communicating. 不要通过内存共享进行通讯;应当通过通讯来共享内存。使用信道(channels)来控制变量的访问可以更为容易地编写出清晰、正确的程序。 2. Goroutines: 为什么创造goroutine这个新词? 原因就是现有的术语,比如线程、协程、进程等等都不能精确的表达其所要表达的内涵(译者在这里也建议不要将其翻译成中文,因为中文里也没...阅读全文

博文 2010-05-31 14:57 agateriver

golang里channel的实现原理

channel是消息传递的机制,用于多线程环境下lock free synchronization. 它同时具备2个特性: 1. 消息传递 2. 同步 golang里的channel的性能,可以参考前一篇:http://blog.sina.com.cn/s/blog_630c58cb01016xur.html 此外,自带的runtime package里已经提供了benchmark代码,可以运行下面的命令查看其性能: go test -v -test.bench=".*" runtime 在我的pc上的结果是: BenchmarkChanUncontended 50000000 67.3 ns/op BenchmarkChanContended 50000000 67.7 ns/op Ben...阅读全文

Go初探

官方网站:https://golang.org/ 标准库文档:https://golang.org/pkg/ 在线编码学习:https://play.golang.org/ PS:请自行FQ 简介安装Hello World 实例编译基础语法行分隔符注释标识符关键字数据类型指针类型(Pointer)数组(Array)结构化类型(struct)接口类型(interface)Map 类型Any类型类型转换类型增加方法变量作用域值类型和引用类型常量iota运算符运算符优先级条件与循环语句函数返回多个值参数匿名函数与闭包范围(Range)递归查询接口查询类型查询错误处理面向对象成员的可访问性封装继承多态goroutine和channel同步消息传递多个channel参考 简介 (大家好,我是go吉祥物...阅读全文

博文 2016-03-17 00:38 leestar54

Golang slice 切片原理

golang 中的 slice 非常强大,让数组操作非常方便高效。在开发中不定长度表示的数组全部都是 slice 。但是很多同学对 slice 的模糊认识,造成认为golang中的数组是引用类型,结果就是在实际开发中碰到很多坑,以至于出现一些莫名奇妙的问题,数组中的数据丢失了。 下面我们就开始详细理解下 slice ,理解后会对开发出高效的程序非常有帮助。 这个是 slice 的数据结构,它很简单,一个指向真实 array 地址的指针 ptr ,slice 的长度 len 和容量 cap 。 其中 len 和 cap 就是我们在调用 len(slice) 和 cap(slice) 返回的值。 我们来按照 slice 的数据结构定义来解析出 ptr, len, cap // 按照上图定义的数据...阅读全文

30分钟上手GO语言--并发

并发 这一部分概览了 goroutein 和 channel,以及如何使用它们来实现不同的并发模式。 Gorutine:goroutine 是由 Go 运行时环境管理的轻量级线程。 go f(x, y, z) 开启一个新的 goroutine 执行 f , x , y 和 z 是当前 goroutine 中定义的,但是在新的 goroutine 中运行 `f`。goroutine 在相同的地址空间中运行,因此访问共享内存必须进行同步。sync 提供了这种可能,不过在 Go 中并不经常用到(用的是channel)。 package main import ( "fmt" "time" ) func say(s string) { for i := 0; ...阅读全文

go语言中var

go语言中定义变量使用关键字var,如:var x int=4 也可以写成x:=4; 在函数中,:= 简洁赋值语句在明确类型的地方,可以用于替代 var 定义。 (:= 结构不能使用在函数外,函数外的每个语法块都必须以关键字开始。) package main import ( "fmt" ) func main() { var x int = 4 fmt.Println(x)//输出4 fmt.Println(&x)//输出指针 //fmt.Println(*x) //错误 y := 4 fmt.Println(y)//输出4 fmt.Println(&y)//输出指针 //fmt.Println(*y) //错误 var v *int = new(int)//返回值为指针 fmt.Prin...阅读全文

ActivedRouter--golang实现的反向代理、监控

基于golang 实现了简单的http反向代理服务器,监控服务器,客户端程序 ,和一个基于web的监控页面。 通过ActivedRouter 可实现自动摘除宕机服务器,的真机负载。也可以实现IP轮训负载。项目地址: github简单介绍一、通过ActivedRouter可以实现什么功能?1、可以集群服务器的监控,通过提供的web Dashboard可以时刻监控每一台服务器的负载、内存、网络、 磁盘等信息。 2、反向代理服务器功能,例如Nginx的功能,可以针对不同的域名对不同的业务服务器集群进行反向代理。 3、Server & Client 模式组合下,可以用作服务器监控使用,并且可以设置监控报警,Server端可以选择性 开启监控Dashboard,用于直观的web界面监控。 4、服务器监...阅读全文

博文 2016-07-11 14:37 yue7603835

[Go] --- 指针和内存分配

Email : hahayacoder@gmail.com 1 Go语言中的指针和C语言中在使用上几乎没有什么差别,熟悉C语言应该很容易掌握,下面是Go语言中使用指针的代码 package main import "fmt" func main() { var value int = 1 //指向int型的指针 var pInt *int = &value //打印相关信息 fmt.Printf("value = %d \n pInt = %d \n *pInt = %d \n", value, pInt, *pInt) //通过指针修改指针指向的值 *pInt = 222 fmt.Printf("value = %d \n pInt = %d \n *pInt = %d \n", valu...阅读全文

博文 2013-04-03 22:17 qiurisuixiang

关于go语言的闭包

package main import ( "fmt" ) func main() { var fs = [4]func(){} for i := 0; i < 4; i++ { defer fmt.Println("defer i = ", i) defer func() { fmt.Println("defer_closure i = ", i) }() fs[i] = func() { fmt.Println("closure i = ", i) } } for _, f := range fs { f() } } 这两天有时间学习了一下go语言。挺有趣的。 上面这段代码是关于closure和defer的用法。 go语言支持闭包,如果你在闭包函数中使用了上层函数的变量,那么这个变量的一...阅读全文

博文 2014-12-21 15:00:00 freshunter