相比于C语言,Golang提供了很多很方便的语言特性,比如切片的支持,比如GC,比如原生的map支持。使用Go会比直接使用C语言方便非常多。但是在使用中也会遇到很多不方便的地方,希望新版本的Go能提供更多的特性

这是一个持续更新的列表

没有泛型支持

作为一门09年诞生的语言,没有支持泛型其实是很不应该的。我们不知道为什么在设计go的时候没有把泛型加上,按照官方的说法,是还没有找到一种不是的设计变得非常复杂的实现泛型的方法,并且泛型对于他们来说并不是那么紧急,所以在go中,泛型一直是一个open issue,没有定论。

我们知道Java在1.5添加了泛型支持,但是java的泛型实现机制也是被很多人诟病的点。因为Java使用了运行时类型擦除的方式实现泛型,这种实现方式导致在运行时泛型是没有类型信息的,被退化成为了Object对象,可能导致运行时异常而不是编译期异常。相比而言C#提供的更原生的泛型支持。
虽然Java的泛型不被人喜爱,但是其实并不会太影响使用,而现在Go语言根本没有提供对泛型的支持,也导致很多基础方法不能被复用,比如排序算法需要对所有的类型提供不同的实现,这是很繁琐的工作。

其实,官方的说法也很有道理:泛型并不是那么的紧急,没有泛型是有些麻烦,但并不会导致不能工作。

好消息是Go的开发组已经在考虑添加泛型支持了,或许下个版本就能用上generic了。

没有三元运算符

这是这几天才发现的问题,对开发者而言,三元运算符(ternary operator ?:)是很基础的运算符。在学C语言时就用上了,以致我理所当然地认为左右的语言都会提供三元运算符了。

实际上现在的语言不仅仅提供三元运算符,还会提供改进的三元运算符。

c = a?0:a;
c = a?:0; // 一种更方便的三元运算

如上,在开发中进场碰到的一种场景是要判断取到的某个元素是否是null,然后再进行操作。为了简化操作,可以用第二行的方式,省略一个部分。这看起来简单,在实际使用时却是很方便的特性。

但是,golang现在连三元运算符都没有,只能使用if判断实现相同的效果。

if expr {
n = trueVal
} else {
n = falseVal
}

这样子确实有过于麻烦了,希望有一天golang能提供对 ternary testing operation的支持。

if语言必须要有大括号

这其实算不上缺点,go强制所有的if后必须要用大括号,即

if expr {
// operation here
}

这其实是几乎所有语言规范推荐的写法,但是很多时候我们喜欢这样写:

if (expr == true) break;

这样其实足够简洁明了,但是go中不允许这么写,必须要有大括号包围

if (expr == true) {
break
}

当判断较多的时候其实代码就很不好看了。

参考

放张图文无关压压惊

最近开始申请学业奖学金了,大家开始计算自己的绩点,我也算了一下自己的成绩,结果是比3多一点点(如果没有算错的话)。我觉得这是一个比较合适的数字,没有比3小已经很满足了,毕竟学的并不好,太高了也不太符合我的水平。可是!到现在我还没有找到比我绩点低的人!

我觉得我可以解释一下来安慰自己。

我觉得算下来绩点为3应该是比较正常的水平吧,但是看看我们宿舍其他几个人的成绩: 毛哥以3.9遥遥领先,念神3.7不落下风,凡哥3.5也不错,吓得我直接不敢说话。然后实验室的也是3.4,连我在教着写代码的同学也比我高。我的内心是有一点点崩溃的。

绩点低的主要原因是我的模式识别只有61分,嗯,比我本科的最低分线性代数还是什么鬼的63分还要低2分。这个分数其实已经远超我在模式识别领域的姿势水平了,所以也没什么话说。其他分数7788的也算可以吧,毕竟真的没学好。

那我干什么去了呢?大概本科开始成绩就不太好了。高考的时候成绩还是不错的,本科以来的考试就越来越水了,后来考研突击了一下,也还勉勉强强,总体来说考试成绩是线性下降的。

