看到go语言简介想到的

这些东西是平时遇到的, 觉得有一定的价值, 所以记录下来, 以后遇到类似的问题可以查阅, 同时分享出来也能方便需要的人, 转载请注明来自RingOfTheC[ring.of.the.c@gmail.com]

这几天看go文档时看到这么一段话:

Go is a new language. Although it borrows ideas from existing languages, it has unusual properties that make effective Go programs different in character from programs written in its relatives. A straightforward translation of a C++ or Java program into Go is unlikely to produce a satisfactory result—Java programs are written in Java, not Go. On the other hand, thinking about the problem from a Go perspective could produce a successful but quite different program. In other words, to write Go well, it's important to understand its properties and idioms. It's also important to know the established conventions for programming in Go, such as naming, formatting, program construction, and so on, so that programs you write will be easy for other Go programmers to understand.

译文: Go是一门新语言. 虽然它借鉴了其他很多语言中的特性, 但是编写一个高效的Go程序及Go语言的编程方式和其他语言是有本质区别的. 如果只是简单的将C++和Java等代码翻译成为Go代码, 那么将不可能得到最好的Go代码. Java程序员使用Java的思维方式, 而不是Go的思维方式. 如果使用Go的思维方式, 那么一个问题可能有完全不同的解决方案. 因此如果想真正的用好Go语言, 你必须要理解它的语言特性和设计思想. 另外还要知道Go语言的编程风格, 比如命名方式, 格式化, 程序结构组织等, 采用通用的方式也可以便于和其他Go程序员交流.

我觉得这段话不仅适用于Go语言, 而且在学习任何语言的时候都有指导性意义, 它道出了"如何学习一门新语言"的方法. 那就是不要先入为主, 拿着新东西, 硬要去往自己的习惯上套, 当然会发现很难用或者是不适应. 不要认为可以用新语言写出helloworld或者是echoserver, 就觉得自己懂了. 可以说差的太远了.

记得刚开始学计算机的时候, 学习的是basic, 然后听说某人还会c/c++/Pascal, 马上从内心里肃然起敬, 觉得这个人太牛了, 太厉害了. 但是随着学习的学习和深入, 慢慢发现会再多的语言, 不如精通一门, 而且在很多地方你也可以听到"数据结构和算法才是根本"这样的说辞, 的确是这样, 语言只是工具.

当你解决问题的时候, 你需要合理的描述和组织问题, 语言就是个实现工具, 可能是从小生活在"XX万岁, 打倒UU"的非友即敌神奇国度中, 我突然间就鄙视起以前的自己来, 这时, 如果谁说会几门语言, 内心便不由自主的鄙视起人家, 殊不知自己也是从这个时候过来的, 这就叫成长.

但是有句名言说的好: 人类的整个历史就是在不停的重复同一个错误. 在经过一段时间的学习和实践后, 我的想法又发生了变化, 当然不是说我的算法和数据结构有好多的意思, 而是说眼界开阔了, 见的东西多了后, 认识问题就能更深, 更客观. 我又发现, 语言很重要, 并不是一个什么简单的实现工具, 什么样的语言, 把你带向这么样的方向.

为什么这么说呢, 因为不同的语言是发明人当时为了解决不同的问题而发明的, 你能学一门语言, 也是因为它在某方面的卓越能力给你提供了价值. 所以你必然会受到来自语言中的对特定问题解决方式的影响, 什么模式惯用法, 库, 框架都是在潜移默化的影响你看问题的观点和方式. 这时你有两条路可以走:

1. 好好使用这门语言, 并强迫自己去学习更多类型的语言, 开阔自己的思路

2. 当一个语言的忠实教徒, 把自己的思路局限在该语言的发展上

从意愿上大家当然愿意选一, 但是不一定真能这样做. 选一的好处就不说了, 不同语言中的世界观和方法论将极大的丰富你的思维世界, 也就是因为这一点, 我才又一次觉得语言很总要. 有的语言你不学, 你不知道原来问题可以这样解决, 毕竟, 能有所耳闻的语言都是有其特点的, 这就是一个巨大的财富, 而付出的就只是一些学习成本.

当然, 也可以抱着自己最喜欢语言, 其实这样做也没有什么错. 因为你来到了一个充满宝藏的地方, 但是你却分文不取, 这样是没有任何错误的, 只是你自己比较吃亏罢了, 我一向的观点是道理说清楚, 路自己走, 因为毕竟生活是自己的, 别人没有精力或者义务来劝任何人, 专心挖自己的宝藏, 然后再把自己的经验写成传说吧, 有缘人自然受益.

好了, 我感觉我有点偏题太多了, 只是有感而发, 我其实想说的如何学习一门语言, 我不是什么高手, 也不是什么叫兽, 我只能举一些例子来说明一下, 其中有我熟悉的, 也有不熟悉的.

c/c++/java 未知学习法, 我不知道怎么学好

lua/js 大爱, table, 表, userdata, C API, 源码很少, 最好是读, 这个是有价值的, 包你不后悔, 学完lua, js自通,

GameMonkey 学了lua的情况下可以学习, 协程及其调度, 其他没什么, 主要是看源码, 写的很清晰的, 看过lua再看它很轻松, 注意了GM和lua是两个放弃抢占式调度, 选择共享内存的例子.

go channel, goroutine, 内存模型.[准备这样学], go和lua, gm刚好相反, 它放弃共享内存, 选择抢占式调度.这些都是学习的重点.

就是这些了, 其实归纳就是, 1.学习它有别于其他语言的特点, 2. 要选一门语言从源码彻底搞定[为了不引起大家的不满, 我主动注释: 我指的是小型的动态语言, 1w上下的代码量, 我认为去读静态语言的编译器没有益处, 很浪费时间].

我觉得比较遗憾的就是到现在对于函数式编程还是概念性的认知, 这个一定要抽空学习一下了.

当然大家都各有各的学习方法, 没有万能的方法, 最重要的还是坚持和追求. 我这篇纯粹是谈一下自己的体会, 全当抛砖引玉吧.