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

Fox.ONE 中文周报第7周

每周二定时更新的FoxOne周报 (≧∇≦) ,但是这次延误了,因为微信每天只能发一篇文章,昨天把份额用掉了。 周报汇总 FoxOne 团队的每周开发进度和团队动态 团队和社区在交流沟通过程中积淀下来的宝贵想法 以及业内动态中与 FoxOne 团队密切相关的部分 以下为本周周报详情: 1 开发与发布进度 1.1 桌面客户端 本周在进行基础组件重构的同时,发布了最后一个 Legacy 架构版本。该版本修复了 1.6.0 中的一些细微的错误,还增加了一些便利的功能来提高可用性。发布详情请查阅发布日志。 1.2 移动客户端 本周发布了第二个团队内部测试版本,已经成功对接基本的行情和资讯功能。接下来产品团队会与移动客户端团队共同打磨,确保本月底最终发布版的用户体验 1.3 后端与数据 本周后端和数据...阅读全文

程序员怎么会不知道 C10K 问题呢?

今天简单说下C10K 的问题,关于这个问题Ruby 的作者松本行弘在《代码的未来》- 云计算时代的编程 一章中有详细的阐述, 有兴趣的同学可以直接去购买。本人已经在某淘,购买一本 哈哈哈~~~ 在做技术规划和架构设计的时候,不要做过度设计,如果咱们只有一万用户,先别去操百万用户在线的心。淘宝那么大,也是从 Apache、PHP、MySql 发展起来的, 没人能预见到淘宝能发展到这样一个规模,一旦发展起来,业务的爆发增长会驱动技术的迅速发展,在业务还不及格的时候,不用为技术的未来担心。 这个思路在业务领域不会有太大的问题,因为需求的变化实在太快了,需要实时去应付。但在底层技术的发展上,我们就有可能遇到短视的报复,比如:这个数据长度不会超过16位吧,这个程序不可能使用到2000年吧。于是就有了千...阅读全文

Go 语言 make & new

make 与 new 都是 Go 语言分配变量内存的方式,其中 make 主要针对 slice、map 与 chan 变量类型的内存分配以及相应内部结构的初始化,而 new 可以申请任何类型变量内存,但是拿到内存后会赋零值,他对于 slice、map 以及 chan 类型变量的申请没有太大意义。下面依据实际示例对这两种内存分配方式的区别进行个简单分析。 分配 sclie var s0 []int s0 = append(s0, 10) fmt.Println(&s0, s0) s1 := new([]int) *s1 = append(*s1, 10) fmt.Println(s1, *s1) s2 := make([]int, 0) s2 = append(s2, 10) fmt.Prin...阅读全文

博文 2015-12-10 16:00:31 u013148156

大规模指标储存平台Uber M3

M3  是 Uber 开源的一个基于分布式时序数据库 M3DB 构建的度量平台,可每秒聚合 5 亿个指标,并且以每秒 2000 万笔的速度持续存储这些结果。 M3 目前拥有超过 66 亿条时序数据,每秒聚合5亿个指标,并在全球范围内每秒持续存储 2000 万个指标(使用 M3DB),批量写入将每个指标持久保存到不同区域的三个副本中。它还允许工程师编写度量策略,以不同的时间长度和不同粒度对资料进行保存。这使得工程师和数据科学家能以不同的留存规则,精细和智能地存储有不同保留需求的时序数据。 基于 Uber 日益增长的度量存储工作负载的经验,M3 具备以下特性: 优化指标管道的每个部分,为工程师提供尽可能多的存储空间,以实现最少的硬件支出成本。 通过自定义压缩算法 [M3TSZ](...阅读全文

Go圣经-学习笔记入门bufio.Writer

Go圣经-学习笔记入门bufio.Scanner bufio标准库中的Reader和Writer,最好用于文件IO操作,把数据先缓存到内存中,然后再整体做文件IO操作,尽最大可能地减少磁盘IO,但是内存缓冲区的大小要合理设置,默认大小是4096个字节。 bufio.Writer使用 bufio标准库中的Writer提供的方法列表 type Writer struct { err error buf []byte n int wr io.Writer } // 实例化bufio.Writer, 实例化是会直接分配大小为len(w.buf)大小的内存空间,Writer.n表示内存缓冲区已经存放的字节大小 func NewWriter(w io.Writer) *Writer func NewWr...阅读全文

博文 2017-10-22 00:31:17 cdh0805010

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的指针类型,unsafe.Pointer类型和uintptr类型的区别

一,区别 1,指针类型 golang支持指针类型,指针类型的变量存的是一个内存地址,这个地址指向的内存空间存的才是一个具体的值。 比如int,int32,A(自定义结构体类型),string等,都是指针类型。 golang的指针类型和c/c++的指针类型基本一样,但是多了几个限制: 1,int,int32等不同的指针类型不能相互转化. 2,指针类型不支持c/c++这样的指针运算。 2,unsafe.Pointer类型 这个类型比较重要,它是实现定位和读写的内存的基础。go runtime大量使用它。官方解释是: Pointer represents a pointer to an arbitrary type. There are four special operations availa...阅读全文

博文 2020-05-02 23:33:10 舒小贱

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

1. 重复的随机数 废话不多说,首先我们来看使用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()) f...阅读全文

