原文,建议理解并发(concurrency)、并行(parallelism)区别后再看这方面的内容。

Goroutines是啥?

Goroutines是一个可以和其他函数或方法并发执行的函数或方法。也可以把它理解为轻量级的线程(roy注:这话听起来和大python中的协程很像啊!),而创建Goroutine的开销却远远小于线程。因此在大多数的Go程序都可以并发执行成千上万的Goroutine。

Goroutines的优势

  • Goroutine和线程相比及其节省开销,它们仅需要占用几kb的栈空间,而且栈空间可以根据程序的需要增加或回收。而同样情形下线程占用的栈空间只能被指定并且不可修改。
  • Goroutine采用多路复用的方式来减少对系统线程的占用。程序中一个线程中可能包含几千个Goroutine,如果任何Goroutine在线程中阻塞比如需要等待用户输入,那么将会创建新的系统线程并把剩下的Goroutine转移到新系统线程中。所有的操作都由运行时自动处理,作为开发人员不用纠结于实现这个的细节了,Go为此提供了清晰的API。
  • Goroutine之间的通信使用channel,channel被设计用来防止Goroutine之间访问共享内存可能造成的冲突。channel可以理解为Goroutine通信的管道。我们将在后面的文章中讨论channel。
阅读全文

BasicPaxos算法

发布在 区块链

CPA理论

分布式系统中有个经典的CAP理论,就是说任何分布式系统最多满足一致性(Consistency),可用性(Availability),分区容错性(Partition Tolerance)这三者中的两个。

既然是分布式,必然将节点部署到不同的网络中,而这则会引起一致性问题。想解决一致性,就需要保证每次操作所有节点都成功执行,而这又会降低可用性。既然分区已经是事实,所以工程上应该尽量在保证一致性的前提下提高可用性。

而一致性又可以分为:

  • 强一致性:上次写什么,下次就一定能读到什么,这需要牺牲可用性。
  • 弱一致性:并不保证更新后所有线程都能读到最新值,需要一段时间进行同步。
  • 最终一致性:弱一致性的一种特例。
阅读全文

原文

传指针vs传值

上篇文章中所有接口实现我们都使用的传值,当然也可以使用传指针这种方式来实现接口。但使用传指针这种方式有一点需要注意,我们来看下面这个代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package main

import "fmt"

type Describer interface {
Describe()
}
type Person struct {
name string
age int
}

func (p Person) Describe() { //implemented using value receiver
fmt.Printf("%s is %d years old\n", p.name, p.age)
}

type Address struct {
state string
country string
}

func (a *Address) Describe() { //implemented using pointer receiver
fmt.Printf("State %s Country %s", a.state, a.country)
}

func main() {
var d1 Describer
p1 := Person{"Sam", 25}
d1 = p1
d1.Describe()
p2 := Person{"James", 32}
d1 = &p2
d1.Describe()

var d2 Describer
a := Address{"Washington", "USA"}

/* compilation error if the following line is
uncommented
cannot use a (type Address) as type Describer
in assignment: Address does not implement
Describer (Describe method has pointer
receiver)
*/
//d2 = a

d2 = &a //This works since Describer interface
//is implemented by Address pointer in line 22
d2.Describe()

}
阅读全文

原文

接口是什么?

在面向对象的世界中,接口的意思是:“接口定义了对象的行为”。它只表明对象应该能做什么,而具体怎么做则由对象内部实现。

Go语言中,接口是方法的集合,若某个类型实现了接口中定义的所有方法,则可以说这个类型实现了这个接口。用OOP的形式来说就是: 接口表明了类型应该有哪些方法,而类型则决定如何实现那些方法

比如,WashingMachine这个接口中可以定义Cleaning()Drying()方法,任何类型实现了这2个方法都可以说是实现了WashingMachine接口。

阅读全文

原文,需要科学上网。省略了一些无关的内容。

上篇文章我们学习了如何编写区块链并且对进行Hash运算和验证,但所有都运行在一个节点。我们如何让其他的节点连接到我们的主节点并让这些新节点贡献新区块呢?并且,我们如何通知所有的节点区块链有更新呢?

