1. 程式人生 > 實用技巧 >關於Golang語言的web程式設計的例項及常見問題

關於Golang語言的web程式設計的例項及常見問題


多核處理器越來越普及。有沒有一種簡單的辦法,能夠讓我們寫的軟體釋放多核的威力?是有的。隨著Golang, Erlang, Scala等為併發設計的程式語言的興起,新的併發模式逐漸清晰。正如程序式程式設計和麵向物件一樣,一個好的程式設計模式有一個極其簡潔的核心,還有在此之上豐富的外延。可以解決現實世界中各種各樣的問題。


她的logo~

172139800.jpg


Go語言的一個很大的優勢就是內建了goroutine機制,使得開發者可以方便地編寫併發程式。


這是《go web 程式設計》的作者的話。。。

通過這段時間的學習,我也朝著這些應用學習著。

InfoQ:您現在是否已經在專案中大量應用Go語言,主要在哪些方面呢?



謝孟軍:我現在開發的專案基本都是用Go開發的,但是頁面上我還是用JavaScript來渲染,我現在的開發模式是JavaScript渲染前端+RESTful API,中間用JSON資料進行互動。採用這種模式開發主要有幾點原因:
我認為JavaScript渲染頁面方面比Go的模板做的好很多,而且JavaScript現有的庫非常多,很容易做出很多效果,我的理念就是不管xxx,會抓老鼠就是好貓,合適的語言用在合適的地方。
Go開發API相當地快速,而且效能很高,是PHP、Python之類的不能比擬的。
設計成RESTful API的話,系統就比較容易擴充套件,擴充套件性比較好。


源地址 http://rfyiamcool.blog.51cto.com/1030776/1285325

InfoQ:您認為Go語言在Web程式設計方面,哪些特點會讓它更有優勢?

謝孟軍:前面也說了Go語言設計的時候是系統級別的語言,所以他本身就有效能上面的優勢。其次Go在Web開發中內建的net/http包對於開發Web非常方便,使用者可以很方便的就搭建一個Web應用。熟悉PHP的同學可能對於nginx+fastcgi配置都很熟悉,但是Go開發的應用就不需要nginx,因為它自己就可以監控網路,解析資料包,而不依賴任何東西,你編譯完之後扔到伺服器起來就好了,這省去了一些部署的部分。最後就是Go的併發支援,大家都聽說過摩爾定律,硬體只會越來越快,CPU的核數也會越來越多,那麼Go的這個特性就讓我們這些程式設計師從以前的多執行緒處理中解放出來,讓Go語言的runtime來幫我們做這個事情,那用使用Go來編寫Web何樂而不為呢?


go的web程式設計裡,也出現了一個web框架 https://github.com/astaxie/beego

有朋友用過,感覺不錯。。。


安裝 ,大家要是安裝不了,就下載原始碼編譯,看readme 。。。。

easy_install mercurial
or   yum install mercurial
hg clone -r release https://go.googlecode.com/hg/ go
cd go/src $ ./all.bash

#開啟/etc/profile在最後新增下面兩行
export GOROOT=/usr/local/go
export PATH=$GOROOT/bin:$PATH

先來一個小demo 哈~

153541360.jpg

源地址 http://rfyiamcool.blog.51cto.com/1030776/1285325

一個簡單的http~ 簡單的輸出print

package main
import (
    "fmt"
    "net/http"
    "strings"
    "log"
)
func sayhelloName(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()  //解析引數,預設是不會解析的
    fmt.Println(r.Form)  //這些資訊是輸出到伺服器端的列印資訊
    fmt.Println("path", r.URL.Path)
    fmt.Println("scheme", r.URL.Scheme)
    fmt.Println(r.Form["url_long"])
    for k, v := range r.Form {
        fmt.Println("key:", k)
        fmt.Println("val:", strings.Join(v, ""))
    }
    fmt.Fprintf(w, "這裡是峰雲的測試頁面哈~!") //這個寫入到w的是輸出到客戶端的
    fmt.Fprintf(w, "\n") //這個寫入到w的是輸出到客戶端的
}
func main() {
    http.HandleFunc("/", sayhelloName) //設定訪問的路由
    err := http.ListenAndServe("0.0.0.0:9090", nil) //設定監聽的埠
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}


154747736.jpg


這裡介紹一個老外寫的web框架

https://github.com/hoisie/web

寫的風格很像web.py flask 。 喜歡這樣的東東。

package main
import (
    "github.com/hoisie/web"
)
func hello(ctx *web.Context, val string) {
    for k,v := range ctx.Params {
        println(k, v)
    }
}
func main() {
    web.Get("/(.*)", hello)
    web.Run("0.0.0.0:9999")
}
~

164820292.jpg


[[email protected] local]# curl "http://localhost:9999/?a=1&b=2"
[[email protected] local]# curl "http://localhost:9999/?a=aaaaaaaaaaaa&b=11111111111"
[[email protected] local]# curl "http://localhost:9999/?a=xiaorui&b=niubi"


讓我們簡單的測試下~

客戶端:

170048980.jpg


170048122.jpg

服務端:

170221542.jpg

看起來是沒有問題,當然用for curl的方法測試,確實有點搓。。。

我們用ab測試下~

源地址 http://rfyiamcool.blog.51cto.com/1030776/1285325

170709839.jpg


用了 2.1秒左右~ 這個還是單核的vm


我們來深入一下這個框架的功能~

234859552.jpg

提交後的結果~

234938762.jpg




這裡分享一個go呼叫外部命令的程式碼~

package main
import (
    "fmt"
    "io/ioutil"
    "os/exec"
)
func main() {
    cmd := exec.Command("/bin/sh", "-c", `ps aux`)
    stdout, err := cmd.StdoutPipe()
    if err != nil {
        fmt.Println("StdoutPipe: " + err.Error())
        return
    }
    stderr, err := cmd.StderrPipe()
    if err != nil {
        fmt.Println("StderrPipe: ", err.Error())
        return
    }
    if err := cmd.Start(); err != nil {
        fmt.Println("Start: ", err.Error())
        return
    }
    bytesErr, err := ioutil.ReadAll(stderr)
    if err != nil {
        fmt.Println("ReadAll stderr: ", err.Error())
        return
    }
    if len(bytesErr) != 0 {
        fmt.Printf("stderr is not nil: %s", bytesErr)
        return
    }
    bytes, err := ioutil.ReadAll(stdout)
    if err != nil {
        fmt.Println("ReadAll stdout: ", err.Error())
        return
    }
    if err := cmd.Wait(); err != nil {
        fmt.Println("Wait: ", err.Error())
        return
    }
    fmt.Printf("stdout: %s", bytes)
}


大家都會懂的哦~ 和python一樣也是呼叫os模組來執行命令。

大家可以在頁面上接收引數,用os模組來執行外部的命令。

100902372.jpg



今天有點忙,等我把一個需求解決了後,然後咱們繼續搞~





轉載於:https://blog.51cto.com/rfyiamcool/1285325