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

垃圾回收面面观

垃圾回收面面观 2015-06-18 下一篇准备写Go1.5的垃圾回收的,所以这一篇先做一些垃圾回收相关的基础知识的铺垫。 基本垃圾回收算法 实际上大多数的垃圾回收算法,都是下面三种基本垃圾回收算法之上的变种。 引用计数(reference counting) 基本思路是为每个对象加一个计数器,记录指向这个对象的引用数量。每次有一个新的引用指向这个对象,计数器加一;反之每次有一个指向这个对象引用被置空或者指向其他对象,计数器减一。当计数器变为 0 的时候,自动删除这个对象。 引用计数的优点是: 相对简单,不需要太多运行时的支持,可以在原生不支持GC的语言里实现。 对象会在成为垃圾的瞬间被释放,不会给正常程序的执行带来额外中断。 它的问题是循环引用,对象A包含一个引用指向对象B,同时对象B包含...阅读全文

[go语言]slice和map

1 slice类型 slice是一个引用类型,是一个动态的指向数组切片的指针。 slice是一个不定长的,总是指向底层的数组array的数据结构。 src/pkg/runtime/runtime.h struct!Slice { // must not move anything byte* array; // actual data uint32 len; // number of elements uint32 cap; // allocated number of elements }; 1)创建slice 动态数组创建,类似创建数组,但是没有指定固定长度 var al []int //创建slice sl := make([]int,10) //创建有10个元素的slice sl:=...阅读全文

博文 2015-06-17 23:07:39 sxt102400

go语言 类型:数组

在go语言中数组array是一组特定长度的有序的元素集合。 go的数组类型由两部分组成——类型和长度,二者缺一不可。数组本来就是一块存储相同类型元素的连续内存空间,因此决定一个数组的类型,必然需要决定其存储元素的类型以及存储多少个元素。 在Go语言中,数组长度在定义后就不可更改。 数组是值类型,每次传递都将产生一份副本。 例子: package main import ( "fmt" "strconv" ) func main() { var a [5]int //定义数组 5个整数型 fmt.Println("emp:", a) //整数型零值为0 a[4] = 100 //修改数组 fmt.Println("set:", a) fmt.Println("get:", a[4]) //输出...阅读全文

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

golang环形队列实现

Summary 什么是环形队列 实现环形队列图示过程 golang版本代码实现过程 参考全部代码 什么是环形队列 在一个指定大小的数组里循环写入数据,借用二个指针分别实现入队标记与出队标记.也体现了指针的大好用处,请深入体会.大有裨益. 如图所示,一个环形队列.含有二个指针: 队列头指针,队列尾指针. 实现环形队列图示过程 初始化一个数组大小为6的环形队列, 头指针front=0, 尾指针rear=0, 刚好front=rear =0的状态,表示环形队列为空. 2.向环形队列里插入1个元素,则rear指针移动一格,front=0,rear=13.继续添加a2,a3,a4,a5元素,rear指针指到末尾处,front=0, reat=54.如果再继续添加a6元素,则rear=6,大于数组大小,...阅读全文

博文 2019-11-08 11:32:46 百里

Go语言之指针篇

发自自己的公众号(灰子学技术)原文链接:https://mp.weixin.qq.com/s/qXi-_e_nuVDnaiPfm2HIHQ一、写在前面的话:在介绍Go的指针之前,我们需要先介绍下,指针是什么?为什么我们需要指针?(备注:这里指的是原始指针。)1.指针是什么?首先指针是一个变量,全名叫做指针变量,只不过这个变量里面存储的值是一个地址而已。所以指针,哪怕是空指针,都是有地址的,因为变量都是有地址的。例子如下:Output:从下面的输出,我们可以看出空指针a的地址是存在,在a指向b之前,指针a的值为nil,指向b之后,数值变成了变量b的地址,而对a 做操作*a的话,数值为变量b对应的数值10。2.为什么我们需要指针?我们之所以需要指针,是因为我们要做间接寻址,就是在程序运行的时候,...阅读全文

博文 2019-09-03 13:47:51 ZhDavis

程序员遇到过的最难兼容性bug

最近看到一个来自国外网站Quora上的热门帖子《What’s the hardest bug you’ve debugged? | 你调试过的最难 BUG 是?》,觉得非常不错,再次分享给大家。这个帖子的原文作者叫做Dave Baggett,伯乐在线 – 熊铎 翻译。以下是故事正文: 回想起这个BUG,仍然让我有些痛苦。作为一个程序员,在发现BUG时,你学会了首先在自己代码中找问题,或许在测试一万次之后,你会把问题归咎于编译器。只有在这所有的都不起作用之后,你才会把问题归咎于硬件。 这是我遭遇一个硬件bug的故事。 抛开别的不说,我曾为《Crash Bandicoot》写存储卡(读写)代码。对于一个自大的游戏程序员,这就像是在公园里散步一样轻松愉快,我认为只要几天就写完了,最终调试用了...阅读全文

Go的单例模式

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。 1.Go实现非线程安全的单例模式(懒汉 就是很懒的单例 哈哈): package singleton type singleton struct { } var instance *singleton func GetInstance() *singleton { if instance == nil { instance = &singleton{} // <--- NOT THREAD SAFE } return instance ...阅读全文

博文 2017-02-10 12:24:07 谢权

golang源码学习之slice

数据结构 type slice struct { array unsafe.Pointer // 指向数组 len int // 元素个数 cap int // slice第一个元素到底层数组的最后一个元素的长度 } 注:slice大小为多少呢? 24 byte 创建 func makeslice(et *_type, len, cap int) slice { maxElements := maxSliceCap(et.size) // 检验slice的长度、容量 if len < 0 || uintptr(len) > maxElements { panicmakeslicelen() } if cap < len || uintptr(cap) > maxElements { pani...阅读全文

博文 2019-07-18 11:32:46 ihornet

重温一遍数据结构之线性表(golang版)

目的 因为最近工作中碰到了一些关于数据结构的问题,发现有些生疏了,所以想重新自己再理一遍,就当是给自己的记录,之所以用golang主要也是因为对goalng比较感兴趣,写起来也比较顺手。本意也不是想分享关于什么是数据结构,因为这种概念性的东西没有什么太大意义,其实最重要的是让自己能看懂自己写了些什么,但是代码中写了非常详细的注释,所以基本都是以代码为主 线性表之顺序存储结构 以下代码是线性表中的顺序存储结构,基本略去了些容错的考虑,还是以实现功能为主 package main //线性表中的顺序存储结构 import ( "fmt" ) // 线性表中存储的数据类型 type Elem int type SqList struct { //最大长度 maxsize int // 当前长度 l...阅读全文

博文 2017-11-19 15:05:03 woshicixide

go 速学 - 07 - Slice

目录 切片 Slice 概念 创建 Slice 定义切片 指定范围创建切片 使用 make 创建切片 len和 cap 遍历 Reslice Append 概念 使用 Copy 摘要 切片和数组的区别,创建切片,指定范围,make,遍历,reslice,append,copy 切片 Slice 概念 切片本身不是数组,而是指向底层的数组,关联数组的局部或全部 切片是引用类型 创建切片时索引不能超过数组的大小,否则会报异常 创建 Slice 定义切片 定义时不用指定长度(指定长度或使用 “…” 表示的是数组) //切片 var s []int fmt.Println(s) //[] //数组 var arr [5]int fmt.Println(arr) //[0 0 0 0 0] 指定范围创...阅读全文

博文 2015-05-06 23:00:15 mrseasons

Functional Go: HAMT 简介

在之前的一个系列的文章里,我们从基本原理开始,一步步实现了基于 Vector Trie 的持久化 List 数据结构。 接下来将要研究的是使用 HAMT 这一数据结构实现持久化 Hash Table。 持久化数据结构简介 这篇文章里, 我们对比各种可以用来实现持久化数据结构的方案,详细介绍了 Vector Trie 这种数据结构,说明了用它实现 List 优势。 HAMT 的全称是 Hash Array Mapped Trie,它和 Vector Trie 一样,都利用了前缀树(Trie)这种数据结构作为底层数据结构, 但是由于 Map 本身和 List 之间性质的差别,HAMT 在很多方面进行了特别的处理。接下来我们先从原始 Hash Table 数据结构谈起, 逐步引出 HAMT 的设计...阅读全文

golang中的数组切片

概念:基于数组,数组切片添加了一系列管理功能,可以随时动态扩充存放空间,并且不会导致所管理的元素被重复复制。创建数组切片:方法一,基于数组:package main import "fmt" func main() { //define an array var myArray [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //create a slice based on array var mySlice []int = myArray[:5] fmt.Println("Elements of myArray: ") for _, v := range myArray { fmt.Print(v, " ") } fmt.Println(...阅读全文

博文 2017-02-09 18:26:00 yeleven

LotusDB-高性能 kv 数据库LotusDB

lotusdb 是一个结合 LSM 和 B+ 树优势的 kv 存储引擎,具备读写快速稳定、读写放大和空间放大极低、简洁优雅的特点。 https://github.com/flower-corp/lotusdb 有以下几大特点你可以学习: 1、代码简洁规范 2、涵盖大多数 Go 语言基础用法和高级特性 3、单元测试技巧 4、理解和实践常见 kv 存储模型(LSM 和 B+ 树) 5、数据库设计理念 6、底层基础知识实践(操作系统、文件、磁盘) ...阅读全文

开源项目 2022-01-22 16:56:48 roseduan

golang中用slice实现queue

实现一 最直观的实现,用一个slice。 type Queue struct { s []*valueType } func (q *Queue) pushBack(v *valueType) { s = append(s, v) } func (q *Queue) popFront() *valueType { if len(s) == 0 { return nil } v := s[0] s[0] = nil s = s[1:] return v } 这有个问题,Queue中的slice所占的内存并不会随着popFront操作而释放,已经出队的元素所占的内存仍在slice底层的数组中保留,内存占用会越来越多。 实现二 用两个slice构造一个queue,在go net.http.tran...阅读全文

博文 2019-12-10 01:32:39 劫客轮蹲

golang如何truncate日志文件

有时候我们生成的日志文件很大,如果文件过大,或者磁盘空间有限,那么我们就需要把日志文件改小一点。 (当然实际应用场景中,一般采用log rotate的方式实现多个日志文件,定期把旧的日志文件挪走或者删除) 现在我们考虑如何把日志文件变小的场景。 首先想到的是文件truncate,遗憾的是truncate是把新的内容删掉,而不是把旧的内容删掉;因为通常我们的做法是要把旧的日志内容删除,而保留最新的日志内容。 方法1:拷贝文件,然后把前半部分删除,保留新的后半部分 $ wc -l logfile $ tail -n {LINENUM}/2 logfile > logfile2 $ mv logfile2 logfile 缺点是需要额外的临时磁盘空间(logfile2),保留新拷贝的文件 方法2:...阅读全文

博文 2018-07-04 10:34:46 CodeGeek

阿里讲师带你一步步学习分步式文件存储系统技术及实现

课程介绍 本课程针对分步式文件存储系统的实现进行讲解,首先分析为什么要使用这种分步式存储系统,以及这种系统在设计时需要注意的问题,并比较现在市面常见的分步式存储系统(HDFS、Ceph等),展示阿里Pangu系统针对其中问题的解决方法,并结合Pangu系统说明分步式存储系统的设计要点。 讲师介绍 姚文辉,2009年加入阿里巴巴,从事阿里巴巴自主研发的云计算平台—飞天分布式操作系统中的分布式存储系统—盘古。 课程目标 • 学习分步式文件存储系统的实现 适合人群 • 云计算开发者 课时列表 • 课时1:分布式存储客观需求 • 课时2:小概率事件对分布式系统的挑战 • 课时3:常见分布式系统-终版 • 课时4:分布式设计要...阅读全文

go基本语法学习笔记之类型

整形 类型转换举例 var ia int64 = 54345 var ib int32 ib = int32(ia) fmt.Println("ibis", ib) 浮点形 go语言定义了两个浮点型 float32 等价于C语言的float类型, float64 等价于C语言的double类型 浮点数的比较 math.Fdim(f1, f2) < p p为定义的精度 如 0.00000001 字符串 var str1 string str1 = "this is first string" str2 := "this is second string" str3 := str1 + str2 fmt.Printf("the string str3: %s \n len: %d \n firs...阅读全文

博文 2016-01-28 12:00:01 wolgame

【云存储】对象存储管理与安全

课程介绍 为降低云服务器负载和成本,一般需要将网站静态资源、图片、音视频、日志、下载资源等海量文件存储在更低单价的存储类型上,并配合CDN、图片处理、媒体转码、数据处理等服务,给客户提供更好的体验和更多服务。 本课程主要讲解海量、安全、低成本、高可靠的云存储服务——对象存储的常用操作,包括在云端存储静态资源,并通过控制台、API实现资源的上传下载,以及如何确保云端存储资源的安全。 学员受益: * 云存储常用操作:通过学习和在线实验,了解并掌握云存储的基本知识,以及常用的存储操作,为构建高可用网站打下基础。 * 模式真实场景:包含的两个在线实验一步一步带领你在Web开发中实现网站图片和文件的存储与下载。 * 认证证书:考试通过即可获得证书,证明自己拥有云存储...阅读全文

Chaos Mesh - 让时间在容器中自由摇摆

Chaos Mesh 是最近开源的 Kubernetes 混沌测试平台,并且最近支持了 TimeChaos 的新功能,用来模拟 Time skew 的情况,通常情况下,我们知道直接修在容器中修改时间,会影响整个物理节点, 这不是我们想要的,那么 Chaos Mesh 是如何解决这个问题的呢?接下来就让我们一起探索一下 Chaos Mesh 是如何在容器中让时间自由摇摆起来的! Time skew 是什么? Time Skew 直接翻译就是时间偏移,白话一点就是我们从节点上获取的时间和当前真实的时间出现偏差。 为什么需要模拟 Time skew 呢? 分布式数据库要实现全局一致性快照,需要解决不同节点之间时钟一致的问题。工业界目前有三种解决方案: 全局集中式授时服务 混合逻辑时钟(HLC) 原...阅读全文

博文 2020-03-24 00:32:44 CwenYin

Golang、python中的字符串、slice、list性能研究。

1:在go语言中,先来看创建slice的性能分析,我们知道slice有append这个功能 t := time.Now() m := []string{} for i := 0; i < 1000000; i++ { m = append(m, strconv.Itoa(i)) } fmt.Println(time.Now().Sub(t)) 可以看到添加了1000000项,花费时间368.0211ms。 我们也可以自己先定义一个具有固定长度的silice: t := time.Now() m:=make([]string,1000000) for i := 0; i < 1000000; i++ { m[i]=strconv.Itoa(i) } fmt.Println(time.Now()...阅读全文

博文 2017-03-29 04:00:37 大洋的顶端

[新品发布]全球首个百万IOPS云盘来了 阿里云推出超高性能云盘ESSD

摘要: 搭配ECS云服务器使用, ESSD可提供单盘高达100万IOPS的随机读写能力和低至0.1毫秒的单路时延,相比SSD云盘分别提升了50倍性能上限和降低80%读写时延,单台云服务器整体存储性能提升500%. 点此查看原文:http://click.aliyun.com/m/40293/ **阿里云发布超高性能ESSD云盘 100万IOPS随机读写刷新纪录** 1月9日,阿里云正式推出全球首个跨入IOPS百万时代的云盘——ESSD,单盘IOPS高达100万,这是阿里云迄今为止性能最强的企业级块存储服务。 搭配ECS云服务器使用, ESSD可提供单盘高达100万IOPS的随机读写能力和低至0.1毫秒的单路时延,相比SSD云盘分别提升了50倍性能上限和降低80%读...阅读全文

Golang使用Map的正确姿势

初始化后再使用 Golang中,map是引用类型,如切片一样,通过下面的代码声明后指向的是nil,所以千万别直接声明后就使用,新手可能经常会犯如下错误: var m map[string]string m["result"] = "result" 由于字典是引用类型,所以当我们仅声明而不初始化一个字典类型的变量的时候,他的值是nil。对值为nil的字段除添加键值对外其他操作都不会引发错误。上面的第一行代码对其进行写入操作,就是对空指针的引用,这将会造成一个painc。所以,得记得用 make函数对其进行分配内存和初始化: m := make(map[string]string) 并发安全 并发安全也叫线程安全,在并发中出现了数据的丢失,称为并发不安全我们都知道非原子操作的都不是并发安全的,在...阅读全文

博文 2019-04-19 11:34:44 柳浪闻笛

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 阿里云云栖社区

Derek解读Bytom源码-持久化存储LevelDB

作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 本章介绍Derek解读-Bytom源码分析-创世区块 作者使用MacOS操作系统,其他平台也大同小异 Golang Version: 1.8 创世区块介绍 区块链里的第一个区块创被称为创世区块。它是区块链里面所有区块的共同祖先。 在比原链中创世区块被硬编码到bytomd中,每一个比原节点都始于同一个创世区块,这能确保创世区块不会被改变。每个节点都把创世区块作为区块链的首区块,从而构建了一个安全的、可信的区块链。 获取创世区块 ./bytomcli get-block 0 { "bits": 21...阅读全文

博文 2018-09-11 16:35:11 比原链Bytom

用Go写一个聊天软件

周末闲来无事,想着深入了解一下Go的socket编程,就试着写了个聊天软件,为了缩短战线,没有写UI,只是在终端中进行交互,所以如果一个用户和多个用户聊天的话,要打开多个终端进行…… 目前缺陷很多: 1. 没实现长连接的超时机制,所以如若一个用长时间占用资源而不聊天,服务端没办法踢下线 2. 由于没有存储用户信息,没有办法存储聊天记录 3. 因为没有UI,更谈不上用户体验 4. 没有对登录的用户进行流控处理,进入的人太多,server端必定crash掉…… 5. TCP连接没有走加密通道 此处省略一万字…… 总之,缺陷很多,但是无妨,以后慢慢改进,想到哪里就写到那里。 感兴趣的小伙伴,不妨加个star,能更方便的看到我得每次提交,以及增加的一些新东西。 ### 效果: ![效果图](http...阅读全文

博文 2020-01-01 15:46:29 zhangwei

Derek解读Bytom源码-创世区块

作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 本章介绍Derek解读-Bytom源码分析-创世区块 作者使用MacOS操作系统,其他平台也大同小异Golang Version: 1.8 创世区块介绍 区块链里的第一个区块创被称为创世区块。它是区块链里面所有区块的共同祖先。 在比原链中创世区块被硬编码到bytomd中,每一个比原节点都始于同一个创世区块,这能确保创世区块不会被改变。每个节点都把创世区块作为区块链的首区块,从而构建了一个安全的、可信的区块链。 获取创世区块 ./bytomcli get-block 0 { "bits": 2161727821...阅读全文

博文 2018-08-28 11:35:14 比原链Bytom

常见登录验证机制

http://www.golang.ltd/forum.php?mod=viewthread&tid=7215&from=portal | 常见登录验证机制 HTTP Basic Auth HTTP Basic Auth 简单点说明就是每次请求 API 时都提供用户的 username 和 password,简言之,Basic Auth 是最简单的认证方式,只需提供用户名密码即可,但由于有把用户名密码暴露给第三方客户端的风险,在生产环境下被使用的越来越少。因此,尽量避免采用 HTTP Basic Auth。 OAuth OAuth(开放授权)是一个开放的授权标准,允许用户让第三方应用访问该用户在某一web服务上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用...阅读全文

博文 2019-04-03 15:34:42 Golang语言社区

Golang编程基础- 准备篇

Golang是google发布的开源编程语言,这里就不对其进行过多介绍,网上有很多文章已经把它的前身后世都介绍的很清楚了,有兴趣的可以去查阅,前几天刚开始接触Golang的开发,今天抽空在开发之余对其做一些整理,今天要说的就是Golang的基本数据类型。 单纯的介绍数据类型,没有任何意义,无非就是几几个类型,明白表示什么意思,但是一门语言要设置那么一些数据类型肯定是有它的原因的。我们需要了解一下不同的数据类型在内存中的形式。 首先来了解几个概念,bit(比特位),byte(字节),word(字)这三个概念以及它们之间的关系。 计算机是很多电路的集成,在计算机中每一个闭合电路只有 0, 1两种状态。所以数据在计算机中是以二进制(只有0和1组成)形式存在的。所以计算机的本质就是就是对0,1的操作...阅读全文

博文 2015-06-17 20:02:15 jameslong108159

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以杭州为例,其...阅读全文

存储IO加强型实例I1+D1 ——为极致存储性能要求场景而生

摘要: 企业客户广泛使用数据库、分布式缓存、ELK(Elasticsearch、Logstash和Kibana)日志分析和大数据等系统,对小IO随机读写IOPS和延时,以及大IO存储吞吐Throughput等提出了严格的要求。 企业客户广泛使用数据库、分布式缓存、ELK(Elasticsearch、Logstash和Kibana)日志分析和大数据等系统,对小IO随机读写IOPS和延时,以及大IO存储吞吐Throughput等提出了严格的要求。而当前高效云盘或SSD云盘存储在性能、成本等方面,还无法很好地满足企业客户存储严苛场景下的要求,成为制约企业客户上云的关键瓶颈。 针对此问题,阿里云ECS企业级产品线推出存储IO加强型实例I1(本地SSD型)和D1/D1NE(大数据型),为客户提...阅读全文

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是数组的一个区间...阅读全文

Derek解读Bytom源码-创世区块

作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 本章介绍Derek解读-Bytom源码分析-创世区块 作者使用MacOS操作系统,其他平台也大同小异 Golang Version: 1.8 创世区块介绍 区块链里的第一个区块创被称为创世区块。它是区块链里面所有区块的共同祖先。 在比原链中创世区块被硬编码到bytomd中,每一个比原节点都始于同一个创世区块,这能确保创世区块不会被改变。每个节点都把创世区块作为区块链的首区块,从而构建了一个安全的、可信的区块链。 获取创世区块 ./bytomcli get-block 0 { "bits": 21...阅读全文

博文 2018-09-11 16:35:11 比原链Bytom

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 国南之境

高性能Vs性价比,总有一款适合你,阿里云NAS家族深度解析

摘要: 在今年召开的“2017杭州·云栖大会”上,阿里云文件存储(Network Attached Storage,简称NAS)再次释放技术红利,降价幅度达46%,再次成为云上存储的性价比标杆。阿里云NAS是具备无限容量及性能扩展、单一命名空间、多共享、高可靠和高可用等特性的分布式文件系统。不仅是性价比,阿里云NAS家族还提供了适合各个企业场景的产品,来满足用户需求。 在此,笔者就来为大家一一解析整个阿里云NAS家族。 阿里云NAS文件存储共有三种类型:性能型,容量型和NAS Plus。 1、通用型NAS – (性能型/容量型)类型 NAS性能型使用SSD作为存储介质,为应用工作负载提供高吞吐量与IOPS、低时延的存储性能。 NAS容量型使用SATA HDD作为存储介质,以更低的成...阅读全文

Rancher 用户安装 Rainbond

本文适用于正在使用 Rancher 或对 Rancher 有所了解的用户 Rancher,Kubernetes 生态中成功的开源项目,其定位 “Run Kubernetes Everywhere”。Rancher 可以帮助开发者快速搭建云、边、端多维度的 Kubernetes 集群,并提供多个集群资源 UI 化的管理体系。 Rainbond 定位“企业应用全生命周期管理“,类似于 Rancher 的定位说法应该是“Run Application Everywhere”。Rainbond 的开源用户一直一来都面临一个缺陷,就是集群监控、可视化管理方面 Rainbond 的开源版本不提供。因此结合 Rancher 不失是一个开源场景中的解决方式。 对于 Rancher 的用户而言,你或许可以尝试...阅读全文

博文 2020-05-19 10:32:53 好雨科技

简析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 神奇的考拉

容器中运行有状态服务 Kubernetes Says “Yes!”

**编者按:本文作者是 Diamanti 的产品 VP Mark Balch,他将更多的分享他们向 Kubernetes做出的一些贡献。这篇文章是关于 Kubernetes 1.3 新功能的一系列深入文章中的第五篇。** 首先,祝贺 Kubernetes 社区最近又发布了一个带来丰富价值的版本。对有状态应用和联邦集群的更好支持,是我对 Kubernetes 1.3 版本如此兴奋的两个主要原因。 Kubernetes对有状态应用的支持是非常关键的,比如 Cassandra,Kafka 和 MongoDB。一些重要的服务都会依赖于数据库,键值存储、消息队列等其他存储服务。 此外,随着应用访问量的不断增加,可能需要服务于全球数以百万计的用户,而依赖于一个数据中心或容器集群将无法...阅读全文

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

分步式文件存储系统技术及实现

课程介绍 本课程针对分步式文件存储系统的实现进行讲解,首先分析为什么要使用这种分步式存储系统,以及这种系统在设计时需要注意的问题,并比较现在市面常见的分步式存储系统(HDFS、Ceph等),展示阿里Pangu系统针对其中问题的解决方法,并结合Pangu系统说明分步式存储系统的设计要点。 讲师介绍 姚文辉,2009年加入阿里巴巴,从事阿里巴巴自主研发的云计算平台—飞天分布式操作系统中的分布式存储系统—盘古。 课程目标 • 学习分步式文件存储系统的实现 适合人群 • 云计算开发者 课时列表 • 课时1:分布式存储客观需求 • 课时2:小概率事件对分布式系统的挑战 • 课时3:常见分布式系统-终版 • 课时4:分布式设计要...阅读全文