03 2019 档案
摘要:概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。 有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。 而twitter的snowflake解决了这种需
阅读全文
摘要:关于雪花 雪花(snowflake)在自然界中,是极具独特美丽,又变幻莫测的东西: 雪花算法: 雪花算法的原始版本是scala版,用于生成分布式ID(纯数字,时间顺序),订单编号等。 自增ID:对于数据敏感场景不宜使用,且不适合于分布式场景。GUID:采用无意义字符串,数据量增大时造成访问过慢,且不
阅读全文
摘要:最近在研究区块链的时候关注了一下加密技术,小有心得,于是设计了一款数据加密共享与签名的方案,希望能够为做电子合同,数据存证,数据共享的朋友有所帮助吧。 业务场景 一、电子合同 Alice和Bob需要签订一个合同,而Charlie是中介,也需要在看到该合同上并签字,而Dave是外人,不参与这个合同的签
阅读全文
摘要:在Java中,集合和数组是我们经常会用到的数据结构,需要经常对他们做增、删、改、查、聚合、统计、过滤等操作。相比之下,关系型数据库中也同样有这些操作,但是在Java 8之前,集合和数组的处理并不是很便捷。 不过,这一问题在Java 8中得到了改善,Java 8 API添加了一个新的抽象称为流Stre
阅读全文
摘要:一、前言消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下提供应用解耦、弹性伸缩、冗余存储、流量削峰、异步通信、数据同步等等功能,其作为分布式系统架构中的一个重要组件,有着
阅读全文
摘要:前言 区块链作为一种架构设计的实现,与基础语言或平台等差别较大。区块链是加密货币背后的技术,是当下与VR虚拟现实等比肩的热门技术之一,本身不是新技术,类似Ajax,可以说它是一种技术架构,所以我们从架构设计的角度谈谈区块链的技术实现。 无论你擅长什么编程语言,都能够参考这种设计去实现一款区块链产品。
阅读全文
摘要:一、BlockChain的insertChain方法 1.1 前言 本章节介绍BlockChain模块插入一个新区块的流程。一个新区块的来源有两种可能性,第一种可能性是本节点挖矿成功,要调用BlockChain模块向本地区块链上插入,第二种可能性是节点从网络上的其他节点收到一个区块,调用BlockC
阅读全文
摘要:本文分享基于docker如何从零搭建联盟链。 一、前言 本文分享基于docker如何从零搭建联盟链。使用其它方式搭建也可以,只不过docker相对容易一些,难点在于如何写配置文件。 1. 准备运行环境 实际开发中有三种运行环境可供选择: (a). Vagrant: Vagrant是一个基于Ruby的
阅读全文
摘要:本文档演示使用Hyperledger Fabric V1.0来部署一个开发者环境并运行一个简单例子。文档包括创建和加入通道(账本)、客户端认证以及部署和调用智能合约。CLI将用于创建和加入通道(账本),NodeJS SDK将用于客户端身份验证和使用账本的智能合约功能。 Docker Compose将
阅读全文
摘要:本节分享有关拆超级账本的概念以及体验部署过程。 一、简介 是一个带有可插入各种功能模块架构的区块链实施方案,目标是打造成一个由全社会共同维护的开源超级账本。由Linux 基金会的开源项目,全称是Hyperledger Fabric)是区块链的商用平台。开源地址:https://github.com/
阅读全文
摘要:本文紧接上文所述,讲解socket编程和HTTP编程。 一、socket编程 在上一节我们介绍了网络体系的五层模型,介绍了每层模型所遵守的协议。TCP/IP是一个协议族,它由网络层的IP协议和传输层的TCP协议组成,其中网络层建立了主机到主机的通信,传输层建立了端口到端口的通信。只要确定主机和端口,
阅读全文
摘要:网络编程分为上下两节。上节介绍网络概述,下节介绍socket和HTTP编程。 一、网络概述 1.1 网络协议 网络协议就是为网络数据交换而制定的规则、约定与标准。 1.2 分层模型 为了降低网络设计的复杂性,绝大多数网络都组织成一堆相互叠加的层。每一层都建立在下一层的基础之上,且每一层的目的都是向上
阅读全文
摘要:本节紧接上节内容,介绍JSON处理和对文本的几种操作。 一、JSON处理 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,方便人们阅读和编写,也方便程序地解析和生成。虽然JSON是JavaScript的子集,但其格式完全独立于编程语言,表现为键/值对集合的
阅读全文
摘要:常用工具包分为两节内容。本节介绍格式化输入输出和对字符串处理的常用工具包和函数;下节介绍JSON处理和对文本的几种操作。 fmt包提供了格式化的输入和输出的操作。 1.1 常见的函数 主要介绍fmt包中常用的Println、Printf和Scanf函数,如表1所示。 1.2 格式化符号 格式化符号如
阅读全文
摘要:本节紧接上一节的内容,主要介绍channel中的有缓冲channel、单方向的channel、定时器,以及select语句在channel中的应用。 3.4 有缓冲的channel 3.4.1 概述 有缓冲的通道(buffered channel)是一种在被接收前能存储一个或者多个值的通道。这种类型
阅读全文
摘要:并发编程分为上、下两节。这一节包括了并发编程的概述、goroutine和channel的部分内容。 一、概述 1.1 并行和并发并行(parallel):在多个处理器上同时执行多条指令,如图1所示。 并发(concurrency):同一时刻只有一条指令在执行,但多个进程指令被快速轮换地执行,使得宏观
阅读全文
摘要:任何编程语言的学习都要考虑错误处理。早期的语言,比如C语言中的errno,不是语言规范的一部分,通常只作为一种编程范式存在。但C++语言从语言层面上增加错误处理的支持,比如异常的概念和try-catch关键字的引入。而Go语言最大的亮点之一就是拥有漂亮的错误处理规范。 一、error error是G
阅读全文
摘要:多态是面向对象的三大基本特性之一。多态是指对于不同的实例,同样的操作可能会有不同的表现形式。例如加法操作,如果操作的数据是数,那么它对两个数进行求和;如果操作的数据是字符串,那么它将连接两个字符串。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通
阅读全文
摘要:继承也是面向对象的三大基本特性之一。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。通过继承,不仅可以让某个类型的对象拥有属于自己的数据结构和操作,还会自动拥有父类的数据结构和操作。这使得现有的类在无需重新编写原来类的情况下对这些功能进行了扩展,很好地解决了代
阅读全文
摘要:封装是面向对象三大特性之一。封装的好处,一个是增加代码内聚性,就是将数据和对数据的操作封装在一起,提高可复用性和可维护性;还有就是信息隐藏,就是把不该暴露的信息藏起来,通过访问控制来隐藏数据,不被外界干扰。也就是说,一个对象就是一个封装了数据和操作这些数据的代码的逻辑实体。Go语言没有封装这个名词,
阅读全文
摘要:一、面向过程和面向对象的区别 面向对象(Object Oriented,简称OO)和面向过程(Procedure Oriented,简称PO)是两种不同的编程思想。 1.1 面向过程的编程 面向过程编程(Process Oriented Programming,简称POP),以事物的发展过程为中心的
阅读全文
摘要:在实际开发工作中,工程不会简单到只有一个源代码文件,且源文件之间有相互依赖的关系。Go语言利用命令行工具,消除了工程文件的概念,完全用目录结构和包名来推导工程结构和构建顺序。 一、包的由来 为了代码更好地维护和复用,Go语言程序按程序的功能性将源代码分割成一个个逻辑单元,组织成若干组文件,每组文件被
阅读全文
摘要:一、结构体概述 Go语言结构体是一种聚合的数据类型,由一系列具有相同类型或不同类型的数据构成的数据集合。结构体的声明格式如图1所示,内部没有关键词var,每个数据称为结构体成员。例如,图1所示,利用结构体表示法,以一个班级为单位,记录这个班的班级名称,统计班级的总人数、男女生人数。定义一个结构体需要
阅读全文
摘要:在C++、Java、C#语言里,使用map,需要先引用相应的库。在Go语言里,使用map不需要引入任何库,并且使用更加方便。在C++、Java、C#语言里,使用map,需要先引用相应的库。在Go语言里,使用map不需要引入任何库,并且使用更加方便。 一、概述 Go语言中的map(映射、字典)是一种内
阅读全文
摘要:上一节介绍了切片的基础知识:切片的声明、空切片、切片和数组的区别、切片和底层数组的关联、切片的创建。这一节主要介绍切片的几个操作(遍历、追加、拷贝、插入、删除),最后介绍切片作为函数参数的传递方式。 一、切片的几个操作 1.1 对切片的遍历 类似于对数组的遍历,range结合for循环可以对切片进行
阅读全文
摘要:上一章节我们已经了解了数组的特点:数组的长度在定义之后无法再次修改;数组是值类型,每次传递都将产生一份副本。数组的这种特点无法满足特定场景的开发需求,Go语言提供了更为灵活、功能强悍的内置类型——切片(slice)来弥补数组的不足。切片分为上、下两节。本节介绍切片的基础知识:切片的声明、空切片、切片
阅读全文
摘要:数组是Go语言编程中最常用的数据结构之一。本节从以下角度介绍数组:数组的定义和基本要素、数组的声明和初始化、数组元素的编号及数组元素的获取和修改、数组变量之间的比较和赋值、指针数组和数组指针、数组作为函数参数的传递方式和二维数组。 一、数组定义和基本要素 1.1 数组的定义 数组是一系列已编号、长度
阅读全文
摘要:一、基本概念 1.1 内存地址 电脑存储器由一个个存储单元构成,为了对存储器进行有效的管理,就需要对各个存储单元编号,即给每个单元赋予一个地址码,这叫编址。计算机里每个内存单元的地址码就是这个内存单元的内存地址。 1.2 指针变量 通过内存单元的内存地址能找到这个内存单元,那么这个内存地址叫作指针(
阅读全文
摘要:上一节介绍了内置函数、自定义函数和变量作用域,本节主要介绍匿名函数与闭包、函数的延迟调用、递归函数。 一、匿名函数与闭包 1.1 定义匿名函数与闭包的定义如表1所示。 注:a. 闭包就是通过匿名函数“捕获”和它在同一作用域的其它常量和变量。b. 当闭包被调用的时候,不管在程序什么地方调用,闭包都能使
阅读全文
摘要:函数这一章节主要分为五个部分讲解,分别为:内置函数、自定义函数、变量作用域、匿名函数与闭包、递归函数。本节讲解内置函数、自定义函数和变量作用域。 一、内置函数 1.1 常见的内置函数常见的内置函数如表1所示。 1.2 内置函数的调用过程 1.2.1 步骤 第一步:先导入该函数所在的包;第二步:再调用
阅读全文
摘要:Go语言跳转语句对应的关键字是goto。在具体应用场景中,为满足更丰富的控制需求,Go语言提供了关键字break和continue。根据具体的逻辑目标、程序执行时间和空间限制、代码的可读性、编译器的代码优化设定等因素,开发者可以结合具体情况对这些关键字进行灵活组合。 一、goto goto语句,就是
阅读全文
摘要:与多数语言不同的是,Go语言中的循环语句只支持for关键字,不支持while和do-while。Go语言循环处理语句主要包含:for循环语句、for循环嵌套语句。 一、for循环语句 1.1 形式一 1.1.1 语法格式 注:a. init:一般赋值表达式,给控制变量赋初值; b. conditio
阅读全文
摘要:Go语言程序流程结构有三种:顺序结构,选择结构和循环结构。顺序结构的程序设计最简单,按照解决问题的顺序写出相应的语句,自上而下依次执行。选择结构用于判断给定的条件,根据判断的结果来控制程序的流程。循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构。在Go语言中,构成选择结构的语句包括:条件
阅读全文
摘要:Go语言运算符主要包括:算数运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和其他运算符。 一、算数运算符 算数运算符和数学中的运算符基本类似,但是需要注意的是:a. 参加算数运算的是两个相同类型的算数,不同类型的算数不能参加运算,且运算后的结果也是同一类型;b. 在Go语言里自增(自减)表达式
阅读全文
摘要:一、常量名 常量的命名规则与命名风格和变量的相同,具体参见变量的命名规则。 二、常量的特点 常量在编译时就已经确定为已知且不可改变的值。 三、字面常量 字面常量就是一个确定值的本身,如表1所示。 四、单个常量的声明且赋值 常量是在编译期就要确定的值,不能对常量先声明再赋值,因为赋值语句是在程序运行时
阅读全文
摘要:一、变量名 1.1 命名规则 为提升代码可读性和可维护性,多采用统一的、可读性高的命名方式。Go语言变量名由一个或多个字母、数字、下划线组成的序列,但第一个字符必须是字母或下划线,不能是数字,且区分大小写。例如:1a不能作为变量名,myname和myName是不同的变量名。 1.2 命名风格 命名风
阅读全文
摘要:一、类型分类 数据类型分为基本类型和复合类型。基本类型包含:布尔型、数值型(整数型、浮点型、复数型)、字符串型、函数型。函数型在函数章节再介绍。 复合类型包含:指针、数组、切片、字典、结构体、通道、接口。复合类型在后面章节再逐一介绍。 二、基本类型 在计算机信息技术中,字节是计量存储容量的一种计量单
阅读全文
摘要:一、第一个Go程序 我们第一个Go程序以最简单的Hello world作为开始。所有Go语言程序文件的文件名都以“.go”结尾,该程序可以命名为:helloWorld.go。 二、程序结构分析 Go语言程序一般由关键字、包、常量、变量、运算符、符号、类型和函数组成。在这个程序仅涉及到关键字、包、符号
阅读全文
摘要:一、工作区 在《Go语言开发环境搭建》中已经讲述了GOPATH的设置。GOPATH就是自定义的工作区目录,该目录包含3个子目录: src目录 存放源代码(比如以.go、.c、.h、.s结尾的源代码文件) pkg目录 存放编译后生成的文件,即由go install命令构建安装后的代码包(包含Go库源
阅读全文
摘要:Python 的神奇发展史 结缘 我了解 Python 最早来源于 Python 的一段格言,就下面一段话将我征服了,格言其实是对软件开发的哲学理念和设计思想,也是一个大佬对于软件的感悟,看了这段感悟我就在想,作者这么高的境界,那么搞出来的编程语言能差到哪里呢? 优美胜于丑陋,明晰胜于隐晦简单胜于复
阅读全文
摘要:1 . 简介 互联网上的贸易,几乎都需要借助金融机构作为可资信赖的第三方来处理电子支付信息。虽然这类系统在绝大多数情况下都运作良好,但是这类系统仍然内生性地受制于“基于信用的模式”(trust based model)的弱点。我们无法实现完全不可逆的交易,因为金融机构总是不可避免地会出面协调争端。而
阅读全文
摘要:一、在Windows系统安装Goland 1.1 下载 官网地址:https://www.jetbrains.com/go/download/#section=windows 1.2 安装 a. 双击“goland-2018.1.5.exe”,单击“运行”,如图1所示; <图1> b. 如图2所示,
阅读全文
摘要:一、操作系统位数的查询方法在安装前首先要了解个人的电脑系统位数是32位还是64位。1.1Windows系统查询方法右击“计算机” >单击“属性” >进入“系统”。在“系统类型”,会看到个人电脑的操作系统位数,如图1。 图1 1.2 Mac系统查询方法打开终端 >在命令行输入: “uname -a”
阅读全文
摘要:一、什么是Go语言 Go语言,也叫作Golang,它是21世纪的C语言。Go语言让程序员在写代码过程中更加高效,而且它优化了多处理器系统的应用程序,使其可以媲美C或C++代码程序的速度。另外,它更加安全地支持并行进程。 项目选择语言时,开发人员只能在程序地快速开发和程序的性能之间二选一。例如:C和C
阅读全文
摘要:常用工具包分为两节内容。本节介绍格式化输入输出和对字符串处理的常用工具包和函数;下节介绍JSON处理和对文本的几种操作。 fmt包提供了格式化的输入和输出的操作。 1.1 常见的函数 主要介绍fmt包中常用的Println、Printf和Scanf函数,如表1所示。 1.2 格式化符号 格式化符号如
阅读全文
摘要:前言 估计大家也可能听过Docker这项技术(在论坛上、招聘技能上、交流群上等等),要是不了解Docker,都不好意思在网上冲浪的时候吹牛逼了。 所以这几天学了一下Docker,总结了Docker入门的相关知识,分享给大家(好让我们一起吹牛逼)。 一、为什么需要Docker 官方介绍(中文版):ht
阅读全文