不得不选Go语言几大原因

©   老男孩老师    /    2017-09-26

不同于 Java,Go 编译生成机器码,并被直接执行,非常类似 C。因为它不是一个虚拟机,这与 Java 有着天壤之别。Go 支持面向对象,并在一定程度上支持函数式编程,因此它不仅仅是一种具备自动垃圾回收机制的类 C 语言。如果我们将程序语言发展看作线性的话(事实上不是),Go 介于 C 和 C++ 之间的某种状态。在 Java 开发者看来,Go 是如此的与众不同,以至于学习它本身就是一种挑战。通过对 Go 的学习,可以更深入理解程序语言的构造,对象及类等等都是如何实现的。这些知识在 Java 中同样适用。

局部变量
当 Go 编译器发现被创建的“对象”(晚点晚再解释用引号的原因)将会脱离函数作用域,它会妥善处理这种情况,保证该对象在函数返回后继续存活,其指针不会指向废弃的内存地址,获得不确定的数据。 开发,也去了解它,这会增加你的知识和理解。
像这样写是绝对合法的:
1、package main
2、import (
3、"fmt"
4、)
5、type Record struct {
6、i int
7、}
8、func returnLocalVariableAddress() *Record {
9、return &Record{1}
10、}
11、func main() {
12、r := returnLocalVariableAddress()
13、fmt.Printf("%d", r.i)
14、}
闭包
你可以实现一个函数中的函数,然后返回这个函数本身,就像函数式语言一样(Go 也是一种函数式语言),所有的局部变量都将成为闭包中的变量。



1、package main
2、import (
3、"fmt"
4、)
5、func CounterFactory(j int) func() int {
6、i := j
7、returnfunc() int {
8、i++
9、return i
10、}
11、}
12、func main() {
13、r := CounterFactory(13)
14、fmt.Printf("%dn", r())
15、fmt.Printf("%dn", r())
16、fmt.Printf("%dn", r())
17、}
面向对象
由于支持闭包,而且函数是第一类值,Go 语言至少可以做到接近 Javascript 程度的面向对象支持,然而事实远不止如此。Go 语言支持接口和结构体,但是它们不是真正意义上的类,而是值类型。他们通过值传递,数据在内存中保存时,只包含纯粹的数据,没有类头部之类的信息。Go 中的结构体非常像 C——可以包含域(fields),但不能互相扩展,也不能包含函数方法。Go 另辟蹊径支持面向对象。
1、package main
2、import (
3、"fmt"
4、)
5、type A struct {
6、a int
7、}
8、func (a *A) Printa() {
9、fmt.Printf("%dn", a.a)
10、}
11、type B struct {
12、 A
13、n string
14、}
15、func main() {
16、b := B{}
17、b.Printa()
18、b.A.a = 5
19、fmt.Printf("%dn", b.a)
20、}
清爽的Go语言
Go 代码非常清爽,令人过目难忘。在其他语言中,存在一些不太常用的字符。 C 发明出来之后的 40 年里,我们逐渐适应了它们,众多语言都在跟随这种语法,但是这并不能说明这种设计是最好的。通过 C 我们都了解,在 “if 表达式” 中使用 “{” 和 “}” 将各代码分支括起来,很好的解决了 “长尾else” (trailing else)问题。(可能 Perl 是第一个使用这种特性的主流类 C 语法的语言)既然如此,如果我们必须有花括号,那就没必要用圆括号将条件语句括起来了。就像你看到下面的代码:
1、...
2、if a == nil {
3、fmt.Println("a is nil")
4、} else {
5、fmt.Printf("%dn", a.a)
6、}
7、...



本文章版权归老男孩教育所有。转载请注明出处。有任何疑问可以随时给我们网站留言。

本文链接:http://www.oldboyedu.com/tuijian_wenzhang/index/id/107.html

(2)

分享至