Go 语言初学实践(1)
今天想到个点子,做一个文件传输的服务。我觉得是个很简单的东西,可以满足自己的需要。写了篇 blog 理了一下思路。不过,如果光这口头说说其实是很偷懒的一件事情。我觉得,大部分网络产品弄个专职的所谓产品经理,光说想要啥自己不动手实现一下(或是不会写程序),是件极其不靠谱的事情。
说些啥都不如自己动手做出来。最近半年我好象老干这种事情,光说不练。最近一个月也没写什么大篇幅的代码,再老是这样,肯定会手生的。管它好不好,动手实现才是王道。正好最近想折腾一下 Go 语言,那么就拿 Go 来写写看吧。
新语言还是不熟的,老要翻资料。不过这也是学习的必经之路。晚上写了几百行程序,还经常出现语法错误,速度很慢,不过慢慢就有状态了。
在这里,就随便贴一小段代码,算是一点点初学实践吧。
这里有一个小需求,希望有一个 Go 函数,每次调用一次,就返回一个由英文大写字母构成的随机字符串。(用来生成一个短网址)那么用 Go 怎么实现好呢?
package main import "fmt" import "rand" var keyGen func() string func init() { keys := make(chan string) go func() { for { var buf [8]byte for i:=0 ; i<8 ; i++ { buf[i] = byte(rand.Intn(26)) + byte('A') } keys <- string(buf[:]) } } () keyGen = func() string { return <-keys } } func main() { fmt.Println(keyGen()) fmt.Println(keyGen()) fmt.Println(keyGen()) }
这是我的一个范例程序,不知道是否符合 Go 语言的惯用法。
这里使用了一个 goroutine ,不断的产生随机串,送去一个 chan 。然后 keyGen 是由 init 函数初始化的 closure ,它每次从 chan 里读到一个生成好的串。
这种实现手法,应该算是 go 程序和 C/C++ 程序最大的不同吧。如果用 C 实现,几乎不会有人采用多线程方案来生成它们,但是 go 里使用 goroutine 却是一件很自然的事情。嗯,我是这么理解的。
Comments
Posted by: lsc | (14) September 29, 2020 11:08 AM
Posted by: sundyli | (13) December 15, 2014 10:56 AM
Posted by: no | (12) October 30, 2012 09:43 PM
Posted by: cxwangyi | (11) March 19, 2011 08:48 AM
Posted by: 什么方法去痣最好 | (10) March 10, 2011 05:22 PM
Posted by: power cord | (9) March 8, 2011 02:57 PM
Posted by: Soli | (8) March 5, 2011 04:22 PM
Posted by: dongxu | (7) March 4, 2011 04:45 PM
Posted by: cloud | (6) March 2, 2011 11:11 AM
Posted by: lzm | (5) March 2, 2011 11:03 AM
Posted by: Davies | (4) March 2, 2011 08:44 AM
Posted by: 微波信号 | (3) March 2, 2011 01:55 AM
Posted by: Cloud | (2) March 2, 2011 01:44 AM
Posted by: Kabie | (1) March 2, 2011 12:26 AM