博文 2019-10-08 20:34:28 SH的全栈笔记

Fox.ONE 中文周报第6周

(原文于2018年5月7日更新)每周不定时更新的 Fox.ONE 周报 周报会汇总 FoxOne 团队的每周开发进度和团队动态 团队和社区在交流沟通过程中积淀下来的宝贵想法 以及业内动态中与 FoxOne 团队密切相关的部分 以下为本周周报详情: 1 开发与发布进度 1.1 macOS & Windows 本周没有新迭代发布。正如上周周报所规划,本周桌面端按期完成了代码的重构,在崭新并坚实的架构之上,即将开始对新需求的承接。 1.2 后端 & 数据团队 本周后端团队有一位资深工程师入职。团队依然在围绕实时通道、Order book、TradeHistory 等需求展开研发工作: 对 FoxOne 数据爬虫框架进行架构调整,完成对长连接数据的支持 完成爬虫集群化 即将以币安和火币为实例来进行实...阅读全文

博文 2018-09-24 11:34:40 FoxOne

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

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

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

Go语言结构struct(普及golang)

/*640*60,创建于2013-5-24*/ var cpro_id = "u1290382"; 1.struct 简洁 这个的struct和C语言的很相似,模拟出class的功能,但是不完全的!没有构造函数等! 2.struct的申明 [php] package main import "fmt" type Person struct { Age int Name string } func main() { //初始化两种 a := Person{} a.Age = 2 a.Name = "widuu" fmt.Println(a) b := Person{ Age: 24, Name: "widuu", } fmt.Println(b) } [/php] 3.go指针操作 如下我们要...阅读全文

英美重视IoT安全,漏洞披露和安全人才培养

摘要: 美参议员提出《物联网网络安全改善法案》,国政府推出“网络学校计划”,投资2000万英镑培养网络安全人才,美国司法部发布框架 引导企业建立“漏洞披露计划”,美国大选投票机在ebay上出售包含65万选民个人信息。 【全球政策趋势】 美参议员提出《物联网网络安全改善法案》,提高政府设备采购安全门槛。点击查看原文 概要:近日,美国数位参议院议员提出《物联网网络安全改善法案》,希望立法规范联邦政府采购的物联网(以下简称IoT)设备的安全标准,。该法案要求IoT厂商保证出售给政府的装置可修补漏洞,不可使用固定密码,杜绝已知安全漏洞;要求使用IoT的部门清点装置并建立安全要求。 点评:参议员表示,希望通过政府采购“...阅读全文

剖析使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 曼托斯

使用 Golang 操作 Linux Namespaces

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

Go语言中的运算符

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

博文 2018-10-28 07:35:08 小韩说课

初识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}},如果不知道数组的个数,而是按照...阅读全文

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

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

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

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 指针

package mainimport "fmt"//============================================//指针基本概念//指针:就是地址,指向内存地址空间,这个地址往往是在内存中存储的另一个变量的值的起始位置//指针变量:即存储地址的变量//go指针特点//1,默认值:nil//2,&取变量地址//3,*取目标对象的值//4,直接用.来访问成员/*func main() {//代码段01-解释&,*号的应用var num = 100 //声明int 类型numfmt.Printf("&a=%p\n", &num) //输出:&a=0xc042050080//代码段02-声明指针类型var p *int=nilp=&numfmt.Printf("a=%d,...阅读全文

博文 2018-08-12 21:35:12 中华虎

空结构体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语言内存分配机制

前言: 本文是学习<> -- 清华大学出版社(王鹏 编著) 的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...阅读全文

Golang 语言中的 Slice

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