大概从初中的时候就发现问题,因为我发现除了成绩之外,其他的能力真的很差,当时我和一个好友两个人成绩差不多,一般我还要略高一点点,但是当时就想了一个严重的问题,除去考试的几门科目,如果再多加一门其他的测试,我肯定会搞砸,根本保持不了“名列前茅”。

这个问题一直在考虑,直到大学。我觉得考试与成绩一直压迫了我的小学初中高中,大学的应该走一条不同的路,当然也许当时并没有这么明确的“方针路线”,总体来说是这样子的。

当初选软件工程是我自己的决定,但是其实在这之前对计算机没有什么了解,没怎么用过电脑,很少去网吧,甚至没有使用过QQ;选这个专业可能是因为填志愿之前看了哥带回来的《大学计算机基础》和一堆的《微型计算机》杂志。。。。(题外话,其实我当时很喜欢的是化学与生物)

过完大一大二,其实已经很反感学校的教育了。开始喜欢自己学,自己动手的东西。这样导致很多基础课学的很糟糕,尤其是操作系统,组成原理等等。但是有得必有失,其中确实是需要自己去权衡的。本科的后两年基本就是水课,自己学些东西,成绩保持在能拿个三等奖学金的样子。

现在的状态就是,好像懂很多的东西,但是其实心里很没底,但是大部分时候又确实是能用的起来这些东西的。也许相对于成绩与绩点,这些列出来的名词更能给我带来成就感吧。

研一这一年干了什么事呢,因为总体来说过的比较懒散,没什么具体的事情,买了一堆书,看了几本;没学什么新的东西;给一个项目扫了个尾,重构了科委的二版,帮人做项目,教人写代码;看了十来篇论文,没什么用;去掌游实习了三个月,学了不少东西,开始更新这个博客;现在在学golang。

对我来说,绩点低的唯一的坏处就是没有奖学金吧,又要过穷日子了;早知道应该多实习一个月的。

套用无心法师里老岳的一句话

这几年没有好好学,很糟糕

我觉得根本没法安慰自己,必须要承认智商不够的事实了

golang内置对切片(slice)的支持,但是golang的类型系统对数组(array)的使用并没有动态/脚本语言那么方便,在使用中经常需要使用切片和数组的一些操作。

首先对于数组要注意数组的数据类型是存储的元素的类型数组的长度;也就是说[2]int[3]int是两种不同的类型。而切片的类型只和数据的类型有关。

声明一个数组和一个切片是不同的。

var arr [5]int
arr := [5]int{1,2,3,4,5 }

var sli []int
sli := []int{1,2,3,4,5}
阅读全文 »

shadowsocks是非常方便的“出墙”方式,也是现在最流行最被推荐的方式。虽然shadowsocks的作者被逼把github上面的代码删除掉了,但是它依旧是最好用的反长城工具。

为了出墙,之前买了jandb的包年服务,但是最近经常出问题,很不稳定,像ss这种服务购买了出了问题基本都没地方反映,因为只能低调运行,也是很烦恼。今天早上又发现不能上Google了,正好前段时间申请的免费EC2(新用户都可以申请一个最低配置的VPC一年的免费试用)

如果还没有申请,建议在申请的时候看有没有JP或者HK或者SG的机房,我选的us-west的机房,速度实在有点慢。

免费的EC2实例只能选Linux,我选的是Redhat7的系统,因为一直用的CentOS和Fedora,比较熟悉。ss-server有很多种安装方式,有libev的包,有用python,nodejs,golang等多种语言实现。考虑到免费的实例配置很低,推荐使用libev的包。

阅读全文 »

这几天重新看了下三个简答的排序算法:选择排序,插入排序和希尔排序,并使用golang做了一个简单的实现与测试。本科学习算法的时候基础太差,又不认真,现在简单的算法理解起来都很吃力,希尔排序算法看了好久勉强看懂,竟也不是完全理解,用go语言实现以下其实都还是比较简单的,但是由于golang暂时还没有泛型支持,所以只能对int类型切片做一个简单实现了。

选择排序

选择排序是最简单的排序方法了,实现很简单:

func SelectSort(arr []int) []int {
length := len(arr)
for i:=0; i<length; i++ {
for j := i+1; j<length; j++ {
if arr[j] < arr[i] {
arr[i], arr[j] = arr[j], arr[i]
}
}
}
return arr
}

