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

LevelDb之manifest文件

从这篇文章开始想写写leveldb的小知识。先了解manifest文件,因为这个文件关系到实例的读取。至于这个文件的内部结构以及如何来的,等会再聊。 if instances[Name], err = leveldb.OpenFile(Dir, instance); err != nil { return errors.New(fmt.Sprintf(`leveldbs: err while open %s : %s`, Dir, err.Error())) } 这段代码在manifest文件损坏的情况下会出现报错,报错内容: ERROR leveldb: manifest corrupted: missing [file=MANIFEST-*******] 报错原因:leveldb在存储过...阅读全文

博文 2017-08-22 06:04:59 ieasy_tm

Go语言interface底层实现

Go的interface源码在Golang源码的 runtime目录中。 Go在不同版本之间的interface结构可能会有所不同,但是,整体的结构是不会改变的,此文章用的Go版本是1.11。Go的interface是由两种类型来实现的: iface和 eface。 其中, iface表示的是包含方法的interface,例如:type Person interface { Print()}而 eface代表的是不包含方法的interface,即type Person interface {}或者var person interface{} = xxxx实体efaceeface的具体结构是:一共有两个属性构成,一个是类型信息 _type,一个是数据信息。 其中, _type可以认为是Go语言...阅读全文

博文 2019-03-16 11:51:28 互联网技术窝

Go 语言内存管理(二):Go 内存管理

介绍 了解操作系统对内存的管理机制后,现在可以去看下 Go 语言是如何利用底层的这些特性来优化内存的。Go 的内存管理基本上参考 tcmalloc 来实现的,只是细节上根据自身的需要做了一些小的优化调整。 Go 的内存是自动管理的,我们可以随意定义变量直接使用,不需要考虑变量背后的内存申请和释放的问题。本文意在搞清楚 Go 在方面帮我们做了什么,使我们不用关心那些复杂内存的问题,还依旧能写出较为高效的程序。 本篇只介绍 Go 的内存管理模型,与其相关的还有逃逸分析和垃圾回收内容,因为篇幅的关系,打算后面找时间各自整理出一篇。 池 程序动态申请内存空间,是要使用系统调用的,比如 Linux 系统上是调用 mmap 方法实现的。但对于大型系统服务来说,直接调用 mmap 申请内存,会有一定的代价...阅读全文

博文 2019-03-06 19:34:41 达菲格

剖析使Go语言高效的5个特性(5/5): Goroutine的栈管理

翻译原文链接 转帖/转载请注明出处 英文原文链接 发表于2014/06/07 Goroutine的栈管理 在上一篇文章里,我们已经讨论了goroutine减少了对上百个并发运行的线程的管理开销。这里我们要在讨论下goroutine的另外一个方面,它的栈管理。 下面是一个进程的内存布局图。这个图里我们关心的是堆和栈的位置。 通常在进程的寻址空间里,堆是在内存的底部,从程序的可执行指令存储空间(text)开始向上衍生。栈则位于虚拟地址空间的顶部,并向下衍生。 如果堆和栈衍生后相互覆盖的话,那结果是灾难性的。操作系统通常会在堆和栈之间设置一块不可写的内存区域。如果堆和栈衍生到一起的话,程序就会退出。这块内存区域叫做保护页(guard page)。它限制了进程的栈的大小。这个限制通常在几M的量级。 ...阅读全文

博文 2017-08-13 05:34:59 曼托斯

Ubuntu singularity安装

安装环境为Ubuntu 18.04.2 LTS 系统要求 140MB硬盘空间, 安装依赖 sudo apt-get update && sudo apt-get install -y \ build-essential \ uuid-dev \ libgpgme-dev \ squashfs-tools \ libseccomp-dev \ wget \ pkg-config \ git \ cryptsetup-bin GO 安装 singularity使用Go编写,需要安装Go 在https://golang.org/dl/ 下载合适版本的Go至 /usr/local。singularity3.0以上的版本需要下载Go 1.13以上的版本。下载完成后: cd /usr/local sud...阅读全文

博文 2020-04-30 03:32:48 气旋_c8b6

深入理解 Go map:初始化和访问元素

