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

Go中实现手动内存分配的坑

Go中实现手动内存分配的坑 2016-07-10 你一定想到过,分配一块大的内存,然后从里面切小的对象出来,手动管理对象分配。分配的开销非常小,就是offset加一下。尤其是有些场景,释放时直接把offset重置,就可以重用这块空间了。实现手动内存分配的好处是,减少小对象数目,从而减少垃圾回收时的扫描开销,降低延迟和提升整个性能。 想到不代表做过,做过会踩坑,这篇文章会把你可能要踩的坑都说一遍。不过先说结论:别这么干,不作死就不会死! TL;DR 扩容 开始很容易想用make([]byte)分配空间,如果大小不够时,还可以进行扩容。这是第一个陷阱。 不要append,别让它扩容。一旦发生扩容,会分配一块新的空间,而旧的slice将不再有任何变量引用它,于是会被垃圾回收掉。等等!之前分配的对象...阅读全文

Go 语言的内存管理

这篇博客是我在维尔纽斯的 [Go Meetup](https://www.meetup.com/Vilnius-Golang/events/249897910/) 演讲的总结。如果你在维尔纽斯并且喜欢 Go 语言,欢迎加入我们并考虑作演讲 在这篇博文中我们将要探索 Go 语言的内存管理,首先让我们来思考以下的这个小程序: ```go func main() { http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path)) }) http.ListenAndServe(":8080", nil) }...阅读全文

博文 2018-09-20 22:25:03 polaris

什么是协程(goroutine),它们是怎样工作的呢?

![image](https://raw.githubusercontent.com/studygolang/gctt-images/master/What-are-goroutines-And-how-do-they-actually-work/pic1.jpeg) 在过去的几年里,Go 语言能获得如此难以置信的流行度的一个主要原因,是 Go 能通过轻量级的 Goroutines 和 channel 更加简便地处理并发问题。 并发并不是什么新鲜事物,它一直以多线程的形式存在于我们几乎每天都要使用的应用程序之中。 不过,在实际理解什么是 Goroutine,什么不是之前,我们需要知道 Goroutine 并不是轻量级线程(尽管 Goroutine 依赖于线程运行),稍后我们将深入研究真正的线...阅读全文

Golang引用类型

引用类型包含 slice、map、channel 内置函数:new 为其分配零值内存 并返回指针 make 为其分配内存初始化结构 并返回对象 package main import ( "fmt" ) func main() { a := make([]int, 3) a[1] = 10 b := new([]int) b[1] = 20 //error : invalid operation: b[1] (type *[]int does not support indexing) ...阅读全文

博文 2016-09-12 12:00:34 lt695981642

Golang热更新原理

Linux进程间通信方式首先,进程之间为什么要进行通信呢?主要有以下应用场景:数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。其次,进程之间通信有哪些手段呢?管道( pipe )管道包括三种:普通管道PIPE: 通常有两种限制,一是单工,只...阅读全文

博文 2020-05-27 19:32:51 贺大伟

Go语言中的指针和new(T)函数的使用

Go中指针的特点:1)指针是一个代表着某个内存地址的值。2)这个内存地址往往是在内存中存储的另一个变量的值的起始位置。3)Go语言对指针的支持介于Java语言和C/C++语言之间,它既没有想Java语言那样取消了代码对指针的直接操作的能力,也避免了C/C++语言中由于对指针的滥用而造成的安全和可靠性问题。Go中指针的基本操作: Go语言虽然保留了指针,但与其它编程语言不同的是:l 默认值 nil,没有 NULL 常量l 操作符 "&" 取变量地址, "*" 通过指针访问目标对象l 不支持指针运算,不支持 "->" 运算符,直接⽤ "." 访问目标成员new函数表达式new(T)将创建一个T类型的匿名变量,所做的是为T类型的新值分配并清零一块内存空间,然后将这块内存空间的地址作为结果返回,而这...阅读全文

博文 2018-10-04 15:35:10 ck_god

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语...阅读全文

博文 2015-05-18 12:37:48 chai2010

GO语言内存拷贝

