• 2012-04-11

    从Go看,语言设计(二)

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/dreamhead-logs/204841467.html

    书接上文,继续从Go看语言设计。

    并发编程

    从多核CPU进入人们的生活,并发编程就成为编程中的新热点。在许多语言里,并发是由库提供的,而对于Go语言,并发则是语言的一部分。曾经,一说到并发编程,就会让人想到多线程/多进程、共享内存等等。Erlang改变了许多人关于并发编程的认识,基于消息的通信模式如今已逐渐成为新的标配,Go语言选择的也是这种模式。

    首先是启动并发的方式:一个简单的函数,go一下就可以了:

    go Handle();

    接下来是消息通信:

    ch := make(chan int)
    go func() {
    ch <- 0
    }()

    fmt.Println(<-ch)

    这里创建了一个通信通道(make(chan int)),有了这个通道,通信的双方就可以彼此发消息。

    不显式声明的接口与实现之间的关系

    或许是我少见多怪,Go语言是我接触到的第一个无需显式声明接口和实现二者关系的强类型语言。比如,定义这样一个接口:

    type Runnable interface {
    Run()
    }

    然后,是一个使用了这个接口的函数

    func RunTo(r Runnable, place string) {
    r.Run()
    fmt.Println("Get to " + place)
    }

    之后,再来定义一个类型:

    type Person struct {
    name string
    }

    这个类型也有一个Run函数:

    func (p *Person) Run() {
    fmt.Println(p.name + " is running")
    }

    从代码层面上,Runnable和Person并没有直接的关系,唯一的关系就是二者都有Run函数。即便如此,我们依然可以把Person当做Runnable来使用:

    p := new(Person)
    p.name = "dreamhead"
    RunTo(p, "Xi'an")

    只要实现者拥有接口定义的方法,就可以当做这个接口来用。如果熟悉Ruby这样的动态类型语言,你会发现这种说法几乎同Duck Typing如出一辙,只不过,在Ruby里没有“接口”而已。

    从实现的角度,这个问题并不难理解,所有这一切都是编译器替我们完成的。如同类型推演一样,编译器让我们不必将重复概念反复来说,同时还保证了,不会有“上错花轿”的情况出现。

    小结

    Anders Hejlsberg总结了程序设计语言发展的三大趋势:声明式、动态性和并发。

    声明式,包括函数式编程和DSL。函数式编程自不必说,DSL实际上事关表达性,Go简化代码编写的方式就是在这个方向迈出的步伐。动态性,并不仅仅是动态语言,动态语言与静态语言之间的互相汲取营养,类型推演与不显式声明接口和实现关系,便是向着这个方向迈进。至于并发,无需多提。

    总的说来,Go语言的语言设计本身是符合现代程序设计语言发展趋势的。

    分享到:
    引用地址: