Go 語言如何去解決 Web 開發人員面臨的眾多問題?

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。坦白的說,我的團隊非常厭惡我對 Go 語言傳道的方式,每當我們團隊的程式碼程式庫出現問題時,他們希望我用一種更委婉的方式提出。![](https://raw.githubusercontent.com/studygolang/gctt-images/master/web-developers/Screen-Shot-2016-01-29-at-11-57-56.png) 我學會的第一門程式設計語言是 PHP,這是個優秀的語言,我可以用它很快地構建 Web 應用程式,這些應用程式也能夠達到預期的效果。但是我注意到,為了使其可用,我會花費大量的時間來關注緩衝。我也發現自己依靠很多第三方庫來做一些更複雜的任務,比如隊列,Web Sockets 等等。我發現自己使用了 Pusher,RabbitMQ,Beanstalkd 等等。這讓人感覺有點不好。在使用 Ruby,Node 和 Python 的時候,會出現類似的問題。在並發性、 WebSockets 和效能方面,這些語言會讓人感覺到它們是不完整的。我需要完全依賴架構和大量文檔、“文法糖”、DSL,坦率地說,它們經常會帶來很多非常佔用空間的東西。我開始把目光轉向 Go 語言。 首先 Go 是一種的靜態類型語言,我一直都喜歡這種方式。所以我學的非常快。Go 是一種偏底層的語言,你會遇到指標和記憶體引用等問題。我之前曾經涉足 C 語言,而 Go 感覺和 C 很像,但是 Go 提供的標準庫非常強大且便於使用,所以我對 Go 文法的精鍊扼要感到震驚。在深入研究之後,我決定研究 Go 是如何解決 PHP 編寫 Web 應用程式 / API等出現的一些問題。如何去解決 Web Sockets?Go 有幾個很出色的庫檔案。下面是一個 Gin 架構使用 Gorilla websockets 庫的例子...```gopackage mainimport ( "fmt" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" "net/http")func main() { r := gin.Default() r.LoadHTMLFiles("index.html") r.GET("/", func(c *gin.Context) { c.HTML(200, "index.html", nil) }) r.GET("/ws", func(c *gin.Context) { wshandler(c.Writer, c.Request) }) r.Run("localhost:2020")}var wsupgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024,}func wshandler(w http.ResponseWriter, r *http.Request) { conn, err := wsupgrader.Upgrade(w, r, nil) if err != nil { fmt.Println("Failed to upgrade ws: %+v", err) return } for { t, msg, err := conn.ReadMessage() if err != nil { break } conn.WriteMessage(t, msg) }}```### 並發在 PHP 中,我不得不要麼使用一些駭客手法運行線程,比如使用 `shell_exec()` 將一個任務委託給一個新的線程,或者使用一個單獨的服務,比如 Beanstalkd 或者 RabbitMQ。不過,你只要在需要並發功能的函數前加 `go` 的關鍵字就可實現。 例如...```gogo func(test string) { doSomething(test)}("This is a test")```或者你可以使用 channel...```gopackage mainimport "fmt"func main() { ch := make(chan int, 2) ch <- 1 ch <- 2 fmt.Println(<-ch) fmt.Println(<-ch)}```我將之前一個上傳圖片到 s3 的耗時任務放到 goroutine 中去實現接近即時的上傳效果,沒有第三方服務,完全本地。對於大多數開發人員來說不那麼令人印象深刻,但是對於 PHP 背景的開發人員來說,我對 Go 的易用性和效能提升感到震驚。### 測試單元測試在 PHP 或 Javascript 中可能會有點痛苦。有無數不同的測試架構,但沒有一個能夠像 go built 命令去如此簡單自然的進行測試。main.go ```gopackage mainimport "fmt"func sup(name string) string { return "Sup, " + name}func main() { fmt.Println(sup("Ewan"))}```現在我們的測試, main_test.go```gopackage mainimport "testing"func TestSup(t *testing.T) { expected := "Sup, Ewan" outcome := sup("Ewan") if outcome != expected { t.Fatalf("Expected %s, got %s", expected, outcome) }}```所有我需要做的是運行 `go test`,然後我得到了... ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/web-developers/Screen-Shot-2016-02-23-at-21-57-33.png) 是不是非常的簡單?### 運行速度在用 PHP 寫 RESTful API 時,我有非常多的 Symfony2 和 Laravel 等架構的使用經驗。沒有預先著重考慮幾個層級的緩衝; 如記憶體緩衝、操作緩衝、全頁緩衝等。代碼回應時間就會跟蝸牛一樣。Ruby 如此的聲名狼藉就是由於緩慢。由於 Go 的靜態類型,編譯性質以及對並發的原生支援。 Go 運行起來特別快。看看[架構基準測試](https://www.techempower.com/benchmarks/) ,實踐是最好的證明。 Go 最受歡迎的架構是 Gin 和 Revel,它們在大多數測試中的排名要高於 PHP 或者 Ruby。### DevOps關於 Go 我還注意到一些,這讓我非常震驚,不需要部署成千上萬的檔案,或者配置 Web 服務器或者 php-fpm 等。甚至不需要在你的伺服器上安裝 Go。一旦 Go 應用程式被編譯( `go build` ),你只剩下一個小小的二進位檔案。你只要去運行一個單獨的檔案。Go 還有一個非常穩固的內建 HTTP 伺服器... ```gopackage mainimport ( "io" "net/http")func hello(w http.ResponseWriter, r *http.Request) { io.WriteString(w, "Hello world!")}func main() { http.HandleFunc("/", hello) http.ListenAndServe(":8000", nil)}```### 文法Go 的文法不像 Ruby 那樣漂亮,或者像 JavaScript 一樣簡單。 但是它很簡潔,它讓人覺得更底層,但 Go 讓人感覺強大,表現力強。我們都看過傳統的 PHP 代碼,並感到身體不適。 相比之下,Go 非常容易閱讀。Go 另一個令人難以置信的好處是,在你編寫 Go 代碼的時候,已經有了一個很好的“最佳實務”。當然,PHP 有 PSR 標準等,但是它們相當新,開發人員採用它們的速度很慢。 而 Go 的語言設計者從一開始就明確了。 [格式化工具](https://blog.golang.org/go-fmt-your-code) 也內建在語言生態系統中,可以使用 'go fmt' 來運行。所以我的一點陋見就是為什麼我完全沉迷於 Go,現在我不能再回到 PHP 了。

via: https://ewanvalentine.io/why-go-solves-so-many-problems-for-web-developers/

作者:Ewan Valentine 譯者:Dingo1991 校對:rxcai

本文由 GCTT 原創編譯,Go語言中文網 榮譽推出

本文由 GCTT 原創翻譯,Go語言中文網 首發。也想加入譯者行列,為開源做一些自己的貢獻嗎?歡迎加入 GCTT!
翻譯工作和譯文發表僅用於學習和交流目的,翻譯工作遵照 CC-BY-NC-SA 協議規定,如果我們的工作有侵犯到您的權益,請及時聯絡我們。
歡迎遵照 CC-BY-NC-SA 協議規定 轉載,敬請在本文中標註並保留原文/譯文連結和作者/譯者等資訊。
文章僅代表作者的知識和看法,如有不同觀點,請樓下排隊吐槽

1672 次點擊  ∙  1 贊  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.