package main import "fmt" func main() { slice1 := []byte{1, 2, 3, 4, 5} slice2 := []byte{5, 4, 3} copy(slice2, slice1) // 只会复制slice1的前3个元素到slice2中 fmt.Printf("%x\n",slice1) fmt.Printf("%x\n",slice2) copy(slice1, slice2) // 只会复制slice2的3个元素到slice1的前3个位置 fmt.Printf("%x\n",slice1) fmt.Printf("%x\n",slice2) var md5code [16]byte arybyte := md5code[0:16] ...阅读全文

博文 2016-09-19 09:00:22 henry3695

[翻译]飞翔的 gob

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

博文 2014-10-09 16:15:25 mikespook

关于go中map的内存释放

示例代码: go version: 1.12.9 package main import ( "log" "runtime" ) var intMap map[int]int var cnt = 8192 func main() { printMemStats() initMap() runtime.GC() printMemStats() log.Println(len(intMap)) for i := 0; i < cnt; i++ { delete(intMap, i) } log.Println(len(intMap)) runtime.GC() printMemStats() intMap = nil runtime.GC() printMemStats() } func ini...阅读全文

go语言将表数据动态转成切片(字段任意拓展)

package main import ( "log" "fmt" "database/sql" _ "github.com/go-sql-driver/mysql" ) //先把字段的值都当成字符串 func Rows2SliceMap(rows *sql.Rows) (list []map[string]string) { //字段名称 columns, _ := rows.Columns() //多少个字段 length := len(columns) //每一行字段的值 values := make([]sql.RawBytes, length) //保存的是values的内存地址 pointer := make([]interface{}, length) // for i := ...阅读全文

博文 2018-11-25 12:34:39 xxfaxy

现如今为什么大多数游戏服务端还是用C++来写?

其实现在游戏服务端基本上都是多语言组合开发的,C++已经不再是唯一选择,Java、Python、Golang、Erlang、C#以及各种脚本语言都会涉及。但是为什么现如今大多数游戏服务端还是用C++来写呢?我认为一个项目在做技术选型时把C++作为游戏服务端的主要开发语言主要基于以下原因:十多年前,技术栈,包含编程语言的选择还不是很多。C++是当时看来少数,被证明稳定,可靠,高性能,具备丰富功能的高级语言。所以理所当然被选择作为开发主力。基于此,进程框架,诸如线程模型,定时器,容器等;IPC,比如socket,共享内存,并由共享内存进一步衍生出的数据恢复技术等都蓬勃发展。而且大厂之前都有封闭的思想,这和现在开源流行完全不同。生怕别人知道自己的技术优势,也非常不信任社区产品的质量。结果就是——造...阅读全文

博文 2019-02-12 19:34:42 千_锋小小千

golang中的数组

1,数组的特性 数组是线性表结构,从而内存空间是连续的且有着相同类型的数据。 正是由于是线性结构的特性才支持随机访问,时间复杂度为o(1)。 通过公式a[i]_address = base_address + i * data_type_size计算得到数组元素地址。 但是其插入、删除操作比较低效,因为会涉及到数据的迁移问题。以上就是数组的基本特性,下面我们看一下golang中数组相关知识。 2,声明及初始化 2.1,直接声明不显示初始化 var arr []type 数组声明之后编译器会做初始化操作,用数组值类型的零值进行初始化。 2.2,用一组值初始化数组 var arr [3]type = []type{1, 2, 3} 2.3,在数组字面值中,如果在数组的长度位置出现的是“...”省...阅读全文

博文 2019-06-26 00:32:45 XITEHIP

升级到Catalina后,golang执行问题

升级到Catalina 10.15后,golang编译完成后,执行二进制文件报错: dyld: malformed mach-o image: segment __DWARF has vmsize < filesize 下边我们简单的说一下 Mach-O 文件。 Mach-O 我们知道,进程是可执行文件在内存中加载得到的结果,而 Mach-O 就是一种 macOS 平台的可执行文件格式。 Mach-O 文件分为三个区域 Header、Load commands、Data。其中 Load commands 区的指令指导如何设置并加载二进制数据。 LC_SEGMENT 对应的数据结构:segment_command 定义了这个文件中的一个 segment,在 Mach-O 文件被加载到时,这个 ...阅读全文

博文 2019-10-10 16:33:06 aside section ._1OhGeD

go语言学习之路五:Go语言内存分配机制make&new

Go有两种分配内存的机制,规则很简单,下面来简单介绍一下。1、new函数New()函数可以给一个值类型的数据分配内存(不知道什么是值类型请前往切片那一部分),调用成功后返回一个初始化的内存块指针,同时该类型被初始化为0值,原型定义:func new(Type) * Typenew是一个分配内存的内置函数,但是不同于其他语言中new所做的工作,它只是将内存清零,而不是初始化内存。2、make函数Make()函数用于给引用类型分配内存空间,比如:slice,map,channal等,这里需要注意的一点是make()创建的是一个引用类型的对象,而不是一个内存空间的指针。Make()函数原型:func make(Type,size IntegerType)Type参数Type必须是一个引用类型(sl...阅读全文

channel in Go's runtime

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

golang 基础(10)函数返回值

square-gopher.png 返回值 在 go 语言中函数支持多个返回值 func div(a, b int) (int, int){ return a /b , a %b } 我们也可以给函数返回值打上标签 q, r func div(a, b int) (q,r int){ return a /b , a %b } 我们可以用两个变量来接受函数返回值 a, b := div(17,3) 如果我们只想使用一个返回值,也就是 a 而不使用 b,向下面这样做会在编译时报错,go 语言是比较严格语言 a, b := div(17,3) fmt.Println(a) 应该修改为,通过 _ 占位符来忽略掉不使用的变量 a, _ := div(17,3) fmt.Println(a) 到现在为止...阅读全文

[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...阅读全文

博文 2014-10-10 12:00:01 qiurisuixiang

关于常驻内存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...阅读全文

(二)GoLang小记 —— 变量的定义与初始化

GoLang定义变量的方式多种多样,主流的包含以下几种方式: 普通变量: 1、 不指定变量类型的构造函数定义(其实就是强制类型转换) /* 直接用某个类型的"构造函数"进行赋值,这种赋值方式在C++中比较常见 构造函数打上引号是因为:"在GoLang中实际是没有构造函数的,但是把它理解成构造函数便于大家理解" */ var val = uint64(1) val := uint64(1) 2、不指定关键词的推导定义(作用域不同,且无法在全局区定义) /*关键字也不写!完全交给编译器判断*/ str := "admin" 3、 指定关键词的推导定义(作用域不同,可以在全局区定义) /*只指定关键字的初始化*/ var str := "admin" 指针变量定义: 指针变量定义在C家族中的定义与...阅读全文

博文 2016-10-19 11:00:15 水果糖

golang 表达式

表达式 1. 关键字 2. 运算符 3. 初始化关键字 关键字是指被编程语言保留而不让编程人员作为标志符使用的字符序列。因此,关键字也称为保留字, 每种编程语言都有自己的关键字,从使用的角度看,我们可以把Go语言的25个关键字分为如下三类:1. 用于程序声明 2. 用于程序实体声明和定义 3. 用于程序流程控制的关键字类别关键字程序声明import, package实体声明和定义var,const,type,struct,func,interface,map,chan流程控制if,else,switch,case,fallthrough,default,for,range,continue,break,go,select,defer,goto,return运算符 运算符就是用于执行特定计算或...阅读全文

图解Go的unsafe.Pointer

相信看过Go源码的同学已经对unsafe.Pointer非常的眼熟,因为这个类型可以说在源码中是随处可见:map、channel、interface、slice...但凡你能想到的内容,基本都会有unsafe.Pointer的影子。 看字面意思,unsafe.Pointer是“不安全的指针”,指针就指针吧,还安不安全的是个什么鬼? 接下来,我们就来了解一下Go的这个“不安全的指针”unsafe.Pointer。 什么叫变量 在了解指针之前,我们有必要先了解一下什么叫“变量”。 其实变量就是一个内存地址的名字,这听起来可能有些奇怪:指针不是地址码? 听我细细来讲:此地址非彼地址。通常,我们要在计算机内存中存数据,我们会怎么做? 我们肯定说:“计算机,在0x0201地址内存一个数100”。就这一...阅读全文

博文 2020-03-16 11:34:54 RyuGou

golang之runtime.SetFinaliz

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

golang对象内存分配

一、分配对象(源码) // 分配对象内存入口 func newobject(typ *_type) unsafe.Pointer { return mallocgc(typ.size, typ, true) } // 分配指定object的大小(bytes数) // 当分配的object大小 <= 32kb 使用每个P本地缓存空闲列表即可 // > 32 kB 直接堆上进行分配. func mallocgc(size uintptr, typ *_type, needzero bool) unsafe.Pointer { // 零长度对象 if size == 0 { return unsafe.Pointer(&zerobase) // 在heap上分配,则都指向预设的同一全局变量(零长度...阅读全文

博文 2019-01-07 19:34:46 神奇的考拉

为什么说go语言中的string是不可变的?

```go s := "foobar阿斯蒂芬" fmt.Println(s) fmt.Println(&s) s = "qweqweqweqweqwe" fmt.Println(s) fmt.Println(&s) ``` 这个不可变到底指的是啥意思?上面的代码不就使s这个string变量改变了吗?而且s的地址也没有变化(说明没有给s重新分配内存),那这样看来,s就是可变的呀,实在不懂,求解惑 ...阅读全文

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...阅读全文

博文 2014-11-06 10:53:30 bigwhite

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-10-22 18:27:38 whxaing2011

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...阅读全文

博文 2015-10-21 16:00:09 xia_xing

Golang 数组与分片

与数组的区别 数组是固定长度的,而分片确实可动态增长的,以定义为例: // 定义数组, 一定要指定长度 var names [5]string // 定义分片, 不需要指定长度 var names []string 在函数调用时, 数组是值传递,而分片是引用传递 其实对于 golang 来讲,函数调用的时候都是值传递,拷贝一个副本, 之所以表现为值传递和引用传递,在于一个拷贝的是数据值,另一个拷贝的是数据指针,两个指针值指向的是同一个内存地址。 分片的实现 分片的底层数据还是使用的数组,它一共包含 3 个字段: 地址指针 长度 容量 // source 是一个分片, 大小为 4, 容量为: 5 source := make([]string, 4, 5) fmt.Println(source...阅读全文

博文 2017-09-07 13:34:47 痕无落

[翻译] channel 独木难支

文在此。遗憾的是文章只提出了问题,并没明确提供如何解决这些问题。但无论如何,对于这种可以引起反思的文章,是不能放过的。另外,我得承认,似乎高层次的分布式系统的抽象,用函数式语言的范式来表述更容易一些(实现上其实未必)。 ————翻译分隔线———— channel 独木难支 或者说为什么流水线作业没那么容易 勇敢和聪明的 Golang 并发模型。 @kachayev 撰写 概述 Go 被设计用于更容易的构建并发系统,因此它有运行独立的计算的 goroutine 和用于它们之间通讯的 channel。我们之前都听过这个故事。所有的例子和指南看起来都挺好的:我们可以创建一个新的 channel,可以向这个 channel 发送数据,可以从 channel 读取,甚至还有漂亮和优雅的 select ...阅读全文

博文 2014-10-09 16:20:18 mikespook

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-16 18:00:01 findumars

Golang 共享内存

Golang语言中,进程间通信除了使用channel,还可以使用共享内存,即sync包。 Q-1 package main import ( "fmt" "time" ) func main() { for i := 1; i < 6; i++ { go func(x int) { time.Sleep(time.Second) fmt.Println("第", x, "个子goroutine执行结束") }(i) } fmt.Println("主goroutine执行结束") } 上面的代码毫无疑问的只会输出:“主goroutine执行结束”,而不会输出子goroutine执行结束,这是因为,主协程一旦执行完毕,整个进程就会结束。 sync组等待 sync包中常用的有三个方法:Add(nu...阅读全文

博文 2018-06-07 15:30:02 -beyond

闲话高并发的那些神话,看京东架构师如何把它拉下神坛

来这里找志同道合的小伙伴! 高并发也算是这几年的热门词汇了,尤其在互联网圈,开口不聊个高并发问题,都不好意思出门。高并发有那么邪乎吗?动不动就千万并发、亿级流量,听上去的确挺吓人。但仔细想想,这么大的并发与流量不都是通过路由器来的吗?>>>>0x00 一切源自网卡高并发的流量通过低调的路由器进入我们系统,第一道关卡就是网卡,网卡怎么抗住高并发?这个问题压根就不存在,千万并发在网卡看来,一样一样的,都是电信号,网卡眼里根本区分不出来你是千万并发还是一股洪流,所以衡量网卡牛不牛都说带宽,从来没有并发量的说法。网卡位于物理层和链路层,最终把数据传递给网络层(IP层),在网络层有了IP地址,已经可以识别出你是千万并发了,所以搞网络层的可以自豪的说,我解决了高并发问题,可以出来吹吹牛了。谁没事搞网络层...阅读全文

博文 2018-09-04 22:34:44 Java架构师那些事

golang学习笔记-func函数

函数function - Go函数不支持 嵌套、重载和默认参数 - 但支持以下特性: 无需声明原形、不定长变参、多返回值、命令返回值参数、匿名函数、闭包 - 定义函数使用关键字func,且大括号不能另起一行(所有有大括号的均遵循此原则) - 函数也可以作为一种类型的使用,直接赋值给变量(匿名函数) 定义一个函数 格式:func name( 传入的变量1 类型,变量2 类型 ) [ 返回变量 类型,变量 类型 ]{ } - 传入的变量可以没有,也可以使多个 - 当传入的变量类型相同时,可以全部省略只留最后一个 func a(a,b,c int) {} - 返回值可以有多个,返回值类型相同,也可以只留最后一个,其中返回变量名称可以省略,省略的话,就需要每返回一个写一个变量的类型了,如果指定了返回...阅读全文

博文 2017-02-09 18:24:33 beyondlee2011

Go 性能优化技巧 3/10

内置 map 类型是必须的。首先,该类型使用频率很高;其次,可借助 runtime 实现深层次优化(比如说字符串转换,以及 GC 扫描等)。可尽管如此,也不意味着万事大吉,依旧有很多需特别注意的地方。 ### 1、预设容量 map 会按需扩张,但须付出数据拷贝和重新哈希成本。如有可能,应尽可能预设足够容量空间,避免此类行为发生。 ![预设容量](http://studygolang.qiniudn.com/160531/ca4949649cd8bc36851fd04a04e48e8c.jpg) ![结果](http://studygolang.qiniudn.com/160531/c24756b385183e7c120d3d6a83e267a4.jpg) 从结果看...阅读全文

go语言内存分配之TCMalloc

tcmalloc tcmalloc 优点 速度更快,比glicbc 2.3 快 占用更少的内存空间,8倍8-byte的对象内存分配中占用大约8N*1.01byte的头空间,而ptmalloc则会占用16N*byte的头空间 使用 在程序中只需使用“-ltmalloc”连接标识将其链接到程序中 综述 TCMalloc为每一个线程分配本地缓存,以满足小对象分配的需求,当需要时候,对象从中央数据结构移动到本地缓存,周期性的垃圾回收则将内存从各个线程的本地缓存收回中央数据结构。 小对象分配 每个小对象映射到170个不同的大小空间。每个空间间隔8byte,0-8byte(8),8-24byte(16),24-48byte(24),最大间隔为256byte。大对象和小对象的界限为32kb。每个线程的缓存...阅读全文

博文 2016-04-16 19:00:02 tanghui_lin

golang之大端序、小端序

一、概述 字节序:字节在电脑中存放时的序列与输入/输出时的序列;也指的是存放多字节数据的字节(byte)的顺序,典型的情况是整数在内存中的存放方式和网络传输的传输顺序。 先看下基本概念: 1、大端模式(Big endian):将高序字节存储在起始地址(按照从低地址到高地址的顺序存放数据的高位字节到低位字节) 2、小端模式(Little endian):将低序字节存储在起始地址(按照从低地址到高地址的顺序存放据的低位字节到高位字节) 在计算机领域中,大小端序是跟硬件的体系结构有关的。 举个栗子:如一个 var a = 0x11223344,对于这个变量的最高字节为0x11,最低字节为0x44。假设在内存中分配地址如下(地址都是连续的) ... 0x0001 0x0002 0x0003 0x00...阅读全文

博文 2019-01-24 11:34:45 神奇的考拉

Android开发者必知的4个性能优化点

![2839725_610AndroidEvolution_1x.jpg](http://studygolang.qiniudn.com/151215/2dbc934753e3c7e4906b5fd6c41ee511.jpg) 在Android开发中,为避免各种各样的问题,开发人员需要对Android性能进行优化。而说到性能优化,熟悉安卓的童鞋应该都知道,包含很多方面,比如:I/O的优化、网络操作的优化、内存的优化、数据结构的优化等等。这么多优化的点,难免会出现有些被忽视的地方,今天小编和大家分享的就是在网上看到的一篇关于Android性能优化最易忽视的优化点,一起来看看吧。 一、ArrayList和Vector ArrayList和Vector都是内部以数组实现的Li...阅读全文

看到go语言简介想到的

这些东西是平时遇到的, 觉得有一定的价值, 所以记录下来, 以后遇到类似的问题可以查阅, 同时分享出来也能方便需要的人, 转载请注明来自RingOfTheC[ring.of.the.c@gmail.com] 这几天看go文档时看到这么一段话: Go is a new language. Although it borrows ideas from existing languages, it has unusual properties that make effective Go programs different in character from programs written in its relatives. A straightforward translation of a...阅读全文

博文 2014-10-04 19:26:33 ringofthec

初识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 ...阅读全文

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

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

博文 2016-07-11 17:00:02 yue7603835

Go Hashmap内存布局和实现

想了解Go内置类型的内存布局的契机,是一次在调试“不同类型的小对象频繁创建对gc性能的影响”时发现map的gc性能不佳,而作为对比的包含slice的struct却很好。这里总结Go runtime里map的实现,可以解释这个问题。 hash table内部结构Go的map就是hashmap,源码在src/runtime/hashmap.go。对比C++用红黑树实现的map,Go的map是unordered map,即无法对key值排序遍历。跟传统的hashmap的实现方法一样,它通过一个buckets数组实现,所有元素被hash到数组的bucket中,buckets就是指向了这个内存连续分配的数组。B字段说明hash表大小是2的指数,即2^B。每次扩容会增加到上次大小的两倍,即2^(B+1)...阅读全文

博文 2017-12-18 13:58:29 nino's blog