这篇文章将进行就解答。

工作流

bk1

  • 第一个终端负责创建创世块和TCP服务以便新节点可以连接它

第一步

  • 打开一个新终端并使用TCP连接到第一个终端
  • 向第一个终端添加一个新区块

第二步

  • 第一个终端对区块进行验证
  • 第一个终端对所有节点进行广播通知有新区块生成

第三步

  • 所有终端都有同步后的新区块链

完成这篇文章后,尝试:让每个新终端都和第一个终端一样,有自己的TCP端口让其他节点连接,组成一个真实的网络!
阅读全文

原文,需要科学上网。省略了一些无关的内容。

世界上很多开发者听说过区块链却不知道它是怎么工作的,他们或许仅仅听过比特币或者智能合约一类的名词。这篇文章尝试用简明的语言说明区块链并且用不到200行的代码来实现你自己的区块链!文章的最后,你应该可以运行并且添加区块到区块链中并从浏览器中看到结果。

有什么学习区块链的方法比你亲自实现一个更好呢?

文章讲了什么

  • 如何创建自己的区块链
  • 如何使用Hash来维护区块链的完整性
  • 如何添加新区块
  • 如何解决多个节点同时生成区块导致冲突问题
  • 如何在浏览器中查看区块链
  • 如何生成新区块
  • 了解区块链的基础知识后,你可以决定你的未来发展方向

文章没讲什么

为了保持简单,我们并没介绍更高级的概念比如pow和pos的对比,我们模拟了网络交互所以你可以看到区块链并且添加区块,但网络广播部分将以后再讲。

阅读全文

区块链学习笔记1

发布在 区块链

区块链不等于XX币!

区块链不等于XX币!

区块链不等于XX币!

区块链本质是一种 去中心化的不可修改的分布式数据库核心要解决的是信任问题。 根据场景可以分为3类:

  1. 公开链
  2. 私有链
  3. 联盟链

著名的BTC以及各种XX币大多都是基于公开链的第一代应用,而以太坊(Ethereum)则更进一步,可以说是第二代的区块链应用。基于以太坊,更是诞生了智能合约(Smart contracts)应用,大大简化了编写区块链应用的难度。

而联盟链,现在最火的就是Linux基金会旗下的超级账本(hyperledger)了,相对而言,我个人更看好这个。另外还有个叫做闪电网络的(个人觉得这货有点类似于资金池,略有违背去中心化的初衷),也值得关注。

阅读全文

原文链接,省略了一些无关的句子。

这里有别人翻译好的,需要翻墙。

介绍

Go是一种新的语言,尽管它从其他语言中借鉴了很多特性,但有些不同寻常的特性让Go语言程序和其他程序有所不同。想要直接把C++或者Java代码转换成Go不会得到令人满意的结果,Java程序是用Java写的而不是GO。另一方面,从GO的角度来考虑问题可以写出成功运行但略有不同的程序。换句话说,想要写出好的GO程序,了解其特性是很重要的。同样,了解约定俗成的惯例也很重要,比如命名、格式、项目结构,这样你写的代码才能方便其他GO语言程序员理解。

这篇文档给你一些小建议以便写出简洁且符合规范的GO代码。看这篇文档前建议先看language specificationthe Tour of Go,和 How to Write Go Code

例子

GO源码不仅仅是作为核心库来使用,更可以用作写代码的实例参考。此外,你可以直接在官网上运行那些没有额外依赖的程序,比如这个。如果你有关于如何解决或实现某个问题的疑问,标准库中的文档、代码、例子可以提供答案或者思路。

阅读全文

首先从官网下载源码进行安装:

1
2
3
4
wget http://download.redis.io/releases/redis-3.2.1.tar.gz
tar -zxvf redis-3.2.1.tar.gz
make && make test
sudo make install

默认安装到/usr/local/bin目录。

阅读全文
作者的图片

Roy

微信公众号:hi-roy


野生程序猿


China