Web服務(wù)器也是一個應(yīng)用程序,這個應(yīng)用程序打開了TCP的80端口,通過HTTP協(xié)議和瀏覽器交互。 Python和Go有非常成熟的類庫,可以用很短的程序來實現(xiàn)一個Web服務(wù)器的功能(打開80端口通過HTTP協(xié)議與瀏覽器交互)。
創(chuàng)新互聯(lián)主營南江網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,APP應(yīng)用開發(fā),南江h(huán)5小程序制作搭建,南江網(wǎng)站營銷推廣歡迎南江等地區(qū)企業(yè)咨詢
適合??蚣茏銐虺墒炝?A Survey of 5 Go Web Frameworks
小型項目你甚至不用框架,用net/http http - The Go Programming Language
常用庫也成熟了 Top - Go Search
golang的web后端即使不concurrent也比php,ruby,python快很多很多
golang里用concurrent真的非常方便,非常非??欤體eb項目golang scale成本低
如果你想,golang的部署可以比php更方便,使用go get和http.ServeAndListen()可以不用nginx和apache
對于文件改動重新編譯其實并不是大問題,看pilu/fresh · GitHub,其實你自己寫shell腳本(也可以直接用go寫,因為它本身就是系統(tǒng)語言)監(jiān)控文件系統(tǒng)改動然后自動重新build,即使是C/C++的項目這也不是大問題,人們不用C/C++寫web是因為它們不是寫web app的最佳選擇
golang寫的代碼編譯通過后,要比scripting language魯棒,因為go compiler強制一些最佳實踐
前端框架越來越豐富,前后端分離已經(jīng)是大多數(shù)軟件團隊采取的模式了。vue使用的場景也越來越多。
go本來使用template模板來進行前端的表現(xiàn),現(xiàn)在可以用vue來分擔很大一部分工作了。
通常直接使用go語言寫后端,然后使用靜態(tài)模板加載渲染前端,前端獲取后端提供的數(shù)據(jù)是使用{{ }}符號,2個套在一起的花括號。這個也是vue使用的數(shù)據(jù)表現(xiàn)方式。
如果go+vue來協(xié)同工作的話,需要對vue進行一點設(shè)置。比如把{{ }}的方式改為[[ ]]的方式。
首先我們要知道,vue的使用,需要在頁面中加載vue.js或vue.min.js
純靜態(tài)網(wǎng)頁使用vue是這樣的(給個html例子)
然后我們實現(xiàn)一個go的簡單web服務(wù)和模板頁面
這個go服務(wù)器通過端口 1989 展示服務(wù)器頁面,提供了一個靜態(tài)文件路徑 htmlpage,我們把vue.js和index.html文件都放置在htmlpage路徑里。
go服務(wù)器還用模板給前臺頁面提供了一個News結(jié)構(gòu)的數(shù)據(jù),數(shù)據(jù)包括:Title,Content,Author的值。
在index.html頁面中,加載vue.js的時候需要帶上靜態(tài)路徑 htmlpage
在 new 一個 vue 變量的時候,必須有一句來設(shè)置包裹數(shù)據(jù)的符號,我們這里設(shè)置這個符號為[[ ]]
同時,所有需要由 vue 渲染的數(shù)據(jù),都寫成類似這樣的樣子
在 go + vue 方式下的完整模板文件 index.html
此頁面中{{ }}包裹的數(shù)據(jù)是由go從后端提供的數(shù)據(jù)( 例如:{{.Title}}),而[[ ]]包裹的數(shù)據(jù),是vue渲染的數(shù)據(jù)。
只是把 Vue里的數(shù)據(jù),改為由go后端提供即可。
好吧,作者已經(jīng)在向月亮示愛了。呵呵 _
運行一下程序,看修改模板后的效果。
http包建立Web服務(wù)器
package main
import (
"fmt"
"net/http"
"strings"
"log"
)
func sayhelloName(w http.ResponseWriter, r *http.Request) {
r.ParseForm() //解析參數(shù),默認是不會解析的
fmt.Println(r.Form) //這些信息是輸出到服務(wù)器端的打印信息
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, "Hello astaxie!") //這個寫入到w的是輸出到客戶端的
}
func main() {
http.HandleFunc("/", sayhelloName) //設(shè)置訪問的路由
err := http.ListenAndServe(":9090", nil) //設(shè)置監(jiān)聽的端口
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
上面這個代碼,我們build之后,然后執(zhí)行web.exe,這個時候其實已經(jīng)在9090端口監(jiān)聽http鏈接請求了。
在瀏覽器輸入
可以看到瀏覽器頁面輸出了Hello astaxie!
可以換一個地址試試:
看看瀏覽器輸出的是什么,服務(wù)器輸出的是什么?
在服務(wù)器端輸出的信息如下:
圖3.8 用戶訪問Web之后服務(wù)器端打印的信息
我們看到上面的代碼,要編寫一個Web服務(wù)器很簡單,只要調(diào)用http包的兩個函數(shù)就可以了。
如果你以前是PHP程序員,那你也許就會問,我們的nginx、apache服務(wù)器不需要嗎?go就是不需要這些,因為他直接就監(jiān)聽tcp端口了,做了nginx做的事情,然后sayhelloName這個其實就是我們寫的邏輯函數(shù)了,跟php里面的控制層(controller)函數(shù)類似。
如果你以前是Python程序員,那么你一定聽說過tornado,這個代碼和他是不是很像,對,沒錯,Go就是擁有類似python這樣動態(tài)語言的特性,寫Web應(yīng)用很方便。
如果你以前是Ruby程序員,會發(fā)現(xiàn)和ROR的/script/server啟動有點類似。