冒泡排序的特点是每次只在i之后的元素做比较和排序

阅读全文 »

我们都知道Golang中有package的概念。在go源码文件的第一行就是先声明包名:

package main

这里的包名是一个标签,不是使用字符串。对于简答的项目可以直接使用main作为包名。

在go的开发中,我们会把所有的项目放到GOPATH/src目录下;与其他语言的项目不同,go的约定是(当前用户)所有的所有项目都是放到这个目录;所以这里面会有很多的项目。一般约定使用域名作为一级的目录,比如GOPATH/src/github.com这个目录存放所有从github获取的项目。

golang中的包全名是相对于GOPATH/src/的相对路径加源码文件中的package声明。源码的文件夹目录可以随意组织,可以有多层级目录,比如我打一个项目放在 GOPATH/src/wuxu.bit/example/alg/sort目录下。里面的一个源码文件sort.go如下:

package sort

import "fmt"

func Sort(a []int) {
// do some sort things
// fmt.Println(...)
}

现在另外一个项目要使用这个排序方法,假设那个项目目录是GOPATH/src/wuxu/weather/目录下的main.go文件。那么要在main.go中import排序文件的包,这里要用完整的包名

package main

import (
sort "wuxu.bit/example/alg/sort"
"fmt"
)

func main() {
// can use sort.Sort here
}

上面使用了import包名的别名。

golang在引入包的时候还有一些tricks:

  • import . "fmt" 这样在调用fmt包的导出方法时可以省略fmt
  • import _ "fmt" 这样引入该包但是不引入该包的导出函数,而是为了使用该导入操作的副作用: 调用包里面的init函数

golang的包机制现在还很简单,尤其还没有官方的包依赖解决方案,希望依赖解决能早日出来。

上一篇继续

第二天

这次去青岛虽然没有具体的攻略,但是总体的计划还是有的:总共两天,第一天的安排和游记的第一篇大概相符,第二天是准备去八大关和石老人浴场那边。可是H同学说石老人浴场不好玩,要去金沙滩那边,那就去金沙滩吧。

昨天中午吃饭的时候和店主聊了一会,说我们准备去小青岛玩,店主就说要去就要早上去,7点之前去还不要门票可以看到很漂亮的青岛的早晨。H同学表示那就早上去吧,我表示如果起得来就去吧。哈哈,果然是没有起来~

第二天起来已经是7点40多了,洗漱完越好直接在武胜关的公交站碰面,离开宾馆前再看一眼<琅琊榜>

琅琊榜
时间还早,中途找了家煎饼果子店吃了个早饭,煎饼果子还不错,挺香的,是在香港中路和燕儿岛路交界的地方,很小的一个早餐店。

八大关

青岛的各种大大小小的路,十字路口真的非常多,导致公交一会就要等红绿灯了,不过总体速度还行,还有不少电动公交车,体验非常棒。从宾馆到武胜关公交站花了些时间,比约定的时间晚了几分钟,结果H同学比我还晚,在公交站等了几分钟。

阅读全文 »

从掌游离职之后连续四五天和老师忙着写项目的申请书,算下来连续工作了十多天,实在感觉有点累,就想着马上那就中秋、十一放假了,不如出去玩两天吧。很早之前就想去青岛玩,想去看看青岛的大教堂,喝上正宗的青岛原浆,既然这几天时间正好就去青岛吧。

从北京去青岛非常的方便,大部分车都是高铁了,只剩下一趟Z车次,Z7从北京到青岛,Z8从青岛回北京。秉承一贯的夜间卧铺到目的地然后开始玩的策略,就选了Z7。找了一下就27号晚上还有卧铺,所以就定27号吧。

以前出去玩也还是喜欢一个人出去,虽然并没有什么经验,但是总觉得和很熟的人一起去别的城市旅游味道差了一些。本来出去玩就是换个陌生的环境,自己休息的嘛,又和熟人一起走那有什么意思呢?

所以谋划这次出行并没有和朋友说,室友知道后还因为没有叫他们一起说了我一顿 -_-||…

