Go語言總結和學習指南

jopen 9年前發布 | 41K 次閱讀 Go語言 Google Go/Golang開發

早在2009年11月google剛推出go語言的時候,在好奇心的驅使下,就下載體驗過。那時的感覺是語法比較奇怪,相關的資源較少,并且習慣了動態語言Python。雖然它一出來就宣稱是一種為并發能力而生的語言,但是感覺Python已經能夠滿足自己的日常的開發要求,所以并不感覺它有什么優勢。
但是也在持續的關注它一點一點的發展:發現越來越多的項目采用go作為開發語言來開發程序,也越來越多的程序員,包括Python的程序員,在使用go語言。如今,go1.4 已經支持Android開發,有空又把go拿出來試用了把,當初它的為了追求語法上的簡潔而搞得比較古怪的語法變得不再那么讓人不舒服,也開始體會到它的諸多優勢,下面是我總結的Go的優點:
1、Go與C/C++一樣,都是可以把代碼直接編譯成二進制可執行程序,但是和C/C++不同的是go自帶垃圾收集器,這可以在不損失太大的性能的情況下大大的簡化程序的設計。
2、Go和Python一樣內置強大的方便使用的數據結構
3、豐富的庫和詳細的開發文檔:一種語言好不好用,除了語言本身外,還在于提供強大易用的庫支持,一個好的社區以及社區所維護的豐富的文檔。在這方面,個人認為Go做得相當不錯,文檔寫得很詳細,很多還配有示例代碼。
4、大大簡化了并發程序的開發,使用channel來開發并發程序真的是變得非常方便

5、簡潔的語法,盡量減少程序員打字的負擔,提高開發效率。


再來看下我總結的Go和Python兩者之間的對比:

1、其實Go和Python的有些設計理念還是一樣的,比如正像它的簡短的名字一樣,Go追求代碼的簡潔,甚至到了有些苛刻的地步。

2、不僅在語法上,Go盡量減少不必要的按鍵操作,它的垃圾收集機制,它的并發編程的能力,無疑大大方便了程序員的開發。

3、仔細分析Go和Python還有相似之處,如range函數,再如filepath.Walk等等。

4、 雖然開發者沒有明說,但無疑Go是借鑒了Python在易用性方面的經驗的,這也是為什么很多Python的程序員轉而使用Go的原因。


接下來看下Go的相關資源:

1、官方網點:http://golang.org/

2、官方的Go語言入門指南:http://tour.golang.org/welcome/1

該指南以詳盡的例子來引導你學習和了解Go語言的特性, 沒有比這更好的Go的入門學習資源了。這些示例分成三個部分:

1)、基礎:主講是Go的一些基本概念,流控制語句和一些內置的數據結構:slice和map的使用

2)、接下來講方法(Methods)和接口(interfaces)
3)、再接下來講并發(concurrency)

這些例子需要有些耐心來熟悉,尤其是interface和concurrency在剛接觸時需要點時間去消化。等熟悉完所有的例子,Go也算是入門了。

3、代碼路徑:https://github.com/golang/go

要自己體驗一下編譯代碼或者研究下Go代碼的可以下載下來看看,不過,對于初學者來說,可能太早了。

4、開發文檔:http://golang.org/pkg/

不用多說,Go開發人員必備。


再拉下來看下在網上收集了一些常用的例子:
1、 Go語言實現http共享
    package main  
    import (  
            "net/http"  
            "os"  
            "strings"  
    )  
    func shareDir(dirName string,port string,ch chan bool){  
            h := http.FileServer(http.Dir(dirName))  
            err := http.ListenAndServe(":"+port,h)  
            if err != nil {  
                    println("ListenAndServe : ",err.Error())  
                    ch <- false  
            }  
    }  
    func main(){  
            ch := make(chanbool)  
            port := "8000"http://Default port  
            iflen(os.Args)>1 {  
                    port = strings.Join(os.Args[1:2],"")  
            }  
            go shareDir(".",port,ch)  
            println("Listening on port ",port,"...")  
            bresult := <-ch  
            iffalse == bresult {  
                    println("Listening on port ",port," failed")  
            }  
    }  

鏈接:http://www.cnblogs.com/MikeZhang/archive/2012/03/13/httpShareGolang20120312.html


2、 Go 的文件與目錄遍歷方法 - path/filepath.Walk
    package main  
    import (  
        "path/filepath"  
        "os"  
        "fmt"  
        "flag"  
    )  
    func WalkFunc(path string, info os.FileInfo, err error) error {  
        return nil  
    }  
    type Walker struct {  
        directories []string  
        files       []string  
    }  
    func main() {  
        flag.Parse()  
    //    root := flag.Arg(0)  
        walker := new (Walker)  
        path := "."  
        filepath.Walk(path, func(path string, info os.FileInfo, err error) error {  
                if err != nil { return err }  
                if info.IsDir() {  
                    walker.directories = append(walker.directories, path)  
                } else {  
                    walker.files = append(walker.files, path)  
                }  
                return nil  
            })  
        fmt.Printf("found %d dir and  %d files\n", len(walker.directories), len(walker.files))  
        for i:=0;i<len(walker.files);i+=1 {  
            fmt.Println(walker.files[i])  
        }  
    }  

