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

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

博文 2015-04-02 19:00:01 slvher

Golang通过syscall调用windows dll方法

本用例在GO 1.4.2 上编译执行通过,直接上CODE: package main import ( "fmt" "syscall" "time" "unsafe" ) const ( MB_OK = 0x00000000 MB_OKCANCEL = 0x00000001 MB_ABORTRETRYIGNORE = 0x00000002 MB_YESNOCANCEL = 0x00000003 MB_YESNO = 0x00000004 MB_RETRYCANCEL = 0x00000005 MB_CANCELTRYCONTINUE = 0x00000006 MB_ICONHAND = 0x00000010 MB_ICONQUESTION = 0x00000020 MB_ICONEXCLAM...阅读全文

博文 2015-03-29 12:00:01 hotkit

go语言常用函数:make

创建数组切片 Go语言提供的内置函数make()可以用于灵活地创建数组切片。创建一个初始元素个数为5的数组切片,元素初始值为0: mySlice1 := make([]int, 5) 创建一个初始元素个数为5的数组切片,元素初始值为0,并预留10个元素的存储空间: mySlice2 := make([]int, 5, 10) 创建一个map myMap = make(map[string] PersonInfo) 创建了一个键类型为string、值类型为PersonInfo的map.//from:http://www.cnblogs.com/osfipin/ myMap = make(map[string] PersonInfo, 100) 也可以选择是否在创建时指定该map的初始存储能力,...阅读全文

博文 2015-07-28 03:00:00 osfipin

golang数据类型-slice(切片)

slice介绍 数组的长度在定义之后无法再次修改;数组是值类型,每次传递都将产生一份副本。显然这种数据结构无法完全满足开发者的真实需求。在初始定义数组时,我们并不知道需要多大的数组,因此我们就需要“动态数组”。在Go里面这种数据结构叫slice,slice并不是真正意义上的动态数组,而是一个引用类型。slice总是指向一个底层array,slice的声明也可以像array一样,只是不需要长度,它是可变长的,可以随时往slice里面加数据。 初看起来,数组切片就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是个指针。数组切片的数据结构可以抽象为以下3个变量: 1.一个指向原生数组的指针(point):指向数组中slice指定的开始位置; 2.数组切片中的元素个数(len):即sli...阅读全文

博文 2015-06-17 20:17:41 JesseYoung

golang mysql中timestamp,datetime,int类型的区别与优劣

golang time: https://golang.org/pkg/time/ golang中time包用法 http://blog.csdn.net/chenbaoke/article/details/41519193 首先 DATETIM和TIMESTAMP类型所占的存储空间不同,前者8个字节,后者4个字节,这样造成的后果是两者能表示的时间范围不同。前者范围为1000-01-01 00:00:00 ~ 9999-12-31 23:59:59,后者范围为1970-01-01 08:00:01到2038-01-19 11:14:07。所以可以看到TIMESTAMP支持的范围比DATATIME要小,容易出现超出的情况. 其次,TIMESTAMP类型在默认情况下,insert、update ...阅读全文

博文 2016-03-04 08:00:01 scut1135

一、Go语言的变量和常量

《Go Web 编程》《Go 语言编程》读书笔记 。 1.变量 变量是几乎所有编程语言中最基本的组成元素。从根本上说,变量相当于是对一块数据存储空间的命名,程序可以通过定义一个变量来申请一块数据存储空间,之后可以通过引用变量名来使用这块存储空间。 1.1 变量声明 对于纯粹的变量声明,Go语言引入关键字var,而类型信息放在变量名之后,形如: var variableName type var vname1, vname2, vname3 type 示例: var v1 int var v2 string var v3 [10]int // 数组 var v4 []int // 数组切片 var v5 struct { f int } var v6 *int // 指针 var v7 map...阅读全文

博文 2015-11-10 10:00:01 chyljy

用go语言通过FTP库实现web日库自动上传归档

因为平时管理的web服务器都是VM服务器,为节省硬盘空间,一般给虚拟机分配的硬盘空间都比较小,只有8G,因为,保存不了多少日志,所以每天都需要把每台WEB日志转移到一个硬盘比较大的服务器上,然后再使用NBU集中备份,本程序主要使用go语言实现实现将web日志通过FTP自动上传FTP服务器,使用了filepath.Walk遍历日志目录及第三方纯go库“github.com/jlaffaye/ftp”,而日志VM本地存储路径格式是 /var/log/weblog/www.domainName.com/month/20140616.access.log, ftp库下载地址 http://godoc.org/github.com/jlaffaye/ftp#ServerConn.Stor // upl...阅读全文

博文 2014-10-27 10:00:01 学思

阿里云对象存储OSS Go SDK发布了,欢迎有兴趣的Go爱好者试用~~~

阿里云对象存储OSS提供的海量、安全和高可靠的云存储服务。存储容量和处理能力的弹性扩展,真正使您专注于核心业务,广泛的应用于海量数据存储与备份,数据加工与处理,内容加速分发,业务数据挖掘分析等多种业务场景。详细介绍见[阿里云官网](http://www.aliyun.com/product/oss/?spm=5176.383663.3.14.RM2v6L)。 本次发布的OSS Go SDK包含了丰富的功能,简洁的接口,详细的例子... ## 主要功能包括: - 简洁、丰富、易用的接口,如PutObject/GetObject/ListObjects; - 并发上传/下载; - 断点续传的上传/下载; - 全面支持STS/HTTPS/CNAME访问; - ...阅读全文

golang之array

数组 √ golang数组包含的每个数据称为数组元素(element),数组包含的元素个数被称为数组长度(length)。 √ golang数组的长度在定义后不可更改,并且在声明时可以是一个常量或常量表达式(在编译期即可计算结果的表达式)。golang数组长度是一个内置常量,可以用len()函数来获取。 √ golang数组是一个值类型,在赋值和作为参数传递时都将产生一次复制动作,因此在函数体中无法修改传入的数组的内容。 • 数组声明和初始化 ▶ 数组声明 ▪ 语法如下 // 数组声明 var array [n]Type // 数组声明和初始化 var array [n]Type = [n]Type{v1, v2, ..., vn} var array = [n]Type{v1, v2, ....阅读全文

博文 2016-02-20 03:00:04 heartchord

Go-Slice

要点 一个区间:[low:high] 两个概念:length, capability 三个函数:make(), append(), copy() 概念 Array是在声明的时候都确定了长度,之后不可更改。Slice和数组类似,也是表示一个有序元素,但这个序列的长度可变。 在Go中,Slice序列中各元素的数据类型必须一致,因为在声明slice的时候即要指定类型。 可以在Python中找到Slice,和Go的Slice基本上是一致的语义和用法。Slice中文通常被译为切片,大抵是因为可以从一个序列中存取指定的某一部分。下面是Collins词典中对于slice的解释,有助于了解该词的含义: N-COUNT (指食物切下的)片,薄片 A slice of bread, meat, fruit, o...阅读全文

博文 2016-09-02 07:00:05 u013344915

Go语言把IP转为int存储.节省空间提高索引速度

package main import ( "errors" "fmt" "strconv" "strings" ) type IntIP struct { IP string Intip int } func main() { var x *IntIP = &IntIP{IP: "192.168.1.1"} fmt.Println(x) x.ToIntIp() fmt.Println(*x) } func (self *IntIP) String() string { return self.IP } func (self *IntIP) ToIntIp() (int, error) { Intip, err := ConvertToIntIP(self.IP) if err != nil...阅读全文

博文 2015-12-23 22:00:04 fyxichen

空结构体

空结构体 这篇文章探讨了我喜欢的Go数据类型,空结构体。 空结构体是一个没有field的结构体类型。这里有几个例子,有命名和匿名形式: type Q struct{} var q struct{} 所以,如果空结构体没有成员,我们该怎么使用它? width 在深入研究空结构体本身前,我想简要讨论下width。 术语width来自于gc编译器,尽管它的词源可能追溯到几十年年。 width描述了类型实例占用的字节数目。因为一个进程的地址空间是一维的,我认为witdh比size更合适。 width一个类型的属性。因为Go程序的每个值都有一个类型,值类型定义了它的witdh,一般是8比特的倍数。 我们可以发现任何值的宽度,它的类型的width使用unsafe.Sizeof()函数: var s st...阅读全文

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

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

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

Go的三色标记GC

三色标记 三色标记的原理如下:整个进程空间里申请每个对象占据的内存可以视为一个图, 初始状态下每个内存对象都是白色标记,先stop the world,将扫描任务作为多个并发的goroutine立即入队给调度器,进而被CPU处理,第一轮先扫描所有可达的内存对象,标记为灰色放入队列;第二轮可以恢复start the world,将第一步队列中的对象引用的对象置为灰色加入队列,一个对象引用的所有对象都置灰并加入队列后,这个对象才能置为黑色并从队列之中取出。循环往复,最后队列为空时,整个图剩下的白色内存空间即不可到达的对象,即没有被引用的对象; 第三轮再次stop the world,将第二轮过程中新增对象申请的内存进行标记(灰色),这里使用了writebarrier(写屏障)去记录这些内存的身份...阅读全文

golang中的append函数详解

1. append函数是用来在slice末尾追加一个或者多个元素。 2. 当追加元素时,发现slice的**len>cap**时,会重新开辟一个**2*cap**的内存空间去存储追加过元素的slice。 3. 如果追加元素后slice的**len<=cap**,则append返回的新生成的slice的内存地址**依旧**是传入的slice参数的内存地址。 ```go testSlice := make([]int, 0) testSlice = append(testSlice, 0) fmt.Printf("len: %d, cap: %d, data:%+v \n", len(testSlice), cap(testSlice), testSlice) //len: 1, cap: 1,...阅读全文

博文 2018-11-12 14:56:01 lijingtian

Golang(Go语言)内置函数之append

append主要用于给某个切片(slice)追加元素 如果该切片存储空间(cap)足够,就直接追加,长度(len)变长;如果空间不足,就会重新开辟内存,并将之前的元素和新的元素一同拷贝进去第一个参数为切片,后面是该切片存储元素类型的可变参数 基础用法: slice := append([]int{1,2,3},4,5,6)fmt.Println(slice) //[1 2 3 4 5 6] 第二个参数也可以直接写另一个切片,将它里面所有元素拷贝追加到第一个切片后面。要注意的是,这种用法函数的参数只能接收两个slice,并且末尾要加三个点 slice := append([]int{1,2,3},[]int{4,5,6}...)fmt.Println(slice) //[1 2 3 4 5 6...阅读全文

博文 2016-02-23 15:00:03 QQ245671051

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

Go语言学习(二):array、slices和map

前言 近来个多月忙于论文,各方面原因的综合,说多都是泪,等着结果了。关于Go语言的学习,本文的内容老早就学习了,之前时间也不知去哪了,而且也没心思,现在誊写上来吧。 数组array 定义形式: [n],n标示array长度,标示类型。 // e.g: [32]byte // 长度32的数组,每个元素为1个byte [16]*float64 // 指针数组 [3][5]int // 二维数组 在Go语言中,数组长度在定义后不可更改。获取array元素个数方法:arrLength := len(array) 元素访问与C一致。需要注意的一点,Go语言中数组属于值类型,不能像C一样用于指针传递。也就是说,如果数组作为函数入参,则在调用该函数时,函数将对数组做一份拷贝副本,...阅读全文

博文 2014-11-08 00:00:02 fzy0201

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实现一致性hash算法

有没有好奇过redis、memcache等是怎么实现集群负载均衡的呢? 其实他们都是通过一致性hash算法实现节点调度的。 讲一致性hash算法前,先简述一下求余hash算法: hash(object)%N 一个缓存服务器宕机了,这样所有映射到这台服务器的对象都会失效,我们需要把属于该服务器中的缓存移除,这时候缓存服务器是 N-1 台,映射公式变成了 hash(object)%(N-1) ; 由于QPS升高,我们需要添加多一台服务器,这时候服务器是 N+1 台,映射公式变成了 hash(object)%(N+1) 。 1 和 2 的改变都会出现所有服务器需要进行数据迁移。 一致性HASH算法 一致性HASH算法的出现有效的解决了上面普通求余算法在节点变动后面临全部缓存失效的问题: type ...阅读全文

博文 2018-08-09 23:34:51 豆瓣奶茶

(二)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 水果糖

MongoDB 3.0 新特性【转】

本文来自:http://www.open-open.com/lib/view/open1427078982824.html#_label3 更多信息见官网: http://docs.mongodb.org/manual/release-notes/3.0/ 参考文章: 测试:http://www.mongoing.com/archives/862 http://www.mongoing.com/benchmark_3_0 配置:http://www.mongoing.com/config_3_0 学习:http://www.mongoing.com/ 迁移:https://github.com/xbsura/mongo-migrate 引言 在历经版本号修改(2.8版本直接跳到3.0版本)和...阅读全文

博文 2015-08-07 03:00:00 zhoujinyi

IPFS基本使用

在IPFS新增一个文件 新建test.txt文件 打开终端,切换到桌面,新建一个文件夹test,切换到test中,通过vi新建一个文件test.txt,文件里面输入Hello World保存并且退出。 $ cd Desktop/ $ mkdir test $ cd test/ $ vi test.txt $ cat test.txt Hello World 将test.txt添加到ipfs节点 使用ipfs add命令添加: $ cd Desktop/test $ ipfs add test.txt added QmUXTtySmd7LD4p6RG6rZW6RuUuPZXTtNMmRQ6DSQo3aMw test.txt $ ipfs cat QmUXTtySmd7LD4p6RG6rZW6R...阅读全文

正确理解golang slice的复制

slice 三个属性 golang 的slice是一个指向底层的数组的指针结构体。 这个结构体有三个属性,1.指向数组指针,2.len: slice中元素的数量 3.cap:slice占用内存数量。 只有深刻理解这三个属性才能在使用slice中不至于犯错。 正确理解变量和共享 多个slice之间可以共享底层的数据,并且引用的数组部分区间可能重叠 以上是golang 圣经中的一句话。深刻理解这句话对于日程编程非常有意义。 1.什么时候共享数据会被其他变量修改 func f1() { a1 := []int{1,2,3,4,5,6} a2 := a1 a3 := a1[1:3] a1[1] = 999 fmt.Println("a1=",a1,"a2=",a2,"a3=",a3) } 运行结果 ...阅读全文

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

博文 2014-11-19 01:00:02 kkkloveyou

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

Docker 管理工具lazydocker

lazydocker,一个简单的 docker 和 docker-compose 终端用户界面,用更懒惰的方式来管理所有的 docker。 其界面采用 [gocui](https://www.oschina.net/p/gocui) 开发。 #### **特点** * 可以清楚地查看 docker 或 docker-compose 容器环境的状态 * 查看容器/服务的日志 * 查看容器度量的 ascii 图 * 可以自定义图来测量任何想要测量的 * 重新启动、移除、重建容器和服务 * 查看给定图像的祖先层 * 清理占用磁盘空间的容器、图像或容量 ![image](https://static.oschina.net/uploads/space/2019/0630/1...阅读全文

Go实现Websocket消息推送

1.websocket 简介 以往浏览器要获取服务端数据,都是通过发送 HTTP 请求,然后等待服务端回应的。也就是说浏览器端一直是整个请求的发起者,只有它主动,才能获取到数据。而要让浏览器一侧能够获取到服务端的实时数据,就需要不停地向服务端发起请求。虽然大多数情况下并没有获取到实际数据,但这大大增加了网络压力,对于服务端来说压力也直线上升。 image.png 由于 WebSocket 是全双工通信,所以当建立了 WebSocket 连接之后,接下来的通信就类似于传统的 TCP 通信了。客户端和服务端可以相互发送数据,不再有实时性的问题。 image.png image.png 2.开发包的选择 在 Go 官方的 SDK 中,并不包含对 WebSocket 的支持,所以必须使用第三方库。 ...阅读全文

博文 2018-08-19 01:35:07 tuzisir

Go 性能优化技巧 3/10

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

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

[GoLang学习总结]Go语言中的Slice

概念 Slice切片是对底层数组Array的封装,在内存中的存储本质就是数组,体现为连续的内存块,Go语言中的数组定义之后,长度就已经固定了,在使用过程中并不能改变其长度,而Slice就可以看做一个长度可变的数组进行使用,最为关键的,是数组在使用的过程中都是值传递,将一个数组赋值给一个新变量或作为方法参数传递时,是将源数组在内存中完全复制了一份,而不是引用源数组在内存中的地址,为了满足内存空间的复用和数组元素的值的一致性的应用需求,Slice出现了,每个Slice都是都源数组在内存中的地址的一个引用,源数组可以衍生出多个Slice,Slice也可以继续衍生Slice,而内存中,始终只有源数组,当然,也有例外,后边再说。 用法 1.Slice的定义 Slice可以通过两种方式定义,一种是从源数...阅读全文

博文 2015-06-17 20:23:36 tiger435

HTML5中的storage 如何使用?

HTML5中,我们常常用到storage,那这个storage到底是什么鬼?有什么用呢? 其实,storage是个很简单的东西,只要熟悉JavaScript中对象的童鞋,看完小编本文的分享,对storage的概念及用法应该都能掌握个七七八八了。 在HTML5中,你可以吧storage 想象成是储存在客户端(浏览器)中的一些 javascript 对象,那么有什么用呢?举个简单的例子,百度搜索会把你每次的搜索关键字用 storage(localStorage) 存储下来,那么下次你再搜索相同的内容的时候,它会优先将你曾经搜过的内容进行下拉展示。 关于 storage 的内容,可以用 chrome 下的 Resources 面板进行查看。 ![1.png](http://st...阅读全文

go局部变量的存储空间是堆还是栈?

go局部变量的存储空间是堆还是栈? 编译器会自动选择在栈上还是在堆上分配局部变量的存储空间,但可能令人惊讶的是,这个选择并不是由用var还是new声明变量的方式决定的。 var global *int func f() { var x int x = 1 global = &x } func g() { y := new(int) *y = 1 } f函数里的x变量必须在堆上分配,因为它在函数退出后依然可以通过包一级的global变量找到,虽然它是在函数内部定义的;用Go语言的术语说,这个x局部变量从函数f中逃逸了。相反,当g函数返回时,变量y将是不可达的,也就是说可以马上被回收的。因此,y并没有从函数g中逃逸,编译器可以选择在栈上分配*y的存储空间(译注:也可以选择在堆上分配,然后由Go语...阅读全文

博文 2017-12-07 08:04:45 卢春风

使用 Golang 操作 Linux Namespaces

Linux 命名空间简介 Linux Namespaces(Linux 命名空间)机制提供了进程使用操作系统资源时的隔离方式,是基于内核实现轻量级虚拟化(容器化,例如 docker)的实现基础。 具体来说就是当我们创建一个进程时,可以给进程设置 flag 组合来构建进程的命名空间,处于不同命名空间的进程是相互隔离的。 命名空间分类 目前我们可以设置如下几种命名空间,它们分别从不同的资源纬度进行隔离。 CLONE_NEWPID 该标识用于创建一个新的 PID 命名空间,新进程将成为命名空间里的第一个进程。 一个 PID 命名空间为进程提供了一个独立的 PID 环境,其内部的 PID 将从 1 开始, 在该命名空间内创建的进程都将产生一个在该命名空间内独立的 PID。后续在该命名空间创建的进程都...阅读全文

MongoDB 3.0新增特性一览

插件式存储引擎APIMongoDB3.0引入了插件式存储引擎API,为第三方的存储引擎厂商加入MongoDB提供了方便,这一变化无疑参考了MySQL的设计理念。目前除了早期的MMAP存储引擎外,WiredTiger和RocksDB均已完成了对MongoDB的支持,前者更是在被MongoDB公司收购后更是直接引入到了MongoDB3.0版本中。插件式存储引擎API的引入为MongoDB丰富自己武器库以处理更多不同类型的业务提供了无限可能,内存存储引擎、事务存储引擎甚至Hadoop在未来都有可能接入进来。WiredTiger存储引擎如果说插件式存储引擎API为MongoDB3.0打造了一个武器库,那么WiredTiger绝对是武器库中第一枚也是最重要的一枚重磅炸弹。因为MMAP存储引擎自身的天然...阅读全文

博文 2015-07-28 23:00:01 散关清渭

初识golang之数组,slice,map学习

数组: 定义方式:var arr [n]type,n表示数组的长度,type表示存储元素的类型。定义好后,可以使用arr[0] = 42,这样指定下标来进行数组的读取和赋值。 注意:在go中长度也是类型的一部分,因此[3]int和[5]int是不同类型的。 go中数组不可以改变长度,数组之间的赋值是值的拷贝赋值,即当把一个数组作为一个参数传人函数的时候,传入的其实是数组的备份。arr := [10]int{1,2,5:6},da := [2][4]int{[4]int{1,2,3,4}, [4]int{5,6,7,8} },如果内部的元素和外部的一样,那么声明可以简化,直接忽略内部的类型 ea := [2][4]int{{1,2,3,4},{5,6,7,8}},如果不知道数组的个数,而是按照...阅读全文

空结构体struct{}解析

本篇文章转自David的"The empty struct"一文,原文地址链接是http://dave.cheney.net/2014/03/25/the-empty-struct 。欢迎大家访问[我的博客](http://zuozuohao.github.io/),代码可以在[@Zuozuohao](https://github.com/Zuozuohao/GolangGOFPatterns)下载。 **Introduction** 这篇文章详细介绍了我最喜欢的Go数据类型,空结构体--struct{}。 空结构体是没有位段的结构体,以下是空结构体的一些例子: ``` type Q struct{} var q struct{} ``` 但是如果一个就结...阅读全文

go的学习记录(二)--- 数组与数组切片

在go语言的学习中,少不了接触的就是数组和数组切片,并且这两者的使用也是非常频繁的。因此如果不能进行很好的理解,或许很容易犯错。那么在go中,数组和数组切片都有什么特点,又是怎么声明赋值的,如何使用的呢,下面我就自己的理解总结一下,个人总结可能不全或者有错,望指点。 一、数组和数组切片的特点 数组是什么就不用多说了,作为开发者,这是经常会用到的东西,相信大家都有自己的理解。现在先总结一下数组的特点 1. 数组的长度在定义之后就不可被更改 2. 数组声明时的长度必须为常量或常量表达式,即可以在编译器确定长度,分配内存 3. 数组的下标从0开始,最后一个元素的下标为(长度-1),即在go中可以写为 len(arr)-1 4. go语言的数组是值类型,在作为参数传递时会做数组的复制操作。因此作为参...阅读全文

博文 2016-01-27 13:00:00 haust_wang

Go语言中的数组(array)和数组切片(slice)

在Go语言中,数组长度在定义后就不可更改,在声明时长度可以为一个常量或者一个常量表达式(常量表达式是指在编译期即可计算结果的表达式)。数组的长度是该数组类型的一个内置常量,可以用Go语言的内置函数len()来获取。 数组的长度在定义后无法再次修改;数组是值类型,每次传递都产生一份副本。 初看起来数组切片就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是一个指针。数组切片的数据结构可以抽象为以下3个变量: 一个指向原生数组的指针 数组切片中元素的个数 数组切片已分配的存储空间 从底层实现的角度看,数组切片实际上仍然使用数组来管理元素,基于数组,数组切片添加了一系列管理功能,可以随时动态扩充存放空间,并且可以被随意传递,而不会导致所管理的元素被复制。 下面用 reflect 包来反射...阅读全文

博文 2014-10-28 10:44:53 ghj1976

Go语言中的运算符

## 1 概述 Go语言提供了,算术,关系,逻辑,位,指针,赋值运算符。本篇整体说明一下。 ## 2 算术运算 * \+ 相加 * \- 相减 * \* 相乘 * / 相除 * % 求余 * ++ 自增 * \-\- 自减 几个细节,需要留意一下。 * 整数与浮点数进行运算,会将整数转化为浮点数,再运算。 * 两个整数相除,结果是整数,取整数部分。5/3 结果会是 1。 * 求余,如果被除数或除数存在负数,那么余数与被除数保持一致。此处是求余不是取模。 * ++/--,不区分前后,只有变量后的语法,就是 v++。同时++/--构成语句而不是表达式,意味着不能直接赋值。 ## 3 字符串连接运算 + +运算符,也可以完成字符串的连接运算。 ``` "Hello" + " " + "Hank!"...阅读全文

博文 2018-10-30 22:02:07 hanzkering

Docker-Slim给Images一个苗条身姿

引言 我们通过Dockerfile或者docker build生成的Images往往都很大,对于磁盘空间的占用消耗什么大。因此,docker-slim的出现能够帮助我们精简docker image的体积。 1 docker-slim的介绍: docker-slime需要借助golang环境(推荐使用golang1.10+),点击访问docker-slim官网。 1.1 golang环境的安装配置: cd /opt wget https://dl.google.com/go/go1.10.linux-amd64.tar.gz tar -xzvf go1.10.linux-amd64.tar.gz mkdir -p /usr/local/go cp -rfv /opt/go/* /usr/loc...阅读全文

博文 2018-06-20 16:34:46 cooling2016

Golang 语言中的 Slice

概念 Slice切片是对底层数组Array的封装,在内存中的存储本质就是数组,体现为连续的内存块,Go语言中的数组定义之后,长度就已经固定了,在使用过程中并不能改变其长度,而Slice就可以看做一个长度可变的数组进行使用,最为关键的,是数组在使用的过程中都是值传递,将一个数组赋值给一个新变量或作为方法参数传递时,是将源数组在内存中完全复制了一份,而不是引用源数组在内存中的地址,为了满足内存空间的复用和数组元素的值的一致性的应用需求,Slice出现了,每个Slice都是都源数组在内存中的地址的一个引用,源数组可以衍生出多个Slice,Slice也可以继续衍生Slice,而内存中,始终只有源数组,当然,也有例外,后边再说。 用法 1.Slice的定义 Slice可以通过两种方式定义,一种是从源数...阅读全文

Go语言内存分配机制

前言: 本文是学习<> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请注明出处! Go语言有两种内存分配机制 , 分别是内置函数 new() 和make(). - new() - 定义: func new(Type) * Type - 返回值是一个内存块指针 - new() 是一个内置函数, 不同于其他语言中的new操作符, 它只将内存清零, 而不是初始化内存. - make() - 定义: func make(Type, size IntegerType) Type - 在调用make() 函数时, Type必须是引用类型 (Slice , Map 或 Channel), Intege...阅读全文

boltdb 源码分析-MVCC/持久化-3

boltdb 持久化 在前面简介部分已经描述了一部分持久化相关的内容 boltdb采用单个文件来将数据存储在磁盘上,该文件的前4个page是固定的: 第1个page为meta 第2个page为meta 第3个page是freelist,存储了一个int数组, 第4个page是leaf page page page是boltdb持久化时,与磁盘相关的数据结构。page的大小采用操作系统内存页的大小,即getpagesize系统调用 的返回值,通常是4k大小。 每个page开始的几个字节存储的是page 的raw data: type page struct { id pgid // page的序号 flags uint16 // page的类型,有branchPageFlag/leafPage...阅读全文

Go实践-文件系统操作

由于自己的PC笔记本,用的是可怜的120G SSD硬盘,相对于现在浩瀚无比的WIN7,VS ,硬盘空间少的可怜,经常导致硬盘空间不足。没办法,每次都人肉清除临时文件比如 VS编译时,生成的.obj文件 连接时生成的.pdb文件还有就是,VS2010引入的为了提高智能提示而生成的.sdf文件。 所以想到用程序自动实现这个功能,刚好正在学习go语言,全当练手了。 程序很简单,就是从某个目录递归开始,删除某些类型的文件 //My first go little program that clean dirty files for vs package main import ( "fmt" "os" "path" "strings" ) var FileTypes2Clean = []string...阅读全文

博文 2015-06-18 09:09:15 simonzhao0536

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语言高效的5个特性(1/5): 变量的处理和存储

翻译原文链接 转帖/转载请注明出处 英文原文链接 发表于2014/06/07 我最近受邀在Gocon会议上做了一个演讲。Gocon是一个非常棒的,每半年一次在日本东京举行的Go会议。Gocon 2014是完全由社区举办的一整天活动。它包括了培训以及一个下午的演讲。演讲的主题主要围绕在Go语言在线上环境中的应用。 以下是我的演讲稿。原始的演讲稿强调慢而清楚的演讲,所以我做了略微的修改使得它更具可读性。 这里我要感谢Bill Kennedy,Minux Ma,特别是Josh Bleecher Snyder。Josh为准备这次演讲给予了很多的帮助。 下午好,我的名字叫David。我很高兴今天能够参加Gocon会议。我两年前就打算要参加这个会议,非常感谢会议组织者给我这个演讲的机会。我想让我的演讲以...阅读全文

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