这个时间去青岛是旺季已经过去了,正好28,29还是上班时间,应该人不多,酒店也很好定,在携程上面搞定了。。。。像之前一样还是在携程上发了一个结伴的帖子,虽然有报名的,但是这次并不很想结伴了,就没管它们了。

阅读全文 »

上周五从掌游天下离职了,结束了三个月的实习生活。这是我的第二次实习工作,相比第一次又有更不一样的收获,这两天一直在忙着写实验室项目的申请书,也没来得及写这篇博客,今天终于有时间写一些了。
这次实习实在6月份中旬投的简历,面试那天正好是我生日,当天下午2点多面的,只面了浩总的技术面,然后和HR谈了一下待遇的东西,晚上5点半和室友出去吃饭的时候,HR就给电话发了offer,之后一周就去入职了。

关于计算机方面的实习,我也算有点经验了吧,去年在百度实习了半年,加上这次,两次感觉都很好,有些东西值得写下来,当作纪念,如果有人看到也算做点分享吧。

关于找实习,我跟人还是挺支持的,除非是你真的喜欢做科研,能力很强很强,以后不会去做一线的开发人员,否则在找工作之前那一份实习的经历是很有必要的。实习可以当作正式工作前的一次练习,学习如何和部门内的人协作开发,适应公司工作的氛围,这都是很重要的。
我一直都认为找工作和找实习都是一个双向的选择,在你投简历的时候要考虑自己擅长什么方面的工作,能不能符合公司的需求,同时要把自己和公司的地位等同起来;你去这家公司,它是否能给你想要的待遇,是否值得你去为它工作。经常有很多人说要找个实习去学习一些东西,工资待遇什么的不重要,我觉得这样是不对的,去实习当然是要学东西,但是不能说你去那学到了东西就可以不要或者降低自己的待遇要求。本质来说,你需要一份实习的工作,公司也需要一个实习生来干活,减少公司成本;如果哪天你觉得你的待遇远比你为公司做的贡献少,你的热情就没有了,这对自己对公司都不是好事。

说实话,我很喜欢掌游这家公司的。虽然一开始去那就是只去挣点钱,并没有多少的想法,但是面试给我的感觉很好。浩总的面试非常友好(浩总一开口就让我想起了思奇,真是好像。。。。。等思奇考回来北京,一定要带你去看看你失散多年的大大哥),问了不少问题,个人感觉聊的还不错,虽然几个具体的问题回答的并不是很好。和浩总面完后就是和明静姐谈公司的规定啊,待遇啊,这些,明静姐是个很好的HR,哈哈哈,什么都可以商量;
对于找实习,我的看法就是,没有签约之前一切都好谈,实习多长,待遇怎么样,加不加班,怎么请假,这些都要先谈清楚,因为实习生可能很麻烦,实验室一有事可能就没法去了。我当时并没有和导师去沟通,所以面试的时候就一直和明静姐说不能保证每周去4天以上,不能保证去4个月以上,但是会尽量做到。说实话,HR有他们的难处,这样和HR谈可能让他们很为难,但是我也不能骗他们,到时候签了合同又去不了了,浪费了大家的时间更不好。一般找实习HR的要求肯定是要4天以上的,所以找实习的时候要看着办,协调好实验室和公司的时间,和HR好好谈。

然后去了发现一起工作的都是专科出来的呀,培训机构出来的人,相比当时在百度实习,组里面不是北大的就是北航的简直天差地别;但是你和他们一起工作,就会发现他们也有很多值得学习的地方,至少还不错,虽然可以感觉到他们系统性的知识比较缺乏,但是干活都不错,特别是勇哥,在这三个月教了我不少的技术和人~生~的~经~验~~其实以后反正是要做开发的,工作了说不定和什么学校毕业的人一起干活呢,作为要进入社会的人,放下学历,或者说看轻学历,这是应有的心态;学历重要,但自己要看轻它才有分量。