切片的内部实现

最近比较忙也没有时间打理专栏,今天决定写一个关于切片的内部实现。 ---- 内部实现 ---- Go中的切片是一种数据结构,切片可以按照自己的方式增长或者减短,切片是一个很小的结构,在我的64位电脑上只有24字节,切片有三个字段如下: type slice struct { array unsafe.Pointer len int cap int } 阅读全文

博文 2017-08-10 00:54:32 诺唯

Golang 数据结构之【4.7环形队列】

package main import ( "errors" "fmt" ) //循环队列 const ( MaxSize int = 20 // 存储空间初始分配量 ) type QElemType int // QElemType类型根据实际情况而定,这里假设为int // 循环队列的顺序存储结构 type SqQueue struct { data [MaxSize]QElemType front int //头指针 rear int //尾指针 } //初始化队列 func (q *SqQueue) InitQueue() { q.front = 0 q.rear = 0 } //清空队列 func (q *SqQueue) ClearQueue() { q.front = 0 q....阅读全文

博文 2019-05-17 06:34:40 JiBadBoy

go中的引用类型

首先,go中的赋值,都是值传递 a := 1 b := a x := Struct{} y := x 复制代码他们都是在内存中有独立空间的,也就是copy的过程,所以这里对y的某个属性的改动,并不会影响x 那么我们要让两个变量指向同一个内存怎么办呢,可以使用引用类型: y := &x 复制代码这时候,y的类型是*Struct,这时候我们可以对y进行修改,修改完之后,x也会发现变化,因为y现在是一个引用类型,他指向的是x结构体所在的内存 我们可以通过: y.variable = xxx 复制代码来直接调用引用类型的结构体赋值,但是要注意的是,这是go的语法糖,他只是帮助我们简化了通过指针来获取实际内存的过程,完整的写法应该是这样的: (*y).variable = xxx 复制代码*y是对指针...阅读全文

以太坊源码分析—账户的管理

前言 以太坊是一个巨大的状态机,在网络中,每一个全节点都保存着以太坊状态机的全部历史,只要愿意,我们可以查询到任何时刻的状态(黄皮书中 World State),其中账户状态便是其中的一部分,这部分功能由主要由state包提供 基本概念 账户地址 在以太坊中,无论是外部账户还是合约账户,都以一个160bit的数组表示地址,它是由特定椭圆曲线上的一个点表示的公钥经过Keccak Hash算法截取而来。 外部账户和合约账户的区别 账户内容 以太坊中,账户用 Account 表示 type Account struct { Nonce uint64 Balance *big.Int Root common.Hash CodeHash []byte } Nonce:账户发起交易的次数 Balance...阅读全文

博文 2018-11-13 19:34:40 187J3X1

boltdb 源码分析-简介-0

boltdb boltdb是一款golang实现的嵌入式K-V存储引擎。在boltdb的源码中的doc.go 对其有一个简要的说明。 其提供事务、ACID语言、无锁MVCC支持。数据提供零拷贝、B-TREE索引。其主要设计源于Howard Chu的LMDB。 持久化 boltdb采用一个单独的文件作为持久化存储。其将不同的文件部分划分为不同的page,不同的page 存储不同类型的数据(meta、key、value)等。当经过反复的增删改查后,文件中可能出现没有数据的 部分。此时boltdb并不打算搬移数据、截断文件来将多余的空间返还给操作系统。而是将这些部分, 加入内部的FreeList来维护,当有新的数据写入时,复用这些空间。因此从用户视角来看,boltdb 的持久化文件只会增大,而不会...阅读全文

Go语言之数组/Slice篇

自“灰子学技术”公众号原文链接:https://mp.weixin.qq.com/s/UDsbIcQMl57ROgBij8xxzQ一、数组的语法介绍Go中的数组与C++中的数组含义并无不同,表示的都是具有相同唯一数据类型的一组已经编号并且长度固定的数组项序列。```var varName [SIZE]type // 备注:该格式是声明格式,变量名 + 数组大小 + 数据类型```数组初始化:数组的初始化基本上是以下例子中的几种格式```package mainimport ("fmt")func main() { var name0s [2]string = [2]string{"hello","shanghai"} var names = [...]string{"hello", "wor...阅读全文

博文 2019-09-06 18:25:48 ZhDavis

golang 生成二维码海报

