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

Go中的make和new

自:http://www.cnblogs.com/ghj1976/archive/2013/02/12/2910384.html 1、make用于内建类型(map、slice 和channel)的内存分配。new用于各种类型的内存分配。 2、new本质上说跟其它语言中的同名函数功能一样:new(T)分配了零值填充的T类型的内存空间,并且返回其地址,即一个*T类型的值。用Go的术语说,它返回了一个指针,指向新分配的类型T的零值。有一点非常重要:new返回指针。 3、make(T, args)与new(T)有着不同的功能,make只能创建slice、map和channel,并且返回一个有初始值(非零)的T类型(引用),而不是*T。 4、本质来讲,导致这三个内建类型有所不同的原因是:引用在使用前必...阅读全文

博文 2015-10-23 13:00:00 resouer

小谈golang闭包

一直用java没用过闭包(我还很菜,可能java也能闭包我不会罢了,希望有人回帖指点),刚接触golang对其闭包机制也挺疑惑。下面写了六个版本的闭包小谈一下。有几个版本摘自别家,看了有段时间我一时不记得来源了很对不起作者了! 版本1: package main import "fmt" func main() { var fn [10]func() for i := 0; i < len(fn); i++ { fn[i] = func() { fmt.Println(i) } } for _, f := range fn { f() } }结果如下:10 10 10 10 10 10 10 10 10 10 分析:mian()与func()[]数组构成闭包使用同一个i变量main函数不退出...阅读全文

博文 2015-06-17 20:04:00 liugao15

golang操作阿里云对象存储——OSS | 创建桶、上传、下载、查询、删除数据