这三个月整体来说,过的还不错,组里面的人对我也很照顾,虽然他们大部分人和我是同一年的。和他们在一起干活,对比一下如果我是他们能混到什么样的生活状态,我觉得这是很有意思的事情,其实每个人的生活都是差不多的,有时候觉得自己独一无二,其实不过是走的无数人走的那条路;生活中真的有很多事都是模式化的,你做这个选择或者做那个选择,对一般的人来说也并不会有太大的区别。就比如,你考985,学计算机,读硕士,说重要其实也没那么重要罢。

又被叫去写了两天文档,今天应该有些时间了,接着写

不知道这样想法对不对,有时候觉得个人并没有办法改变自己的命运,没想到我竟然成为了一个宿命论者。。。当年把“成事在人”作为座右铭的人怎么会成为一个宿命论者呢,宿命论者应该并不是悲观主义者,也许只是某种思考的一个阶段吧。

扯远了,还是说回实习的事。我想到了作为开发者技术路线的选择问题了。我从大一才开始接触编程,C, Java,C#什么的都学过一些,在大三的时候跟着武威大神开始学php接触项目开发,到现在为止做过最多的也是PHP的项目。这次实习又是做的PHP。其实我并不希望把PHP作为我的主力开发的语言,也不太希望以后工作还是用PHP开发;但是PHP这语言找工作,找实习确实很有优势,随便找找就有一大堆岗位。

我用PHP比较多,自然也是知道PHP的诸多被人诟病的地方的。在开发者的鄙视链中PHP是被所有人鄙视的语言,但是这并不妨碍PHP最流行的web开发语言的地位。PHP组织混乱,库函数水平不高,甚至库函数命名规则都乱七八糟,很多特性都依靠框架去实现;作为最被人嘲讽的一门语言,科班出身的人选择它作为主力开发语言,真的是很需要勇气的。

所以就是学生在选择自己的技术方向的时候,要好好想清楚自己喜欢的方向,计算机领域的任何一个方向,一门语言要想做到精通都是需要很多的时间练习,在入门一段时间之后再想转向其他方向,对时间和精力都是很大的浪费。
技术的选择要有自己很喜欢也很擅长的部分,也要有很多基本熟识的其他技术。虽然我做的最多的是PHP,web开发方面,但是java,C#这些语言也不是很差啦,找个工作应该也还是没问题的。

也有很多人说语言都是相通的,学好一门看其他的就都差不多了。道理好像都是这么说的,但是真正要用的时候就不是这样了。语言确实是有自己的应用场景的,有自己的设计哲学的;对于C语言的大神来说,学类C的语言确实都问题不大,但是对于一般的人来说,还是应该选择一些适合自己的语言去重点学习。

编程语言的的设计哲学确实会影响使用者的思维习惯,常年使用C和Java的人与常年使用JavaScript或者Golang的人思维应该是有区别的。作为还未正式工作的年轻人应该多学习一些不同设计思路的语言,同类型的语言学习一门就差不多了,重要的是要接触一些新颖的语言。比如C#和Java这种相似度很高的语言,没必要深究,可以学习一些Nodejs,Golang,Rust等等,还可以学一下Haskell, Lisp等真正的函数式语言

学编程啊,当然要靠自我的奋斗,但是也要考虑到历史的行程。

待续

这两天在写一个项目的申请书,因为一直没有用word写文档也没注意这个问题,昨天写word的时候觉得非常卡顿,还时不出现一些鼠标指针跳屏的问题。。。就是删除一个字符再进行输入时,鼠标指针会跳到下面几行的某个位置,输入速度快的话直接输入到后面去了,又得删掉回退继续输入,甚是麻烦。
后来一查竟然是win10下,微软的拼音输入法在office 2013中有问题。。。输入的时候经常第一次按键不被识别,还有就是指针乱跳;万万没想到微软自家的软件结合在一起竟然出问题。。。。

虽然一直都觉得微软拼音挺好用了,输入速度还可以,颜色还可以随着主题一起变,挺不错的,但是这个问题实在有点严重。只好又换回Google拼音了,强力安利一下Google拼音,虽然很久没有更新了,但是确实非常好用。

注意在win10安装输入法后,不知道为什么选到Google拼音可能并不能输入,如果遇到这个问题,可能是设置里面没有添加Google输入法,去控制面板->语言和地区->语言;选择中文的选项添加输入法,把Google输入法加进去就可以了。