Go net/http包

转载 2017年09月21日 17:52:23

使用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://blog.csdn.net/cc7756789w/article/details/51014076

相关文章推荐

Go网络编程之net/http包执行流程源码分析

1. http包建立web服务器 package main import (     "fmt"     "log"  ...
  • huwh_
  • huwh_
  • 2017-07-30 15:11
  • 187

Go利用net/http包搭建Web服务器

简介 利用Go的标准包net/http可以很方便的搭建服务器。实际上只需要一个函数和一个接口: net/http−−−−−−−\underline{net/http} package http ...

Go语言学习之net/http包(The way to go)

生命不止,继续go go go!!!从包名就能看到了吧,是golang中提供http的包: provides HTTP client and server implementations.先看一个...

Go语言net/http 解读.

Http包提供实现HTTP客户端和服务端的方法与函数。 Get、Head、Post、PostForm配合使用实现HTTP请求: resp, err := http.Get("http://exam...

转载自:http://blog.csdn.net/go_hyp/article/details/53693058

通过一段时间的工作,对SLAM的相关理论进行了学习,且对当前的一些开源SLAM算法项目进行了部署和测试,故对相关工作进行总结,以归并为文档,便于后续同学分析及讨论。限于个人该领域知识积累有限,不妥之处...

Go语言_HTTP包

在Golang中写一个http web服务器大致是有两种方法: 1 使用net包的net.Listen来对端口进行监听 2 使用net/http包   http客户端 ...
  • yatere
  • yatere
  • 2012-08-23 18:26
  • 1492

Go语言linux下构造tcp数据包(不使用net包和Cgo)

Golang可以通过syscall包中的相关socket函数(Windows和Linux中syscall中网络编程的函数不太一样)来进行网络编 程,可以用我们熟悉的方法使用raw socket,因为最...

Go net包介绍

与大多数语言一样,Go的标准库很全,因为Go的出现本来就是为了网络通信的高并发实现,所以其相关的网络库封装得更简洁,更Readable。这里来大致介绍几个网络库,掌握了学习方法,那么只要里面有那个库,...

go http与udp简单示例

内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)