go语言的设计的一点粗浅看法
Go是Google开发的一种编译型,并发型,并具有垃圾回收功能的编程语言。罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pike)及肯·汤普逊于2007年9月开始设计Go语言,[1],稍后Ian Lance Taylor, Russ Cox加入专案中。
Go语言这个出自大公司Google的大牛的作品, 为什么没有象出自Microsoft的anders hejlsberg的C#这么吸引人并流行起来呢?其实Go语言的设计者也是有名的大牛,但为什么三个臭皮匠,竟然抵不过一个诸葛亮呢.本人以初学者第一次接触Go语言来说说粗浅的看法.
package main import "fmt" func main() { fmt.Println("Hello, World") }
看上面这个Hello world.首先这就有问题.Go号称是最接近C但目标是取代C的.但这个名家之手的东西,以本人初学者来看就有两大问题.
1.没有标点符号,语法很接近C,但没有符号,这就象我们写文章,读惯了带逗号句号的,突然有个东西号出来的都没有,会很不习惯.这代码乍一看还以为蹩脚C入门者写Hello world.给写错了.
2.fmt是什么库?看名字是看不出来的,想不到大牛对于命名也和初学者一样,初学者学一门语言,一般肯定先从Hello world.入手,从控制台输出入手.这给初入门学习者开了个坏头.
以Wiki例子
package main import ( "os" "flag" // command line option parser ) var omitNewline = flag.Bool("n", false, "don't print final newline") const ( Space = " " Newline = "\n" ) func main() { flag.Parse() // Scans the arg list and sets up flags var s string = "" for i := 0; i < flag.NArg(); i++ { if i > 0 { s += Space } s += flag.Arg(i) } if !*omitNewline { s += Newline } os.Stdout.WriteString(s) }
先以初学者的感觉来看,首先,所谓初学者,在当代其实大多数都知道点C, C++或别的什么,因为学校里就有这课程.然后再来年上面这堆代码.直觉告诉我,这很象一个C或C++或什么的初学者写出的,不注重语法,错误百出的代码.因为一般初学者喜欢两件事,一是忘记语法的哪些地方要括号哪些地方不加.还有就是标点符号.
当然这也许就是设计者大牛们考虑到的因素,干脆就不需要了.但问题来了,如果你写惯C类代码,再来写它或看它会感觉不太适应,然后再切回C类也一样.纠结于标点符号.这一点上,Python也是一样的,但Python通过空格强制,起码让你不会认为在写C类程序.
var s string = "" 这样的变量定义, 不太理解为什么要这么做,从初学者的角度就是不容易理解.当然对于直接没接触过任何编程语言的人除外.
for i := 0 同样变量定义和赋值语句,这个:=是怎么回事?为什么和上面的变量定义不一样?从初学者的角度就是不容易理解.当然对于直接没接触过任何编程语言的人除外.
从语法层面,未经仔细考虑用户感受的设计,让使用者产生凌乱的感觉.这让人想到了windows8的Start键.或许这是一种更优秀的设计,但一开始的确不顺手.
当然,Go提供了一些新的理念,比如以组合为范式,简单的说,只要是方法签名相同,就可以当成接口,这倒是一个不错的想法,动态语言就是这么干的.C#的delegate和interface也是这么干的.但不同.GO做这些都是隐式的.(也许这里表达的不准确,因为没有仔细看过go语言)
以本人的初浅观点来看,Go语言未能仔细设计语言的表达,一开始就犯下很多初学者的错误,功能再强,让Hello world这样的程序就阻挡了人的学习欲望.也许将来有那么一天,Go大放异彩,让人克服入门的小问题而去使用它.