參考鏈接:http://caryagos.com/press/go-walk-files-diretories/


3、 簡單的TCP代理服務器
netfwd.go
    package main  
    import (  
    "net"  
    "fmt"  
    "io"  
    "os"  
    )  
    func main() {  
    if len(os.Args) != 3 {  
    fatal("usage: netfwd localIp:localPort remoteIp:remotePort")  
    }  
    localAddr := os.Args[1]  
    remoteAddr := os.Args[2]  
    local, err := net.Listen("tcp", localAddr)  
    if local == nil {  
    fatal("cannot listen: %v", err)  
    }  
    for {  
    conn, err := local.Accept()  
    if conn == nil {  
    fatal("accept failed: %v", err)  
    }  
    go forward(conn, remoteAddr)  
    }  
    }  

    func forward(local net.Conn, remoteAddr string) {  
    remote, err := net.Dial("tcp",remoteAddr)  
    if remote == nil {  
    fmt.Fprintf(os.Stderr, "remote dial failed: %v\n", err)  
    return  
    }  
    go io.Copy(local, remote)  
    go io.Copy(remote, local)  
    }  

    func fatal(s string, a ... interface{}) {  
    fmt.Fprintf(os.Stderr, "netfwd: %s\n", fmt.Sprintf(s, a))  
    os.Exit(2)  
    }  

4、命令行參數解析

go版本:
package main  
import (  
        "flag"  
        "fmt"  
)  
var (  
        ip = flag.String("host","127.0.0.1","ip address")  
        port = flag.String("port","8000","listen port")  
)  
func main() {  
        flag.Parse()  
        fmt.Println("ip   : ",*ip)  
        fmt.

python版本:
#! /usr/bin/python  
import getopt,sys  
if __name__ == "__main__":  
    try:  
        opts,args = getopt.getopt(sys.argv[1:],"h:p:",["host=","port="])  
    except getopt.GetoptError:  
        print "Usage :"  
        print "-h arg , --host=arg : set ip address"  
        print "-p arg , --port=arg : set port"  
        sys.exit(1)  
    host = "127.0.0.1"  
    port = 8000  
    for opt,arg in opts:  
        if opt in ("-h","--host"):  
            host = arg  
        if opt in ("-p","--port"):  
            port = arg  
    print "ip   : ",host  
    print "port : ",port 

參考鏈接:

http://www.cnblogs.com/MikeZhang/archive/2012/09/07/argsTest20120907.html

5、 調用其它程序并得到程序輸出(go和python)
go
    package main  
    import (  
        "os/exec"  
        "fmt"  
    )  
    func main(){  
        cmd := exec.Command("ls", "-l")  
        buf, err := cmd.Output()  
        fmt.Printf("%s\n%s",buf,err)  
    }  

python
    import os  
    var = os.popen('ls -l').read()  
    print var  

6、Go語言文件操作
寫文件
    package main  
    import (  
            "os"  
            "fmt"  
    )  
    func main() {  
            userFile := "test.txt"  
            fout,err := os.Create(userFile)  
            defer fout.Close()  
            if err != nil {  
                    fmt.Println(userFile,err)  
                    return  
            }  
            for i:= 0;i<10;i++ {  
                    fout.WriteString("Just a test!\r\n")  
                    fout.Write([]byte("Just a test!\r\n"))  
            }  
    }  

讀文件
    package main  
    import (  
            "os"  
            "fmt"  
    )  
    func main() {  
            userFile := "test.txt"  
            fin,err := os.Open(userFile)  
            defer fin.Close()  
            if err != nil {  
                    fmt.Println(userFile,err)  
                    return  
            }  
            buf := make([]byte, 1024)  
            for{  
                    n, _ := fin.Read(buf)  
                    if 0 == n { break }  
                    os.Stdout.Write(buf[:n])  
            }  
    }  

刪除文件
    func Remove(name string) Error  

具體見官網:http://golang.org/pkg/os/#Remove


7、 Golang通過Thrift框架完美實現跨語言調用
http://my.oschina.net/u/572653/blog/165285


最后,獻上《Go語言之父談Go:大道至簡》來結束這篇文章:
在這篇文章里,Go語言之父宣稱:Go的目標是解放程序員!我們已經看到了Go在解決程序員所作的努力,但是什么時候能夠解放程序員,我們還要試目以待,呵呵呵。

2015,go,let's go.

來自:http://blog.csdn.net/i2cbus/article/details/42399151

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!