深入理解 Go map:初始化和访问元素 从本文开始咱们一起探索 Go map 里面的奥妙吧,看看它的内在是怎么构成的,又分别有什么值得留意的地方? 第一篇将探讨初始化和访问元素相关板块,咱们带着疑问去学习,例如: 初始化的时候会马上分配内存吗? 底层数据是如何存储的? 底层是如何使用 key 去寻找数据的? 底层是用什么方式解决哈希冲突的? 数据类型那么多,底层又是怎么处理的呢? ... 数据结构 首先我们一起看看 Go map 的基础数据结构,先有一个大致的印象 hmap type hmap struct { count int flags uint8 B uint8 noverflow uint16 hash0 uint32 buckets unsafe.Pointer oldbuck...阅读全文

博文 2019-03-26 09:29:47 EDDYCJY

阿里集团八年容器化演进之路

PouchContainer 现在服务于阿里巴巴集团和蚂蚁金服集团的绝大部分 BU, 包括交易&中间件,B2B/CBU/ICBU,搜索广告数据库,还有收购或入股的一些公司,比如优酷高德、UC等。其中体量最大的是交易和电商平台,在 2017 年双 11 的时候我们支撑了破纪录的峰值,背后的应用都是跑在 PouchContainer 里面,整体容器实例已经到了百万级规模。使用了 PouchContainer 的应用涵盖了各种各样的场景。这些场景从运行模式来看,有标准的在线 App,还有像购物车、广告、测试环境等比较特殊的场景。不同的场景对 PouchContainer 有不同的使用方式和需求。从编程语言看,实际运行着 JAVA、C/C++,Nodejs,GoLang 等语言编写的应用。从技术栈的...阅读全文

博文 2018-09-11 16:35:09 阿里云云栖社区

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

Golang 优化之路——bitset

写在前面 开发过程中会经常处理集合这种数据结构,简单点的处理方法都是使用内置的map实现。但是如果要应对大量数据,例如,存放大量电话号码,使用map占用内存大的问题就会凸显出来。内存占用高又会带来一些列的问题,这里就不展开说了。还有就是,大量数据存放于map,查找的哈希算法消耗也会很高。这时就该考虑对数据结构进行优化。之前浏览awesome-go时发现了一种叫bitset的数据结构,今天就介绍一下它。 bitset 简介 首先这是一个数据结构。从名字set不难发现,这是一个集合的数据结构。bit的含义也比较好懂,通过set是通过bit实现的。如果你需要一个集合,正好集合内的元素都是正整数,那么用这个就没错了。 注:biset 有时也会被叫做 Bitmap。 Example import "g...阅读全文

【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

levelDB实现原理

LevelDb日知录之一:LevelDb 101 说起LevelDb也许您不清楚,但是如果作为IT工程师,不知道下面两位大神级别的工程师,那您的领导估计会Hold不住了:Jeff Dean和Sanjay Ghemawat。这两位是Google公司重量级的工程师,为数甚少的Google Fellow之二。 Jeff Dean其人:http://research.google.com/people/jeff/index.html,Google大规模分布式平台Bigtable和MapReduce主要设计和实现者。 Sanjay Ghemawat其人:http://research.google.com/people/sanjay/index.html,Google大规模分布式平台GFS,Bigta...阅读全文

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 语言》第 5 课 —— 神奇的切片

切片无疑是 Go 语言中最重要的数据结构,也是最有趣的数据结构,它的英文词汇叫 slice。所有的 Go 语言开发者都津津乐道地谈论切片的内部机制,它也是 Go 语言技能面试中面试官最爱问的知识点之一。初级用户很容易滥用它,这小小的切片想要彻底的理解它是需要花费一番功夫的。在使用切片之前,我觉得很有必要将切片的内部结构做一下说明。学过 Java 语言的人会比较容易理解切片,因为它的内部结构非常类似于 ArrayList,ArrayList 的内部实现也是一个数组。当数组容量不够需要扩容时,就会换新的数组,还需要将老数组的内容拷贝到新数组。ArrayList 内部有两个非常重要的属性 capacity 和 length。capacity 表示内部数组的总长度,length 表示当前已经使用的数...阅读全文

博文 2018-12-15 20:58:02 码洞

深入理解 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 ) 变量 变量是编程...阅读全文

深入理解go的slice和到底什么时候该用slice

前言 用过go语言的亲们都知道,slice(中文翻译为切片)在编程中经常用到,它代表变长的序列,序列中每个元素都有相同的类型,类似一个动态数组,利用append可以实现动态增长,利用slice的特性可以很容易的切割slice,它们是怎么实现这些特性的呢?现在我们来探究一下这些特性的本质是什么。 先了解一下slice的特性 定义一个slice: s := []int{1,2,3,4,5} fmt.Println(s) // [1 2 3 4 5] 一个slice类型一般写作[]T,其中T代表slice中元素的类型;slice的语法和数组很像,只是没有固定长度而已。 slice的扩容: s := []int{1,2,3,4,5} s = append(s, 6) fmt.Println(s) /...阅读全文

博文 2018-09-12 12:34:41 空即是色即是色即是空