首發:我的博客,更新&糾錯&回覆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菜單,裏面的GOROOT和GOPATH自行指定,前者固然就是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"
)windowsfunc 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())
}
}
目前就學了這點兒,明天想個點子作服務器+多客戶端的命令行遊戲玩玩。