加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Golang学习之net/http包

发布时间:2020-12-16 18:05:05 所属栏目:大数据 来源:网络整理
导读:使用net/http包快速创建一个HTTP服务器。 // file http_test1 .go package main import ( "fmt" "net/http" "log" )func HandleIndex(w http .ResponseWriter ,r *http .Request ) { r .ParseForm () fmt .Println ( "PATH: " ,r .URL .Path ) fmt .Println

使用net/http包快速创建一个HTTP服务器。

// file http_test1.go
package main 

import (
    "fmt"
    "net/http"
    "log"
)

func HandleIndex(w http.ResponseWriter,r *http.Request) {
    r.ParseForm()
    fmt.Println("PATH: ",r.URL.Path)
    fmt.Println("SCHEME: ",r.URL.Scheme)
    fmt.Println("METHOD: ",r.Method)
    fmt.Println()

    fmt.Fprintf(w,"<h1>Index Page</h1>")
}

func main() {
    http.HandleFunc("/",HandleIndex)
    err := http.ListenAndServe(":8000",nil)
    if err != nil {
        log.Fatal("ERROR: ",err)
    }
}

其实有时候语言无关紧要,原理大抵相同。此handler就如同Python的WSGI协议application(environ,start_response),如同Nodejs的callback(req,res)函数。并且他们底层都是基于socket(好像是的!!!)

$ go run http_test1.go

在浏览器中输入127.0.0.1:8000可以看到浏览器显示:

在终端上打印出如下信息:

虽然我们没有像其他语言一样显式地监听端口,启动服务器,或者用socket来搭建tcp或udp服务器,用while循环来获取请求数据。但是我们不难发现服务的入口在http.ListenAndServe。我们来看一下源码,探讨它究竟做了什么工作。

$ godoc -src net/http ListenAndServe

会打印出来两个相似的函数:

func (srv *Server) ListenAndServe() error {
    addr := srv.Addr
    if addr == "" {
        addr = ":http"
    }
    ln,err := net.Listen("tcp",addr)
    if err != nil {
        return err
    }
    return srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)})
}

func ListenAndServe(addr string,handler Handler) error {
    server := &Server{Addr: addr,Handler: handler}
    return server.ListenAndServe()
}

不要觉得这两个同名的函数像C++或Java一样是重载函数,Go语言中是没有函数签名这个概念的。

第一个函数func (srv *Server) ListenAndServe() error,这是type Server struct类型的一个方法,你可以理解为面向对象中的方法,属于Server类。

而第二个函数func ListenAndServe(addr string,handler Handler) error则是一个普通函数,内部进行封装,更简洁地实现HTTP服务器。你可以看到它创建了Server类的一个对象,然后调用了刚才说的第一个函数。

转自:http://www.52php.cn/article/p-reusqfyy-bcg.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读