菜鸟翻译屋

GO语言学习笔记-接口2

Roy

原文

传指针vs传值

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

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语言学习笔记-接口1

Roy

原文

接口是什么?

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

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

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

200行GO代码实现区块链2

Roy

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

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

这篇文章将进行就解答。

200行GO代码实现区块链1

Roy

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

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

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

文章讲了什么

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

文章没讲什么

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

Effective-Go中文翻译

Roy

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

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

介绍

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

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

例子

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

基于虚拟可视化的网页分割

Roy

原文地址,向原作者表示感谢。

我们在Mapado的工作就是收集世界上所有“要做的事”。

为了得到大量数据,我们抓取整个网络,就像Goole做的那样,搜集所有关于演唱会、演出、访问、景点……当我们发现一个有趣的页面,我们就尝试从这个页面提取“好”的数据。

我们面临的一个主要挑战就是如何从垃圾信息中(广告、导航栏、页脚、相关内容……)分离我们感兴趣的内容(标题、简介、图片、日期……)

在这个挑战中,一个任务就是重组在视觉上相近的内容。通常,组成页面主要部分的元素相互之间距离是很近的。

当我们开始进行任务时,很天真的以为可以操作DOM来实现。在DOM中,元素以层级结构存储,所以在同一个父元素中的元素很大可能是相关的。

一个非常有趣的介绍页面分割的论文可以在这里找到 Page Segmentation by Web Content Clustering