生成带头像的二维码 import ( "errors" "fmt" "github.com/nfnt/resize" "github.com/skip2/go-qrcode" "image" "image/draw" "image/png" "os" ) var err error func createAvatar() (image.Image, error) { var ( bgImg image.Image offset image.Point avatarFile *os.File avatarImg image.Image ) bgImg, err = createQrCode("http://www.baidu.com") if err != nil { fmt.Println(...阅读全文

垃圾回收面面观

垃圾回收面面观 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

Go语言结构struct

/*640*60,创建于2013-5-24*/ var cpro_id = "u1290382"; 1.struct 简洁 这个的struct和C语言的很相似,模拟出class的功能,但是不完全的!没有构造函数等! 2.struct的申明 [php] package main import "fmt" type Person struct { Age int Name string } func main() { //初始化两种 a := Person{} a.Age = 2 a.Name = "widuu" fmt.Println(a) b := Person{ Age: 24, Name: "widuu", } fmt.Println(b) } [/php] 3.go指针操作 如下我们要...阅读全文

Go使用用两种方式打印自然数

这道题可以作为笔试题,现在给定下面一个条件 go func() { for i := 1; i < 10; i++ { println(2*i - 1) } }() go func() { for i := 1; i < 10; i++ { println(2 * i) } }() 让你使用多种方式将奇偶合并,并打印自然数,这道题目很简单,思考几秒钟,看看你的实现。。。。。。 好了我的实现比较low,没办法,golang 的代码怎么写都那个怂样。。。 1.第一种方式 package main import ( "fmt" "time" ) var count = 15 func ping(c chan<- int) { for i := 1; i < count; i++ { c <- 2*...阅读全文

博文 2017-06-22 10:41:58 诺唯

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

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

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,一个是数据信息。 其中...阅读全文

博文 2018-10-13 09:58:23 掘金

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

go 速学 - 11 - 结构

目录 结构 概念 创建结构 使用结构 值传递 匿名结构 结构的组合 概念 定义一个组合 使用组合 摘要 定义结构,使用结构,值传递与指针传递,匿名结构,结构的组合 结构 概念 Go 中没有 class 的概念,结构可以完成类似功能 支持指向自身的指针类型成员 支持匿名结构 支持 == 和 != 运算符 创建结构 格式 type struct{} type person struct { name string age int } 使用结构 结构变量的各个字段都会有默认值 p1 := person{name: "Jack"} p1.name = "Peter" //p1 {Peter 0} 值传递 参数中的结构默认为值传递 p2 := person{name: "Jack", a...阅读全文

博文 2015-04-25 03:00:00 mrseasons

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

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

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

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 大洋的顶端

上海漕河泾招聘golang开发

职位诱惑:saas,微服务 职位描述: 岗位职责: 1. 参与公司saas项目需求分析,完成软件需求的设计、编码,保证软件的确保安全、质量和性能; 2. 参与项目内部测试、部署、实施等工作; 3. 配合项目其他组员完成规定任务,保证任务正常提交。 任职要求: 1. 3年以上后台软件开发工作经验; 2. 掌握Linux环境下的开发技能(shell的基本命令); 3. 专业基础扎实,了解常用数据结构和算法的优缺点 4. 具备Http协议,TCP/IP协议,Socket网络编程知识; 5. 具备多线程理论知识,有多线程程序设计经验优先; 6. 能正确阅读和理解计算机领域的英文资料;本科及以上学历,计算机等相关专业; 7. 喜欢钻研技术、有独立...阅读全文

Go语言从入门到精通-03 | 复杂数据类型

有的时候基本的数据类型可能不能满足我们开发的需求,我们可能需要一些数据类型的组合。比如我们要把一个班级里面所有人的平均成绩存在一起,然后计算整个班级的平均成绩。大家想一下,这种情况下应该用什么类型的变量? 数组 接着上面我们举的例子,如果要计算平均成绩怎么办呢?这就用到了数组的概念。数组从字面上理解就是一组数,它是指类型相同的一组数。这组数在内存中是顺序存储的,因此,我们可以通过数组名字的索引来访问其中的数据,而不同定义多个变量。 图1 数组内部结构示意图 如图1是数组内部结构的示意图,我们可以通过数组的索引访问数组内部的数据。通常数组的索引是从0开始的,0表示第一个元素。下面我们给出一个Go语言的具体示例: 上面数组数量,如果有初始化的情况下可以不必指定大小,此时编译器会根据初始化的数据数...阅读全文

博文 2019-03-21 15:35:14 qq5c822f9bb7f5c