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

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

Golang 优化之路——bitset

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

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

Go中使用Seed得到重复随机数的问题

重复的随机数 废话不多说,首先我们来看使用seed的一个很神奇的现象。 func main() { for i := 0; i < 5; i++ { rand.Seed(time.Now().Unix()) fmt.Println(rand.Intn(100)) } } // 结果如下 // 90 // 90 // 90 // 90 // 90 可能不熟悉seed用法的看到这里会很疑惑,我不是都用了seed吗?为何我随机出来的数字都是一样的?不应该每次都不一样吗? 可能会有人说是你数据的样本空间太小了,OK,我们加大样本空间到10w再试试。 func main() { for i := 0; i < 5; i++ { rand.Seed(time.Now().Unix()) fmt.Prin...阅读全文

博文 2019-10-09 09:02:41 detectiveHLH

谈 Golang 中的字符串和字节数组

Home Menu 谈 Golang 中的字符串和字节数组 11 Mar 2019 字符串 字节 Golang Go实现原理 编译原理 运行时 概述 结构 解析 操作 拼接 类型转换 总结 相关文章 Reference 字符串是 Go 语言中最常用的基础数据类型之一,虽然字符串往往都被看做是一个整体,但是实际上字符串是一片连续的内存空间,我们也可以将它理解成一个由字符组成的数组,Go 语言中另外一个与字符串关系非常密切的类型就是字节(Byte)了,相信各位读者也都非常了解,这里也就不展开介绍。 我们在这一节中就会详细介绍这两种基本类型的实现原理以及它们的转换关系,但是这里还是会将介绍的重点主要放在字符串上,因为这是我们接触最多的一种基本类型并且后者就是一个简单的 uint8 类型,所以会给予...阅读全文

博文 2019-03-19 12:14:33 draveness.me

指针的详细讲解

指针是一个代表着某个内存地址的值, 这个内存地址往往是在内存中存储的另一个变量的值的起始位置. Go语言对指针的支持介于Java语言和 C/C++ 语言之间, 它既没有像Java那样取消了代码对指针的直接操作的能力, 也避免了 C/C++ 中由于对指针的滥用而造成的安全和可靠性问题. ## 指针地址和变量空间 Go语言保留了指针, 但是与C语言指针有所不同. 主要体现在: - 默认值: nil. - 操作符 `&` 取变量地址, `*` 通过指针访问目标对象. - 不支持指针运算, 不支持 `->` 运算符, 直接用 `.` 访问目标成员. 先来看一段代码: ```go package main import "fmt" func main(){ var x int = 99 var p *...阅读全文

博文 2020-04-15 22:52:51 Conan_1996

GO GC 垃圾回收机制

9.6 GO GC 垃圾回收机制 垃圾回收(Garbage Collection,简称GC)是编程语言中提供的内存管理功能。 在传统的系统级编程语言(主要指C/C++)中,程序员定义了一个变量,就是在内存中开辟了一段相应的空间来存值。由于内存是有限的,所以当程序不再需要使用某个变量的时候,就需要销毁该对象并释放其所占用的内存资源,好重新利用这段空间。在C/C++中,释放无用变量内存空间的事情需要由程序员自己来处理。就是说当程序员认为变量没用了,就手动地释放其占用的内存。但是这样显然非常繁琐,如果有所遗漏,就可能造成资源浪费甚至内存泄露。当软件系统比较复杂,变量多的时候程序员往往就忘记释放内存或者在不该释放的时候释放内存了。这对于程序开发人员是一个比较头痛的问题。 为了解决这个问题,后来开发出...阅读全文

博文 2019-02-17 18:00:57 guyan0319

【Golang进阶】指针的详细讲解