本节介绍如何快速使用OSS Go SDK完成常见操作,如创建存储空间(Bucket)、上传/下载文件(Object)等。 先下载包github.com/aliyun/aliyun-oss-go-sdk/oss到GOPATH下 创建存储空间 存储空间是OSS全局命名空间,相当于数据的容器,可以存储若干文件。 以下代码用于新建一个存储空间: package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func handleError(err error) { fmt.Println("Error:", err) os.Exit(-1) } func main() { // Endpoint以杭州为例,其...阅读全文

new与make的进行分配的区别

看了一下Effective Go,感觉还是收获很多,其中看到new与make的分配空间的区别..我就整理了一下. new是go内置函数,用于创建一块内存空间,特性如下 new(T) 那么new就会返回星T的值,就是这块内存的地址,类型是(星T,因为符号打不出开),因为在解析的时候是需要类型的解析方式.所以这里就不多总结了.并将new的内存数据置0,我理解的置0应该是将你的数据不同类型就对应不同的0,比如int类型就0,string类型就"",别的可能就nil..不知道是否理解错误. make绝大多数用于slice,make,channel的创建,特性如下 make接收一个T类型,它会返回一个T类型,并返回一个初始化(并不是置0)的T类型的值, 因为slice是数组的一个区间...阅读全文

RabbitMQ系列(二):“hello,world!”

RabbitMQ的安装官网:http://www.rabbitmq.com安装地址:http://www.rabbitmq.com/download.htmlRabbitMQ的go语言驱动:https://github.com/streadway/amqpHello,World!假设你已经安装好了RabbitMQ,并且已经安装好了rabbitMQ的golang驱动,接下来我们开始我们的"hello,world!”这里我们写两个小程序,一个作为Message的Producer,一个作为Message的Consumer,它们的关系如下: P代表Producer,C代表Consumer,中间红色的部分就是queue,它是RabbitMQ维持的与C之间的一个消息缓冲区。现在我们开始写一个Messag...阅读全文

博文 2017-10-03 15:04:54 初级赛亚人

go语言 类型:数组切片

初看起来,数组切片就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是个指针。数组切片的数据结构可以抽象为以下3个变量: 1.一个指向原生数组的指针; 2.数组切片中的元素个数; 3.数组切片已分配的存储空间。 slice不是一个值类型,而是一个引用类型,就好比指针一样,对slice取得的元素进行写操作实际是影响到了底层的数组层,slice真的只是一层薄薄的操作封装罢了。因此,slice有一个重要的用途就是作为函数的参数,就这可以避免直接传递数组而导致整个数组发生一次内存拷贝...阅读全文

博文 2015-10-13 03:00:00 osfipin

一个奇怪的golang对切片的竞争检测问题

问题示例1、首先,在开始之前,先说一点相关的东西。 在 Golang 中,有很多数据结构的操作,都不是线程安全的,比如大家熟知的 map ,比如 container/list 包。线程安全,指的是基于这类数据结构实例化的变量,可以并发操作,也就是多个 goroutine 同时进行操作。 另外,也许你也知道,golang 在编译时,是支持并发竞争检测的。go build –race ,很多 gopher 其实并不陌生。这里需要说一点是,–race 并非只支持构建时,也支持单测时,也就是 go test –race。 好了,结合上面2个点,我们看一个例子(文件 xx_test.go)(代码示例1): 123456789101112131415161718192021222324package m...阅读全文

博文 2019-04-25 19:25:38 国南之境

简析Go与Java内存管理的差异

前 言 从实践中看,Golang(以下简称Go)应用程序比Java占用更少的内存,这与它们的运行时环境有关,其运行时自带了内存动态分配和自动垃圾回收的管理机制,本文通过分析Go与Java在内存管理机制上的差异,以期对两者在运行时内存方面有更进一步的认识。本文以Go(1.12)和当前使用较多的JDK8 HotSpot VM为例进行说明。本篇文章包含以下内容:介绍Go与Java的运行时内存结构差异介绍Go与Java的内存资源占用差异介绍Go与Java如何为对象分配内存介绍Go与Java的内存回收策略差异内存结构差异应用程序要能在linux系统上运行(其他平台类似),其可执行文件要求符合ELF规范(Executable and Linkable Format,可执行和可链接格式)。操作系统加载目标...阅读全文

博文 2019-06-11 19:59:01 咪付

golang内存扩容

一、内存构成 内存管理组件构成 二、扩容 一般来说当内存空间span不足时,需要进行扩容。而在扩容前需要将当前没有剩余空间的内存块相关状态解除,以便后续的垃圾回收期能够进行扫描和回收,接着在从中间部件(central)提取新的内存块放回数组中。 // 根据空间规格 获取对应的索引 再获取alloc数组中对应的span func (c *mcache) refill(spc spanClass){ s := c.alloc[spc] if s != &emptymspan{ s.incache = false} // 解除当前span的状态 s = mheap_.central[spc].mcentral.cacheSpan // 从中间部件获取新的span c.alloc[spc] = s ...阅读全文

博文 2019-01-08 17:34:52 神奇的考拉

go语言学习之路三:切片

前面讲了变量的有关知识,这里对于其他的数据类型就不多作介绍,(和C差不多),因此重点来讨论下切片。 一、切片是引用类型,这里要稍微介绍两个概念:值类型,构造类型和引用类型 1、值类型:是一种由类型的实际值表示的数据类型。如果向一个变量分配值类型,则该变量被附以全新的值的副本,go语言的值类型包括布尔型,整型,浮点型,复数型。 2、构造类型:和c中差不多,包括数组,结构体和字符串 3、引用类型:由类型的实际值引用表示的数据类型。如果为某个变量分配一个引用类型,则该变量将应用原始值,不创建任何副本。go语言引用类型包括切片、字典和通道。 切片通常用来实现变长数组,原型定义如下: struct Slice { byte *array; unit32 len; unit32 cap; }; 它抽象为...阅读全文

博文 2016-06-30 10:00:00 chase-wind

Go转型——数据结构初级(一)

**1**.数据结构基本概念 在计算机中,我们可以用一个由若干“位”组合起来形成的一个位串来表示一个数据元素,比如,用一个字长的位串来表示一个整数,用八位二进制数字来表示一个字符,我们管这种位串叫**元素**或**节点**。当数据元素由若干数据项组成时,位串对应数据项的子位串称为**数据域**。 数据元素之间的关系可以分为两种不同的表示方式:**顺序映象**和**非顺序映象**。并且得到了两种存储结构:**顺序存储结构**和**链式存储结构**。 顺序映象的特点是借助数据元素在存储器中的相对位置来表示数据元素之间的逻辑关系,而非顺序映象利用指示数据元素存储地址的指针来表示数据元素之间的逻辑关系,日常一图顶千言: ![image.png](https://static.studygolang....阅读全文

jvm垃圾回收算法

前言 java相较于c、c++语言的优势之一是自带垃圾回收器,程序开发人员不用手动管理内存,内存的分配和释放完全由gc(Garbage Collector)来做,极大地提高了软件开发效率及程序健壮性(手动管理内存容易造成内存泄漏)。凡事皆有两面性,java gc在给我们带来内存管理便捷性的同时,也面临STW(Stop The World)影响程序吞吐的缺陷。作为java开发人员,只有深入理解jvm垃圾回收的机制,才能在程序性能出现瓶颈时,更好的对程序进行优化。笔者通过拜读《深入理解java虚拟机》,总结书中内容,给大家分享下java虚拟机常见的垃圾回收算法。 垃圾确定 在垃圾回收之前,jvm需要确定哪些对象已死,即需要当做垃圾被回收。垃圾确认的方法传统的有引用计数法:用一个引用计数器来标记对...阅读全文

博文 2019-01-26 22:34:42 luckiexie

阿里云如何打破Oracle迁移上云的壁垒

摘要: 2018第九届中国数据库技术大会,阿里云数据库产品专家萧少聪带来以阿里云如何打破Oracle迁移上云的壁垒为题的演讲。Oracle是指“数据库管理系统”,面对Oracle迁移上云的壁垒,阿里云如何能够打破它呢?本文提出了Oracle 到云数据库PPAS迁移的方案,这种迁移方案为什么比Oracle到 MySQL系列的迁移容易推动呢?答案即将揭晓。 2018第九届中国数据库技术大会,阿里云数据库产品专家萧少聪带来以阿里云如何打破Oracle迁移上云的壁垒为题的演讲。Oracle是指“数据库管理系统”,面对Oracle迁移上云的壁垒,阿里云如何能够打破它呢?本文提出了Oracle 到云数据库PPAS迁移的方案,这种迁移方案为什么比Oracle到 MySQL系列的迁移容易推动呢?答案即...阅读全文

Golang 数据结构:图

文链接:blog本文简要介绍图的 2 种实现及其 BFS 遍历。参考:golang-data-structure-graph 前言 新坑 最近在校事情不多,趁着还记得就开了个新坑 algorithms,把常用数据结构和算法总结了一下。每个算法都有 README.md 介绍算法的运行流程、GIF 演示、复杂度分析及适用场景;每种数据结构会介绍基本概念、操作和应用场景。 参考书籍 《数据结构与算法分析:C 语言描述》《算法与数据结构题目最优解》 图 图这种数据结构是网状结构的抽象,现实生活中有很多例子,比如航班路线网络、社交网络等。关于图的节点、边、权值、有向无向和强弱连通性等基础概念可参考第一本书第八章。 对于上方的无向图,有两种常见的表示方法: 邻接矩阵 对于节点 u 指向节点 v 的边 (...阅读全文

GO语言学习 指针&内存

GO有指针。指针的操作与C相同,但没有指针的运算。 GO有两个内存分配原语,new和Make new:new(T)是分配T类型的内存空间,以零值填充,并返回其内存地址。假设有一个F类型的结构体,表达式new(F)和&F{}是等价的。 make:make(T, args)只能创建slice,map,channel,并返回一个非零初始值的T类型...阅读全文

golang中为什么[]string 不能直接转换[]interface{}

一、interface的泛型特性 golang中,interface是可以被任意数量的类型满足,并且一个类型可以实现任意数量的接口。最后需要说明的是,每个类型都实现了一个空接口interface{}。任何类型(int、float、string、map、struct)都可赋值于interface{}。之前在前文(https://www.jianshu.com/p/db192f49f843)讲过了interface的结构。 二、golang中的转换原则 In Go, there is a general rule that syntax should not hide complex/costly operations. Converting a string to an interface{}...阅读全文

博文 2019-02-11 19:34:42 yushu1987

程序员修仙之路--突破内存限制的高性能排序

菜菜的涨工资申请还在待审批中.... 作为一个技术人员,技术的问题还是要解决。经过线上日志的分析,日志采用小时机制,一个小时一个日志文件,同一个小时的日志文件有多个,也就是说同一时间内的日志有可能分散在多个日志文件中,这也是Y总要合并的主要原因。每个日志文件大约有500M,大约有100个。此时,如果你阅读到此文章,该怎么做呢?不如先静心想2分钟!! 问题分析 要想实现Y总的需求其实还是有几个难点的: 如何能把所有的日志文件按照时间排序 日志文件的总大小为500M*100 ,大约50G,所以全部加载到内存是不可能的 程序执行过程中,要频繁排序并查找最小元素。 那我们该怎么做呢?其中一个解决方案就是它:堆 解决方案 堆定义 堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个...阅读全文

Go:内存管理分配

![Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French.](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20191103-Go-Memory-Management-and-Allocation/cover.png) ℹ️ *这篇文章基于 Go 1.13。* 在内存从分配到回收的生命周期中,内存不再被使用的时候,标准库会自动执行 Go 的内存管理。虽然开发者不必操心这些细节,但是 Go 语言所做的底层管理经过了很好的优化,同时有很多有趣的概念。 ## 堆...阅读全文

用Golang写一个搜索引擎(0x06)--- 索引构建

不知不觉写到第七篇了,按这个节奏,估计得写到15到20篇左右才能写完,希望自己能坚持下去,之前写代码的时候很多东西并没有想得那么细致,现在每写一篇文章还要查一些资料,确保文章的准确性,也相当于自己复习了一下吧,呵呵。 先说一下,关于倒排文件,其实还有很多东西没有讲,到后面再统一补充一下吧,主要是倒排文件的压缩技术,这一部分因为目前的存储空间不管是硬盘还是内存都是很大的,所以压缩技术用得不是很多了。 今天我们来讲讲倒排索引的构建。 之前,我们了解到了,倒排索引在系统中是存成下图这个样子 上面的B+树是一个文件,下面的倒排链是一个文件,那么,如何来构建这两个文件呢,本章我会说说一般的常规构建方法,然后说一下我是怎么构建的。 一般情况下,搜索引擎默认会认为索引是不会有太大的变化的,所以把索引分为全...阅读全文

博文 2017-02-09 08:18:10 吴yh坚

golang container包List和Ring

container/list  这个包包含了两个公开的程序实体:List和Element。前者实现了一个双向链表(以下简称链表),而后者则代表了链表中元素的结构。 //这是一个list中存储的元素 type Element struct { // Next and previous pointers in the doubly-linked list of elements. // To simplify the implementation, internally a list l is implemented // as a ring, such that &l.root is both the next element of the last // list element (l.Ba...阅读全文

博文 2018-09-27 00:34:39 one_zheng

【GO for java programmers】面向Java开发者的GO编程2

英文原文在此www.nada.kth.se/~snilsson/go_for_java_programmers 译文同步至http://blog.csdn.net/kkkloveyou/article/details/8308534 http://bbs.gocn.im/thread-73-1-1.html ====================接上文,以下正文========================. 条件语句 Go在条件语句中并不使用括号,像 if条件语句 , for 条件语句的表达式, switch 条件语句的值. 另一方面,它并不需要在if或 for条件语句中加花括号 if a < b { f() } if (a < b) { f() } // 括号是不必要的. if (a...阅读全文

博文 2015-06-17 23:08:23 kkkloveyou

关于go语言的虚拟地址空间

经常在书上看到C程序的虚拟空间,如下面链接中的图片所示 想知道,这个模型是否是语言无关的? go语言是否也是使用这样的方式组织虚拟地址空间的? https://upload.wikimedia.org/wikipedia/commons/thumb/3/32/Virtual_address_space_and_physical_address_space_relationship.svg/773px-Virtual_address_space_and_physical_address_space_relationship.svg.pn...阅读全文

(一)简单的实现的go的管道实例

package main import ( "fmt" "time" ) var pipe chan int //顶一个变量 chan 管道 整型 /** * 实现一个蒋a+b的和放入管道中 * */ func add (a int ,b int){ var sum int sum = a + b //初始管道 pipe <- sum //将计算的值放入管道中 } func main () { pipe = make(chan int ,1) //make分配一个内存空间相当于new go add(11,33) //去除管道中的值 //var sum int sum :=<- pipe fmt.Println("sum=",sum) time.Sleep(10*time.Second) } ...阅读全文

博文 2020-06-02 09:34:17 529834149

Go语言学习4:Slices

Slice是Go语言提供的一种方便并且高效的有序数据类型,就和其他语言的数组类似,但是又有一些其他的特性。 Go数组: 因为Slice是建立在Go数组的抽象层上的,所以,要学习Slice,我们先来看一下Go语言的数组: 一个数组定义了一个具有特定长度和数据类型的数据。例如:【4】int 就代表了一个有4个int类型的数组。数组的大小是确定的,数组的长度是数组类型的一部分(【4】int和【5】int是完全不同的类型)。数组可以像其他语言那样索引,s【n】能够访问第n个元素: var a [4]int a[0] = 1 i := a[0] // i == 1 数组不需要明确的初始化,没有初始化的项,将用0作为默认值 // a[2] == 0, the zero value of the int ...阅读全文

博文 2016-03-13 13:00:02 cs5512

boltdb 源码分析-启动和初始化-2

boltdb 启动和初始化 根据前面的简述,boltdb只使用单个文件进行持久化,在boltdb启动时,会先打开对应的 持久化文件,然后根据是否是只读模式来获取该文件的文件锁。当不是只读模式时,boltdb 会采用排他文件锁来保证只有一个进程能够操作该文件,避免多个进程同时操作,造成数据毁坏。 当持久化文件大小为0时,boltdb会认为该数据库为新创建的,然后对其进行初始化(写入4个初 始page),然后将文件映射到内存空间,最后从映射的内存中读取meta0、meta1数据。 然后从从meta数据中标识的当前freelist页来读取freelist pgid数据,然后freelist根据这些 数据构建free page cache。即用一个map来记录那些page是空闲的。 此时即完成启动和...阅读全文

博文 2017-06-02 03:23:24 lrita

newContext()函数内结构体&Context的字面声明是不是属于局部变量,在函数调用完成后有可能随时释放Context的存储空间?

Context是结构体 ```go func newContext(path string, router, args []string, argvList []interface{}, clr color.Color) (*Context, error) { ctx := &Context{ path: path, router: router, argvList: argvList, nativeArgs: args, color: clr, flagSet: newFlagSet(), } if !isEmptyArgvList(argvList) { ctx.flagSet = pars...阅读全文

Go slice(四)

Golang的数据声明格式如下 data := [7]int{} data:=[3]int{1, 2, 3} data := [...]int{1, 2, 3} 我们注意到,与其他语言不同的是数组的大小放在前面。 Go 语言的数组当做参数时,是值传递,即会copy数组中的所有数据。 所以在实际的go语言开发中其实很少使用数组,而是使用slice. 所以下面我们重点介绍一下slice data := []int{} data := []int{1,2, 3} slice的声明和array类似,只是省略了大小或者'...' 当slice的空间不足时,它就会自动将存储空间增加一倍。 可以用len(data)获取slice中数据的长度,用cap(data)获取slice的容量(capacity). ...阅读全文

博文 2019-03-09 14:34:39 币来币往

深入理解 Go Slice

![image](https://i.imgur.com/lIoSqWC.png) 原文地址:[深入理解 Go Slice](https://github.com/EDDYCJY/blog/blob/master/golang/pkg/2018-12-11-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Go-Slice.md) ## 是什么 在 Go 中,Slice(切片)是抽象在 Array(数组)之上的特殊类型。为了更好地了解 Slice,第一步需要先对 Array 进行理解。深刻了解 Slice 与 Array 之间的区别后,就能更好的对其底层一番摸索 ???? ## 用法 ### Array ``` func main() { nums := [3]int{...阅读全文

博文 2018-12-12 21:30:10 EDDYCJY

Golang内存对齐

如何得到一个对象所占内存大小? fmt.Println(unsafe.Sizeof(int64(0))) // "8" type SizeOfA struct { A int } unsafe.Sizeof(SizeOfA{0}) // 8 type SizeOfC struct { A byte // 1字节 C int32 // 4字节 } unsafe.Sizeof(SizeOfC{0, 0}) // 8 unsafe.Alignof(SizeOfC{0, 0}) // 4 结构体中A byte占1字节,C int32占4字节. SizeOfC占8字节 内存对齐: 为何会有内存对齐?1.并不是所有硬件平台都能访问任意地址上的任意数据。2.性能原因 访问未对齐的内存,处理器需要做两次内存...阅读全文

时间序列数据的存储和计算 - 开源时序数据库解析(一)

摘要: 开源时序数据库   如图是17年6月在db-engines上时序数据库的排名,我会挑选开源的、分布式的时序数据库做详细的解析。前十的排名中,RRD是一个老牌的单机存储引擎,Graphite底层是Whisper,可以认为是一个优化的更强大的RRD数据库。 开源时序数据库 image   如图是17年6月在db-engines上时序数据库的排名,我会挑选开源的、分布式的时序数据库做详细的解析。前十的排名中,RRD是一个老牌的单机存储引擎,Graphite底层是Whisper,可以认为是一个优化的更强大的RRD数据库。kdb+、eXtremeDB和Axibase都未开源,不做解析。InfluxDB开源版和Prometheus的底层都是基于levelDB自研的单机的存储引擎,I...阅读全文

深入理解 Go Slice

文地址:深入理解 Go Slice 是什么 在 Go 中,Slice(切片)是抽象在 Array(数组)之上的特殊类型。为了更好地了解 Slice,第一步需要先对 Array 进行理解。深刻了解 Slice 与 Array 之间的区别后,就能更好的对其底层一番摸索 ???? 用法 Array func main() { nums := [3]int{} nums[0] = 1 n := nums[0] n = 2 fmt.Printf("nums: %v\n", nums) fmt.Printf("n: %d\n", n) } 我们可得知在 Go 中,数组类型需要指定长度和元素类型。在上述代码中,可得知 [3]int{} 表示 3 个整数的数组,并进行了初始化。底层数据存储为一段连续的内存空...阅读全文

博文 2018-12-11 22:34:43 煎鱼

高效地使用字符串(Golang)

字符串是不可变字节(byte)序列,默认值是"",而不是nil。 使用 “`” 定义的原始字符串(raw strubg),支持跨行。字符串支持 !=、==、<、>、+、+= 操作符。允许以索引号访问字节数组,但不能获取元素地址。 使用 for 遍历字符串时,分 byte 和 rune 两种方式。 转换 修改字符串,需将其转换为可变类型([]byte 或 []rune),待完成后再转换回来。这个过程将重新分配内存,并复制数据。这个转换过程有一定的性能损失。要想获得更好的性能可以使用 “非安全” 的方式进行改善。 func bytesToString(bs []byte) string { return *(*string)(unsafe.Pointer(&bs)) } 亦可以用同样的方式将 s...阅读全文

博文 2017-08-03 12:34:55 勿以浮沙筑高台

比原链(Bytom)先知节点 Windows接入文档

系统要求 我们建议选择知名的VPS服务商,运行比原链节点对算力没有要求,但是请配置尽可能大的磁盘空间。 节点服务器最小配置: 操作系统: Windows/Linux/Docker CPU: 2核 内存: 2G 硬盘: 40G 网络: 独立IP,2MB带宽 防火墙: 开启46657端口 安装系统依赖库 安装MinGW 官方链接:https://nuwen.net/mingw.html 下载链接:https://nuwen.net/files/mingw/mingw-16.1.exe 安装Golang 官方地址:https://golang.org/ 下载链接:https://studygolang.com/dl/golang/go1.12.windows-amd64.msi 参考链接:http...阅读全文

博文 2019-03-08 16:34:49 比原链Bytom

为什么你的 64-bit 程序可能占用巨大的虚拟空间

出于很多目的,我从最新的 Go 系统内核开发源码复制了一份代码,在一个正常的运行环境中构建(和重新构建)它,在构建版本基础上周期性地重新构建 Go 程序。近期我在用 `ps` 查看我的[一个程序](https://github.com/siebenmann/smtpd/)的内存使用情况时,发现它占用了约 138 GB 的巨大虚拟空间(Linux ps 命令结果的 `VSZ` 字段),尽管它的常驻内存还不是很大。某个进程的常驻内存很小,但是需要内存很大,通常是表示有内存泄露,因此我心里一颤。 (用之前版本的 Go 构建后,根据运行时间长短不同,通常会有 32 到 128 MB 不同大小的虚拟内存占用,比最新版本小很多。) 还好这不是内存泄漏。事实上,之后的实验表明即使是个简单的 `hello ...阅读全文

Golang learning 字符串 String

字符串操作 var a string a的值是“”,不是nil a := "hello" a1 := a[:1] 从头到指定索引 a2 := a[1:4] 从指定索引到指定索引 a3 := a[3:] 从指定索引到结尾 a = "hello" + "world" + "\n" 字符串拼接 fmt.Print(a) a := "hello" fmt.Print(utf8.RuneCountInString(a),len(a)) 字符串的长度 a = "hello word" for i := 0;i < len(a);i ++{ for 字符串会转换为utf8 对应的编码 b := a[i] fmt.Print(b) 打印 104 101 ... fmt.Print(string(b)) 打印...阅读全文

博文 2019-05-13 19:35:00 wangyongyue

垃圾回收(GC)浅谈

关于内存 计算机通过两个机制,去实现内存的高效使用。 第一种机制是虚拟内存。硬盘的容量其实是远远大于内存的(RAM),虚拟内存会在内存不足的时候,把不经常访问的内存的数据写到硬盘里。虽然说硬盘容量比较大,但是它的访问速度却很慢。如果内存和硬盘交换数据过于频繁,处理速度就会下降,计算机就会看上去像卡死了一样,这种现象被叫做抖动(Thrushing)。造成电脑蓝屏的主要原因之一就是抖动。 第二种机制就是垃圾回收(GC)。 虚拟内存的东西在计算机组成原理和操作系统的教科书里有相关的章节去讲。由于内容很多我就不多叙述了。主要来讲一下GC的事情。 GC 之前学习java以及参加java相关的面试,被问到关于相关GC的事情一直很是头疼,看了好多遍还是记不住,脑袋里只有隐隐约约的一些关键字,什么老年代、新...阅读全文

深入理解 Go Slice

深入理解 Go Slice 是什么 在 Go 中,Slice(切片)是抽象在 Array(数组)之上的特殊类型。为了更好地了解 Slice,第一步需要先对 Array 进行理解。深刻了解 Slice 与 Array 之间的区别后,就能更好的对其底层一番摸索 ???? 用法 Array func main() { nums := [3]int{} nums[0] = 1 n := nums[0] n = 2 fmt.Printf("nums: %v\n", nums) fmt.Printf("n: %d\n", n) } 我们可得知在 Go 中,数组类型需要指定长度和元素类型。在上述代码中,可得知 [3]int{} 表示 3 个整数的数组,并进行了初始化。底层数据存储为一段连续的内存空间,通过...阅读全文

Kafka消息体大小设置的一些细节

微信公众号「后端进阶」,专注后端技术分享:Java、Golang、WEB框架、分布式中间件、服务治理等等。 还记得前几天有个小伙伴跟我反馈发送消息时提示请求数据过大的异常吗?经过调整 max.request.size 的大小之后,又报了了如下异常: image 查看相关资料后,发现 Broker 端对 Producer 发送过来的消息也有一定的大小限制,这个参数叫 message.max.bytes,这个参数决定了 Broker 能够接收到的最大消息的大小,它的默认值为 977 KB,而 max.request.size 的值已经设置成 2M 大小了,很显然已经比 message.max.bytes 大了很多,因此消息大于 997KB 时,就会抛出如上异常。 值得一提的是,主题配置也有一个参...阅读全文

博文 2019-10-28 23:33:00 aside section._1OhGeD

go语言数值类型及布尔类型

常量 常量声明常量是程序在编译时就确定的值,程序在执行时不能修改常量的值。声明常量使用关键字const。在声明常量时,需要对常量赋值。const 名称 类型 = 值 或const 名称 = 值 自动做类型推断 const aa int = 123 //正确 const aa = 123 //正确 const aa int //错误 枚举go语言没有提供枚举类型,可以借助常量来定义, iota默认值是0,在一组const定义中每次+1, const ( E int = iota // 东 0 W // 西 1 S // 南 2 N // 北 3 ) const ( E1 int = iota + 3 // 东 3 W1 // 西 4 S1 // 南 5 N1 // 北 6 ) 变量 变量是编程...阅读全文

Golang 数据结构之【4.4顺序栈】

由于 进栈和出栈没有涉及任何循环语句,因此时间复杂度均是 0(1) golang代码实现如下: package main //顺序栈 import ( "errors" "fmt" ) const MaxSize = 20 //存储空间初始分配量 type SElemType int // SElemType类型根据实际情况而定,这里假设为int type SqStack struct { data [MaxSize]SElemType //栈的数据容量,用数组实现。如果不确定最大值可以用slice类型,这里我选择用数组。 top int //栈顶指针 } // 初始化一个空栈 func (s *SqStack) InitStack () { s.top = -1 } // 把s置为空栈 f...阅读全文

博文 2019-05-16 16:34:43 JiBadBoy

golang中的make与new

golang 中有两个内存分配机制 :new和make,二者有明显区别. new:new(T)分配了零值填充的T类型的内存空间,并且返回其地址,即一个*T类型的值。其自身是一个指针.可用于初始化任何类型 make: 返回一个有初始值(非零)的T类型,而不是*T,其只能用来初始化:slice,map和channel三种类型。 对比: 适用范围:make 只能创建内建类型(slice map channel), new 则是可以对所有类型进行内存分配 返回值: new 返回指针, make 返回引用 填充值: new 填充零值, make 填充非零值 代码: package main import ( "fmt" "reflect" ) type Books struct { Title, Co...阅读全文

chanel 使用与原理 二

有了上篇的基本了解,可以翻阅源码了 涉及的数据结构 // Go/src/runtime/chan.go type hchan struct { qcount uint // total data in the queue dataqsiz uint // size of the circular queue buf unsafe.Pointer // points to an array of dataqsiz elements elemsize uint16 closed uint32 elemtype *_type // element type sendx uint // send index recvx uint // receive index recvq waitq // lis...阅读全文

Golang 数据结构之【4.5共享栈】

图片来源于《大话数据结构》 图片来源于《大话数据结构》 两栈共享空间的结构的golang代码如下: package stack import ( "fmt" "errors" ) //共享栈 const MaxDoubleSize = 20 //存储空间初始分配量 type DoubleStack struct { data [MaxDoubleSize]SElemType top1 int //栈1栈顶指针 top2 int //栈2栈顶指针 } // 初始化一个空栈 func (d *DoubleStack) InitStack () { d.top1 = -1 d.top2 = MaxDoubleSize } // 把d置为空栈 func (d *DoubleStack) ClearS...阅读全文

博文 2019-05-16 16:34:43 JiBadBoy

jvm垃圾回收算法

前言java相较于c、c++语言的优势之一是自带垃圾回收器,程序开发人员不用手动管理内存,内存的分配和释放完全由gc(Garbage Collector)来做,极大地提高了软件开发效率及程序健壮性(手动管理内存容易造成内存泄漏)。凡事皆有两面性,java gc在给我们带来内存管理便捷性的同时,也面临STW(Stop The World)影响程序吞吐的缺陷。作为java开发人员,只有深入理解jvm垃圾回收的机制,才能在程序性能出现瓶颈时,更好的对程序进行优化。欢迎学Java和大数据的朋友们加入java架构交流: 855835163群内提供免费的架构资料还有:Java工程化、高性能及分布式、高性能、深入浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点高...阅读全文

博文 2019-01-27 11:34:48 Java大生

日志声明周期简介

声明 本文内容来自一位大佬的分享 日志选型 日志收集 为什么要收集日志? 虚拟机磁盘空间有限 不利于检索 不利于分析 如何收集日志? flume 实际使用还会有个远端flume,source是子机的输出 filebeat(Golang) 日志收集第一步 日志使用场景? 大数据场景 大数据场景 ELK场景 E:Elasticsearch Elasticsearch L:logstash L Logstash 之 Filters Logstash 之 grok Logstash 之 Ruby K:Kibana Kibana 一些建议 欢迎大家关注我的公众号 半亩房...阅读全文

golang分布式存储 读书笔记(3)——数据冗余之RS码

对象存储的数据冗余 如果数据只存储一份,存储设备坏了数据就丢失了,所以需要做数据冗余。 常见的数据冗余策略就是多副本冗余,该策略实现简单,但是代价比较高。书中介绍的冗余策略是使用Reed-Solomon纠删码实现的。 RS纠删码中有数据片和校验片的概念,假如说选择4个数据片,那么就会将数据分成4个分片对象。每个分片的大小是原始对象的25%,如果选择2个校验片,那么会同时生成2个和数据片大小一样的校验片,所以一个文件最后会得到6个分片。 神奇的是,6个分片里面,只要有任意4个分片没有损坏,都可以还原出原始文件。 评价一个数据冗余策略的好坏,主要是衡量该策略对存储空间的要求和其抗数据损坏的能力。 对存储空间的要求是指我们采用的冗余策略相比于不使用冗余要额外支付的存储空间,用百分比表示。 抗数据损...阅读全文

博文 2019-02-11 19:34:41 StormZhu

Go夜读-IPFS预习资料

IPFS就其本身,没有用到多少新技术,大多数都是已有技术和思路,但并不能说就没有创新,类似比特币。取名为IPFS,星际文件系统,有点科幻意味,不过思路是,以后组建星际互联网,如果基于用HTTP的基于资源定位符寻址,延时等都不可接受,而基于内容寻址,一定程度上能解决这个问题,缓解光速屏障。 分布式哈希表 思路:KadDHT的节点寻址与内容寻址同构,在KAD基于异或来计算逻辑距离的基础上,节点倾向于连接与自己距离更近的节点,存储与自己距离更近的内容Key值,并在此之上加入了延时等具体物理距离的考量(Coral DHT)。引入S-KadDHT加入了一定的抗女巫攻击能力,因为生成一个公私钥需要计算难度值。 Git IPFS的基础数据结构与组织方式受Git影响很深,首先Git是一套基于内容寻址的文件系...阅读全文

博文 2019-09-16 11:02:52 xcshuan

4. golang的整数和浮点数以及bool类型

一, 整数 整数,就是存放整数值的,如0, -1, 800等 整数的类型: 类型 有无符号 占用存储空间 值范围 备注 int8 有 1字节 -2^7 ~ 2^-1 int16 有 2字节 -2^15 ~ 2^15 -1 int32 有 4字节 -2^31 ~ 2^31 -1 int64 有 8字节 -2^63 ~ 2^63 -1 uint8 无 1字节 0 ~ 2^8 - 1 uint16 无 2字节 0 ~ 2^16 - 1 uint32 无 4字节 0 ~ 2^32 - 1 uint64 无 8字节 0 ~ 2^64 - 1 int 有 32位系统4个字节 64位系统8个字节 参考int32和int64 uint 无 32位系统uint32 64系统uint64 参考uint32和ui...阅读全文

博文 2020-01-22 17:32:44 瓦灯_c6f0

【每日笔记】【Go学习笔记】2018-12-27

方波 1、redis实现集群需要解决的问题列表: 1 多key读写(mget mset) 2 多key计算(集合交并集计算) 3 扩缩容 4 proxy冗余 2、一致性hash环: 1 一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环,比如redis的16384个slot。 2 将机器虚拟并随机在环上分配相应slot区间。随机虚拟节点是为了解决数据倾斜问题。 3 增加机器时,将原区间上的数据重新hash到两个区间,比如[b2, c1],加入d3为[b2, d3], [d3, c1] 4 机器故障时,只会影响分配到该机器的key。 3、go协程与线程的讨论 go调度器如何管理goroutine: 实验代码: package main import ( "fmt" "time" ) fun...阅读全文

博文 2018-12-30 10:34:43 LNMPR源码研究

golang string和[]byte的对比

golang string和[]byte的对比为啥string和[]byte类型转换需要一定的代价?为啥内置函数copy会有一种特殊情况copy(dst []byte, src string) int?string和[]byte,底层都是数组,但为什么[]byte比string灵活,拼接性能也更高(动态字符串拼接性能对比)?今天看了源码探究了一下。以下所有观点都是个人愚见,有不同建议或补充的的欢迎emial我aboutme何为string?什么是字符串?标准库builtin的解释:type string string is the set of all strings of 8-bit bytes, conventionally but not necessarily representin...阅读全文

博文 2017-10-04 00:00:02 zhangboyu