IT技术博客大学习 共学习 共进步

Go 语言初学实践(1)

云风的 BLOG 2011-03-01 22:52:59 浏览 2,966 次

今天想到个点子,做一个文件传输的服务。我觉得是个很简单的东西,可以满足自己的需要。写了篇 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 却是一件很自然的事情。嗯,我是这么理解的。

建议继续学习

  1. Go Reflect 性能 (阅读 13,667)
  2. 从Go看,语言设计(一) (阅读 6,046)
  3. go-kit 入门(一) (阅读 4,603)
  4. 为什么我们要使用Go语言以及如何使用它的 (阅读 4,465)
  5. Go 语言初步 (阅读 4,406)
  6. 从Go看,语言设计(二) (阅读 3,823)
  7. lua cothread (阅读 2,862)
  8. Go 语言简介(上)— 语法 (阅读 2,744)
  9. 谈谈Go语言的字符串设计 (阅读 2,584)
  10. Go 语言初学实践(2) (阅读 2,483)