前面已经介绍了Web是基于HTTP协议的一个服务,Go语言里面提供了一个完善的net/http包,通过HTTP包可以很方便的就搭建起来一个可以运行的web服务。同时使用这个包能很简单的对web的路由,静态文件,模板,cookie等数据进行设置和操作。
http包建立Web服务器
package main import( "fmt" "net/http" "strings" "log" ) func sayhello(w http.ResponseWriter, r *http.Request){ r.ParseForm() //解析参数,默认是不会解析的 fmt.Print(r.Form) //这些信息是输出到服务器端的打印信息 fmt.Print("path",r.URL.Path) fmt.Print("scheme",r.URL.Scheme) fmt.Print(r.Form["url_log"]) 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("/",sayhello) //设置访问的路由 err := http.ListenAndServer(":9090",nil) //设置监听的端口 if err!=nil{ log.Fatal("ListenAndServe:",err) } }
上面这个代码,我们build之后,然后执行web.exe,这个时候其实已经在9090端口监听http链接请求了。
在浏览器输入 http://localhost:9090
可以看到浏览器页面输出了 Hello astaxie!
可以换一个地址试试: http://localhost:9090/?url_long=111&url_long=222
我们看到上面的代码,要表写一个Web服务器很简单,只要调用http包的两个函数就可以了。
如果你以前是PHP程序员,也许会问,我们的Nginx,Apache服务器不需要吗?Go就是不需要这些,因为它直接就监听tcp端口了,做了Nginx做的事情,然后sayhello这个其实就是我们写的逻辑函数了,根php里面的控制层(controller)函数类似。
如果你以前是Python程序员,那么你一定听说过tornado,这个代码和它很像,Go就是拥有类似Python这样动态语言的特性,写web应用很方便。
如果你以前是Ruby程序员,会发现和ROR的/script/server启动有点类似。
我们看到Go通过简单的几行代码就已经运行起来一个web服务了,而且这个微博服务内部有支持高并发的特性,我们将会在下面的内容里详细介绍一下Go是如何实现web高并发的。