在學Go語言

首發:我的博客,更新&糾錯&回覆java

開始學點兒Go語言,這語言聽說在國內比在國外火,社區上褒貶不一,不過「小馬過河」嘛,總要先本身試試再來下結論。node

 

環境準備:python

1.在Golang中國下載安裝go語言,我的喜歡用msi安裝,直接幫你設置環境變量,省得手動弄。
2.安裝goclipse:在eclipse官網下載最新版eclipse,安裝後進入菜單Help -> Install New Software,輸入網址http://goclipse.github.io/releases/。注意在讀出的長長的列表中選擇goclipse便可,千萬別全選(血的教訓),而後一路Next。
3.安裝好goclipse後,在eclipse配置(Window -> Preferences)中選Go菜單,裏面的GOROOTGOPATH自行指定,前者固然就是go的根目錄,後者自行指定一個目錄。
4.若是在控制檯沒法運行git命令,即電腦中未安裝git客戶端,則須要下載msysgit並安裝,這是爲第5步作準備。
5.點開菜單Go-Tools,點Download gocode的大按鈕,會自動下載安裝gocode,並放到上一步你指定的GOPATH裏。
6.下載GDB(我圖省事直接在csdn下的),將exe文件放到系統path中,即讓命令行運行gdb可以生效(我是將它直接放到go文件夾下的bin裏了),這樣goclipse就能斷點調試了。git

 

學習體會:
這裏有go語言的中文文檔,入門讀七牛出的《Go語言編程》我的以爲不錯,該書附錄有「經常使用包介紹」,對照着去文檔看看挺好。程序員

語法上,通常評價是「乏善可陳」,不花哨,走實用主義路線,看書第1章提到的,自動垃圾回收,豐富的內置類型,函數多返回值,錯誤處理,匿名函數閉包,類型接口,併發編程,反射,都比較基本,還有些動態語言常見的討喜的語法糖,除了多返回值以外,出彩的地方很少,但Go是強類型的。github

這意味着編譯器能幫你作不少事,錯誤檢查,語法提示,這能減輕程序員的很多負擔,編譯的結果好比exe程序,直接放到服務器裸機上就能跑,不像python啊nodejs它們須要如今目標機器上安語言,減輕了點工做量(一樣是發佈一個web程序,除了程序以外,java須要安個java環境再安個應用服務器,nodejs須要安個nodejs語言環境,而go啥都不用安),但若是在裸機上跑四個編譯後的程序,依賴庫就是四份的體積了,而python之類只有一份,你們公用。不過這不過重要。golang

重要的是Go最拿手的作網絡服務器的能力,使用輕量級的協程,能勝任很大的併發量(幾百萬),並且協程是語言天生支持的,啓動一個新協程直接go xxFun就好,xxFun是函數,Go裏函數是一等對象。
用基礎庫作網絡編程,語法簡單得使人髮指,看書的第5章,我的的helloworld以下(更高深的還沒研究):web

package main編程

import (
    "bufio"
    "fmt"
    "io/ioutil"
    "log"
    "net"
    "net/http"
    "os"
)windows

func main() {
    //httpServer()
    //httpClient()
    //tcpClient()
    //tcpServer()
    test()
}

func test() {
    ch := make(chan int, 1)
    for{
        select {
            case ch <- 0:
            case ch <- 1:
        }
        i := <-ch
        fmt.Println("Value", i)
    }
}

func cmd() {
    for {
        reader := bufio.NewReader(os.Stdin)
        input, _ := reader.ReadBytes('\n')
        println(string(input[0 : len(input)-1]))
    }
}

//http服務器
func httpServer() {
    http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello"))
    })
    log.Fatal(http.ListenAndServe(":90", nil))
}

//http客戶端
func httpClient() {
    client := &http.Client{}
    reqest, _ := http.NewRequest("GET", "http://427studio.net", nil)
    response, _ := client.Do(reqest)
    if response.StatusCode == 200 {
        body, _ := ioutil.ReadAll(response.Body)
        bodystr := string(body)
        fmt.Println(bodystr)
    }
}

//tcp客戶端
func tcpClient() {
    conn, _ := net.Dial("tcp", "182.92.10.238:42769")//寫
    fmt.Fprintf(conn, "getgames\n")
    
    data, _ := bufio.NewReader(conn).ReadString('\n')//讀
    fmt.Printf("%#v\n", data)
}

//tcp服務器
func tcpServer() {
    ln, err := net.Listen("tcp", ":6010")
    if err != nil {
        panic(err)
    }
    for {
        conn, err := ln.Accept()
        if err != nil {
            log.Fatal("get client connection error: ", err)
        }
        go _service(conn)
    }
}
//tcp服務器使用的服務函數
func _service(conn net.Conn) {
    data, err := bufio.NewReader(conn).ReadString('\n')
    if err != nil {
        log.Fatal("get client data error: ", err)
    }
    fmt.Printf("%#v\n", data)
    fmt.Fprintf(conn, "hello client\n")
    conn.Close()
}

func checkErr(e error){
    if e != nil {
        fmt.Fprintf(os.Stderr, "%s", e.Error())
    }
}

目前就學了這點兒,明天想個點子作服務器+多客戶端的命令行遊戲玩玩。

長期歡迎項目合做機會介紹,項目收入10%用於酬謝介紹人。新浪微博:@冷鏡,QQ:908789432

相關文章
相關標籤/搜索