0%

初学Go语言

Go语言刚出现时就打算学过,后来有些变化一直没能学成。最近时间多一点就拿出来捣鼓捣鼓。

还是先从简单的搞起吧。Go在多并发方面真的很不错,虽然没有想Nodejs那样的V8解析执行,但是编译成可执行文件的效率也是蛮可观的。

先从一个简单的网络Echo例子开始:

server.go

package main

import (
    "io"
    "log"
    "net"
    //"time"
)

func main() {
    // Listen on TCP port 2000 on all interfaces.
    l, err := net.Listen("tcp", ":2000")
    if err != nil {
        log.Fatal(err)
    }
    defer l.Close()
    for {
        // Wait for a connection.
        conn, err := l.Accept()
        if err != nil {
            log.Fatal(err)
        }
        // Handle the connection in a new goroutine.
        // The loop then returns to accepting, so that
        // multiple connections may be served concurrently.
        go func(c net.Conn) {
            // Echo all incoming data.
            //seconds := 10
            //time.Sleep(time.Duration(seconds)*time.Second)
            io.Copy(c, c)
            // Shut down the connection.
            c.Close()
        }(conn)
    }
}

client.go

package main

import (
    "net"
    "fmt"
    "log"
    "bufio"
)

func main() {
    // create a connection
    c, err := net.Dial("tcp", "127.0.0.1:2000")
    if err != nil {
        log.Fatal(err)
    }
    defer c.Close()
    // send data
    fmt.Fprintf(c, "hello!\n")
    // recv data, end with '\n'.
    status, err := bufio.NewReader(c).ReadString('\n')
    if err != nil{
        log.Fatal(err)
    }
    fmt.Printf(status)
}

值得注意的是,client程序是以读取到\n为结束的,也就是说,若返回数据不存在\n就会无限等待或者被关闭连接,如果想读取可靠的二进制数据流,则可以尝试使用bufio.Read方法。

Golang还有一个比较有意思的地方是,interface对外开放的函数是以大小写区分的,这个也是我第一次见到,写长程序的时候经常会依赖于自动填充而输错,值得注意一下。

Update 2013-07-09:
Go1.1之后版本变化比较大,尤其是参数等等的部分。值得注意的几Tips(Windows):

1. 首先,GOPATH和GOROOT的设置。GOROOT在默认安装路径下可以不用设置,否则需指定Go的安装路径。GOPATH是第三方包放置路径,且不可与GOROOT相同。

2. 参数传递问题:1.1之后修改了参数传递方式,原来Unix方式的传输参数方式修改成了需要添加空格方式,比如比较常用的编译为GUI模式的程序的命令:

go build -ldflags -H windowsg

现在变成了

go build -ldflags “-H windowsgui”