指针是一个代表着某个内存地址的值, 这个内存地址往往是在内存中存储的另一个变量的值的起始位置. Go语言对指针的支持介于Java语言和 C/C++ 语言之间, 它既没有像Java那样取消了代码对指针的直接操作的能力, 也避免了 C/C++ 中由于对指针的滥用而造成的安全和可靠性问题. 指针地址和变量空间 Go语言保留了指针, 但是与C语言指针有所不同. 主要体现在: 默认值: nil. 操作符 & 取变量地址, * 通过指针访问目标对象. 不支持指针运算, 不支持 -> 运算符, 直接用 . 访问目标成员. 先来看一段代码: package main import "fmt" func main(){ var x int = 99 var p *int = &x fmt.Println(p)...阅读全文

博文 2020-04-16 03:32:43 尹宁丶

charrt命令如何使用?linux运维系统学习

学习Linux运维的时候,一些盆友总会遇到些问题,他们或是翻阅各类书籍,或是经过搜索各类搜索引擎,或是各种讨论群组,或是各类论坛,通过各式各样的方法来解决着自己面临的学习问题。而学习Linux,重要的便是打好基础,正所谓“基础不牢,地动山摇”。而Linux命令便是这基础中重要的一环了。今天就了解下chattr命令。chattr [+-=] [ASacdistu] 文件或文件名命令选项:+ : 增加某个特殊参数,其他原本存在的参数不动。- : 删除某个特殊参数,其他原本存在的参数不动。= : 设置一定,且仅有后面接的参数A : 当设置了A属性时,这个文件(或目录)的存取时间atime(access)将不可被修改,可避免例如手提电脑有磁盘I/O错误的情况发生。S : 这个功能有点类似sync。就...阅读全文

博文 2019-11-13 16:33:31 zhouzhou2018

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实体 eface eface的具体结构是: 在这里插入图片描述 一共有两个属性构成,一个是类型信息_type,一个是数据信息。 其中,_...阅读全文

博文 2019-05-04 12:34:38 RyuGou

HyperLogLog 算法在监控场景中的运用

HyperLogLog 算法在监控场景中的运用 背景介绍 OpsMind 低代码开发平台监控模块,为了支撑B站众多监控数据的管理场景,研发人员在分布式层做了众多优化工作。为了更好的掌握每个 metric 自身的空间占用以及各个存储节点的时序分布情况,需要对每个指标的时序数目(基数)有一个大致的预估(允许存在误差),以便于 OpsMind 系统能更加合理的均衡各个存储节点的负载。 为何选用 HyperLogLog OpsMind 系统指标的形式与 prometheus 完全兼容(在此 prometheus 基础上做了一些拓展),一个监控指标(metric)的时序数,可以看做是该指标所有 labels 的组合(对 labels 求 fingerprint)数目。在对每个指标时序集合进行统计的过程...阅读全文

博文 2020-03-16 17:38:14 啊哟喂_

QuickBI助你成为分析师-数据门户权限相关

摘要: 数据门户也叫数据产品,起到菜单作用来展示数据,您可以使用数据门户功能构建例如经营分析系统应用等。在创建数据门户时常遇到报表权限问题,请参考本文。 数据门户也叫数据产品,起到菜单作用来展示数据,您可以使用数据门户功能构建例如经营分析系统应用等。在创建数据门户时常遇到报表权限问题,下面针对几个场景分别分析: 场景一 产品标准版是针对个人开发场景,不支持多用户协同开发,但是有时会遇到要求其他用户查看到自己的数据门户,又可以针对仪表板查看进行权限限制。那么问题来了:数据门户支持分享操作,但是分享操作,被分享者可以查看数据门户中所有仪表板,如果才能做到查看部分仪表板限制呢? 1.创建仪表板 创建‘各区域年度利润金额分析’、‘用户订单详情’仪表板。 ![TB1...阅读全文

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

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

博文 2019-03-05 21:34:46 煎鱼

GO-函数学习

函数的声明 go的函数声明通过func这个关键字,params是他的形参设置,result是他的return值 当设置params后调用func必须传入对应函数参数,当设置result后也必须有return,且params和result类型符合声明的 func name(params) (result) { } // 普通函数的声明 func getMax(num1 int, num2 int) (min int, max int) { // 推荐直接赋值给需要return的值 if num1 > num2 { max = num1 min = num2 } else { max = num2 min = num1 } return // 每一个函数必须要有return } 可变参数类型函数...阅读全文

博文 2018-12-02 03:34:40 GGBO0M

Go语言之slice特性

1 slice介绍和说明 golang的数据结构也很多,如List,array,map等,但是有个很特别的数据结构是slice,也叫切片。经常看到很多和数组的定义有关的操作是 make([]string, 10)。那么什么是slice呢?其实slice也算是golang语言特有的数据结构,底层是以数组作为支撑;啥概念呢,就是说在申请一块内存进行数组的存放的时候,slice就像数组对外开放的一扇窗口,让你看到想给你看到的内容。这个比喻还是有些贴切的,但是对于理解slice的内存存储和特性来说还远远不够,在学习一个语言特性的时候,我比较推荐的学习方法是,实践一遍,看看例子,然后再根据自己碰到的问题场景,选择合适的解决方案。那么咱们来看例子和运行结果。2 slice使用例子和特性整数和字符串的sl...阅读全文

博文 2019-01-27 07:34:42 华哥Dean

3. golang的变量整体介绍以及分类

[toc] 任何高级语言,变量都是程序最基本的组成单位. golang中的变量相当于给内存中一个数据的存储空间打一个记号,以后利用这个记号就可以很容易的找到这个存储空间里存放的数据. 一, 变量的基础知识 变量表示内存中一个存储空间 该存储空间的名称就是变量名 申请变量就是申请一个内存的存储空间 申请变量也就是申请内存的存储空间,申请的时候应该指名该存储空间的名称(变量名)以及该存储空间是用来存放什么数据类型(变量的数据类型)的,因为不同的数据类型需要的内存大小不一样,比如申请一个8位的整数的存储空间只需要一个字节,而申请一个64位的整数的存储空间需要8个字节. 申请的存储空间的名称就是变量名,申请存储空间用来存放的数据类型就是变量的数据类型 二,变量的分类 基本数据类型: 数值型 整数类:...阅读全文

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

golang问题interface和nil

interface和nil 上菜代码 package main import ( "fmt" ) func main() { var a interface{} // 获取console输入 fmt.Scan(&a) fmt.Println(a) } 输出结果: console -------------------------> 对比代码 package main import "fmt" func main() { var a string fmt.Scan(&a) fmt.Println(a) } 输出结果: console -------------------------> 123 123 问题描述 第一种情况:编译没有报错,可以执行,但是不能输入。 第二种情况:编译没...阅读全文

博文 2018-07-06 18:34:47 Tim_SSS

DockOne微信分享(八十五):Docker存储方式选型建议

【编者的话】Docker存储方式提供管理分层镜像和容器的可读写层的具体实现。最初Docker仅能在支持AUFS文件系统的Ubuntu 发行版上运行,但是由于AUFS未能加入Linux内核,为了寻求兼容性、扩展性,Docker在内部通过GraphDriver机制这种可扩展的 方式来实现对不同文件系统的支持。本次分享通过一次客户实施案例深入的看看Docker的几种存储方式,并给出一些技术选型的建议。 Docker存储方式: AUFS的介绍及分析Device mapper的介绍及分析OverlayFS的介绍及分析Btrfs的介绍及分析ZFS的介绍及分析 第一部分 问题诊断事情从一次实施项目说起,我们需要帮助客户将他们的应用容器化并在数人云平台上发布此应用。客户的应用是传统WAS应用。应用是通过WA...阅读全文

博文 2017-06-25 16:25:18 Dataman数人科技

golang中slice的注意事项

1. slice本质上是基于数组的一种数据结构(struct),是数组的一种透视。 2. slice的数据结构为: ```go type slice struct { array unsafe.Pointer len int cap int } ``` 请注意, array是一个指针类型。 3. slice作为数组的一部分透视来使用: ```go testArr := [5]int{0, 1, 2, 3, 4} sliceFromArr := testArr[1:3] fmt.Println(sliceFromArr) // [1, 2] sliceFromArr[0] = 11 fmt.Println(testArr) //[0 11 2 3 4] fmt.Printf("len: %d,...阅读全文

2019-07-30

进程 线程 进程是操作系统提供给我们的一个抽象;我们通过创建进程来使用CPU、读写内存/硬盘、进程IO操作。 每个进程最少会有一个线程,通过线程来执行命令,进程下可以通过创建多个线程来加速执行速度,进程下的线程共享进程的各种资源,包括内存,IO等。 线程共享内存带来了方便,但同时共享导致了竞态资源问题;为了解决这个问题,操作系统提供了 Mutex - Mutual Exclusion 互斥锁,降低性能解决共享带来的问题。 线程 协程 当我们创建线程的时候需要 系统调用,内核会创建一个新的线程,这个线程通过操作系统来进行调度。 协程,又叫做用户态线程,顾名思义,是在用户空间创建的线程,golang取消线程,使用协程来替代。 协程相比线程,优点在于占用内存空间小,可以无限制创建;因为是用户进程自...阅读全文

博文 2019-07-30 22:32:42 小程有话说

GO GC 垃圾回收机制

垃圾回收(Garbage Collection,简称GC)是编程语言中提供的内存管理功能。 在传统的系统级编程语言(主要指C/C++)中,程序员定义了一个变量,就是在内存中开辟了一段相应的空间来存值。由于内存是有限的,所以当程序不再需要使用某个变量的时候,就需要销毁该对象并释放其所占用的内存资源,好重新利用这段空间。在C/C++中,释放无用变量内存空间的事情需要由程序员自己来处理。就是说当程序员认为变量没用了,就手动地释放其占用的内存。但是这样显然非常繁琐,如果有所遗漏,就可能造成资源浪费甚至内存泄露。当软件系统比较复杂,变量多的时候程序员往往就忘记释放内存或者在不该释放的时候释放内存了。这对于程序开发人员是一个比较头痛的问题。 为了解决这个问题,后来开发出来的几乎所有新语言(java,py...阅读全文

闭包的思想

思考一个问题: 如何能够在运行的时候控制或者改变一个函数对于输入的行为? 比如在一个函数外部修改一个变量就能改变这个函数的行为? 于是一个称之为闭包的东西出现了。 闭包:函数和引用的外部变量一起构成一个闭包。 ✳注意:如果没有上述目的,不要引用函数外部的变量。把它作为参数传入你的函数。否则你很有可能因此引入意想不到的bug。 如何实现闭包? 下面是golang的实现 以下引自https://hitzhangjie.github.io/jekyll/update/2018/05/19/golang-function-closure%E5%AE%9E%E7%8E%B0%E6%9C%BA%E5%88%B6.html 假如闭包定义后立即被调用 因为只会被使用一次,所以应该力图避免闭包对象的内存分配操...阅读全文

博文 2019-07-12 18:32:40 doob_9117

DAY1 GOLANG(一)变量

先定义再赋值第一种 var i int (var +变量名+变量类型)第二种 (类型推导) var num =10.11第三种 (快速定义并赋值) 省略var,但是必须加 " : " , name : = "tom"等价于 var name string / name = “tom”多变量赋值及赋值var n1,n2,n3 int 或var n1, n2, n3 = "a" , 20 , 988全局变量:在函数外定义的变量 数据值可以再同一类型范围内不断变化加号的使用:数值型则相加,字符型则拼接 浮点(float32 float64):float64 保存精度高字符型:使用比byte来保存单个字符:结构体(struct):相当于类(class)管道(channel):用于多并发切片(slic...阅读全文

博文 2019-10-25 20:32:45 aside section._1OhGeD

【Go语言踩坑系列(二)】字符串

声明 本系列文章并不会停留在Go语言的语法层面,更关注语言特性、学习和使用中出现的问题以及引起的一些思考。 要点 本文关注Go语言字符串相关的语言特性、以及相关的[]byte、[]rune数据类型。 从字符编码说起 ASCII 计算机是为人类服务的,我们自然有表示我们人类所有语言与符号的需求。由于计算机底层实现全部为二进制,为了用计算机表示并存储人类文明所有的符号,我们需要构造一个“符号” => “唯一编码”的映射表,且这个编码能够用二进制来表示。这样就实现了用计算机来表示人类的文字与符号。最早的映射表叫做ASCII码表,如:a => 97。这个相信大家都很熟悉了,它是由美国人发明的,自然首先需要满足容纳所有英文字符的需求,所以并没有考虑其他国家的语言与符号要如何用计算机来表示。但是随着计算...阅读全文

简析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 17:32:56 安静的少女

golang 学习笔记 1.3 基本类型

1.3 基本类型 更明确的数字类型命名,支持 Unicode,支持常用数据结构。 常用数据结构 支持八进制、十六进制,以及科学记数法。标准库 math 定义了各数字类型取值范围。 a, b, c, d := 071, 0x1F, 1e9, math.MinInt16 空指针值 nil,而非 C/C++ NULL。 1.4 引用类型 引用类型包括 slice、map 和 channel。它们有复杂的内部结构,除了申请内存外,还需要初始化相关属性。 内置函数 new 计算类型大小,为其分配 零值内存 ,返回指针。而 make 会被编译器翻译成具体的创建函数,由其分配内存和初始化成员结构,返回 对象 而 非指针。 a := []int{0, 0, 0} // 提供初始化表达式。 a[1] = 10...阅读全文

博文 2019-03-22 05:34:41 Diogoxiang

EOSIO Dawn 4.0 发布

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 关于Dawn 4.0 RAM分配的反馈一些社区成员表示担心,在其他任何人发现之前,有些人会通过购买便宜的内存来获得不合理的利润。为了缓解这种情况,我们建议那些人用一个非常有限的RAM供应来启动一个节点,然后在头几个月内逐步增加内存。如果RAM的供应量从32GB开始,然后在几个月内增长到1TB,那么RAM的价格可能会随着时间的推移而迅速下降到最初定价的3%。只有那些真正需要RAM或者在出价时考虑未来RAM供应的人才会购买初始RAM。无论哪种方式,没有人会获得“便宜”的RAM或“免费利润”。 测试网络状态我们在欧洲,亚洲和美国拥有节点的内部测试网络一直运行良好,没有出现重大问题。 主观CPU资源使用率在过去的几个月中...阅读全文

博文 2019-09-16 11:02:51 链客

内存管理

Golang 的内存管理本质上就是一个内存池,只不过内部做了很多的优化。比如自动伸缩内存池大小,合理的切割内存块等等 内存池 golang的程序在启动初,会一次性向操作系统申请一大块内存,这块内存空间会放在一个叫 mheap 的 struct 中管理,mheap负责将这一整块内存分割成不同部分使用,并将其中一部分分割成合适大小分配给用户使用。 概念 page 内存页 span 内存块,一个或多个连续的 page 组成一个 span object 对象,用来存储一个变量数据,一个span会被分割成相同大小的object 假设 object 的大小是 16B,span 大小是 8K,那么就会把 span 中的 page 就会被初始化 8K / 16B = 512 个 object image.p...阅读全文

博文 2020-02-01 03:32:55 元气蛋蛋

golang的string、map、sclie

slice 切片的原理 切⽚ ( slice ) 是Go中⼀种⽐较特殊的数据结构,这种数据结构更便于使⽤和管理数据集合。 切⽚是围绕动态数组的概念构建的,与数组相⽐切⽚的⻓度是不固定的,可以追加元素,在追加时可能使切⽚的容量增⼤。 Go中的切⽚作为函数参数不是地址传递 func Demo(slice []int) { slice = append(slice, 6, 6, 6) fmt.Println("函数中结果:", slice) } func main() { //定义⼀个切⽚ slice := []int{1, 2, 3, 4, 5} Demo(slice) fmt.Println("定义中结果:", slice) } 结果 函数中结果: [1 2 3 4 5 6 6 6] 定义中结...阅读全文

博文 2020-05-12 19:33:01 强某某

面向接口 - day 3

type Traversal interface { Traverse() } func main() { traversal := getTraversal() traversal.Traverse() } duck typing 描述事物的外部行为而非内部结构 golang类似duck typing golang中接口是由使用者定义的 实现者只需要实现接口的方法就可以 接口的内部实现 接口中包含实现者的类型和实现者的值/实现者的指针 将实现者赋值给接口变量时有两种方式:值赋值和指针赋值 值赋值是将实现者的值赋给接口的内部变量 指针赋值是将实现者的指针赋值给接口的内部变量 接口的指针赋值只能将实现者的指针赋值给接口变量 接口的值赋值既可以将实现者的指针赋值给接口变量又可以将值赋值给接口变量...阅读全文

duck typing

像鸭子走路,像鸭子叫,那么就是鸭子 描述事物外部行为而非内部结构 严格说go属于结构化类型系统,类似duck typing python c++ 中duck typing (只要retriever 具有get方法即可)但是编译运行才知道错误 def download(retriever r): r.get("www.baidu.com") java 中传入参数必须要实现某个接口,不是duck typing 接口定义 download (使用者) retriever(使用者) golang中接口由使用者定义 typpe assertion n, p := reader.Shape() point := p.(*shp.Point) x := point.X y := point.Y 接口变量里...阅读全文

博文 2020-06-08 01:33:14 我真是刚的不像话

在递归生成json路径时所遇到的Slice append操作的问题

我们的需求是为根据json每一个value生成从root到key的path (为了方便说明我们暂时不考虑数组的情况,只考虑object/number/bool/string) 举个例子,对于以下json字符串 { "a": { "b":{ "c":{ "d0": "d0", "d1": "d1", "d2": "d2" } } } } 我们希望最终生成以下形式 a.b.c.d0 = d0 a.b.c.d1 = d1 a.b.c.d2 = d2 为此我们我们定义了以下结构 type Entry struct{ path []string val interface{} } 然后我们通过定义一个递归的函数来执行以下 func RecurseJson(jsonObj interface{}, pa...阅读全文

博文 2019-08-12 11:32:43 Destiny池鱼

线性表之数组

数组是一种线性数据结构。 特点: - 一组连续的内存空间,来存储一组具有相同类型的数据。 时间复杂度: - 查找: O(1) - 插入: O(n) - 删除: O(n) 代码实现: 定义基本的数组结构: type Array struct { data []int length uint } func NewArray(capacity uint) *Array { if capacity == 0 { return nil } return &Array{ data: make([]int, capacity, capacity), length: 0, } } 数组的长度: func (this *Array) Len() uint { return this.length } 是否越界...阅读全文

博文 2019-06-25 16:03:43 五知小白羊

排序(二)

归并排序 归并排序使用分治思想,分支算法一般都是用递归来实现的。 归并排序是一个稳定的排序算法,在merge过程中可以保证值相同的元素在合并前后顺序不变; 归并排序的时间复杂度是O(nlogn),他的执行效率和排序的原始数组的有序成都是无关的,任何情况的时间复杂度都是O(nlogn) 但是归并排序在合并的时候需要借助额外的存储空间,空间复杂度为O(n),所以不是原地排序算法; 快速排序 如果快排的partition函数不使用额外内存空间来进行,则可以做到原地排序; 快排是不稳定的; 虽然快速排序最坏情况的时间复杂度是O(n2),但是平均时间复杂度为O(nlogn),而且最坏情况的概率很小,可以通过合理地选择pivot来避免这种情况; 代码实现(Golang) type Sort struct...阅读全文

博文 2019-12-23 01:32:53 元气蛋蛋

Go语言入门(五)结构体&练习

结构体&练习 结构体 定义 Go中的面向对象是通过 struct来实现的,struct是用户自定义的类型 //定义结构体 /定义结构体 type User struct { Name string Gender string Age int AvatarUrl string } func useStruct() { //初始化结构体1 var user1 User user1.Name = "jeson" user1.Gender = "male" user1.Age = 20 user1.AvatarUrl = "http://baidu.com" //初始化结构体2 user2 := User{ Name: "miky", Gender: "female", Age: 18, } fmt...阅读全文

博文 2020-03-26 23:33:12 wx5b285b48ed74e

Golang 复合数据类型:切片

切片(slice) 切片的底层是数组实现的,可以按需自动增长和缩小。切片是数组的引用,因此是引用类型,不支持直接比较,只能和nil比较。切片的动态增长是通过内建函数append()来实现的,这个函数可以快速且高效地增长切片,也可以通过切片再次切割,缩小每一个切片的大小。 切片不存值,底层数组存值 切片指向一个底层数组 底层数组是占用一块连续的内存空间 创建数组切片 创建两个类型分别为 int 型和 string 型的切片,并初始化 func main(){ var slice1 []int var slice2 []string fmt.Println(slice1,slice2) fmt.Println(slice1 == nil) //true,没有开辟内存空间 fmt.Println(...阅读全文

博文 2020-06-03 15:32:39 sunlingbot