Go语言实现http共享(总结)
go语言入门简单,可要写出好的go代码得需要下些功夫。
前两天刚把http文件共享的升级过(http://www.cnblogs.com/MikeZhang/archive/2012/08/06/httpShareGolang20120805.html ),现在经大牛指点完全用http实现,感觉爽快多了。
一个简单的http服务器代码
package main
import (
"io"
"net/http"
"log"
)
func HelloServer(w http.ResponseWriter, req *http.Request) {
io.WriteString(w, "hello, world!\n")
}
func main() {
http.HandleFunc("/hello", HelloServer)
err := http.ListenAndServe(":12345", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
这里调用的是 http.HandleFunc函数,这个函数声明如下:
func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
这里用HelloServer实现HandleFunc函数的第二个参数。
一个简单的http服务器计数器程序代码
package main
import (
"fmt"
"net/http"
"log"
)
type Counter struct {
n int
}
func (ctr *Counter) ServeHTTP(c http.ResponseWriter, req *http.Request) {
ctr.n++
fmt.Fprintf(c, "counter = %d\n", ctr.n)
}
func main() {
http.Handle("/counter", new(Counter))
log.Fatal("ListenAndServe: ", http.ListenAndServe(":12345", nil))
}
这里调用的是http.Handle函数,这个函数声明如下:
func Handle(pattern string, handler Handler)
说明:几乎任何东西都可加以方法,几乎任何东西都可满足某界面,http包定义的Handler界面就是这样,任何物件实现了Handler都可服务 HTTP请求。
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
ResponseWriter 本身是个界面,它提供一些可访问的方法来返回客户的请求。这些方法包括标准的 Write 方法。因此 http.ResponseWriter 可用在io.Writer 可以使用的地方。Request 是个结构,包含客户请求的一个解析过的表示。
所以这里只要给 Counter实现ServeHTTP方法就可以服务HTTP请求了。
上面的两个例子是http服务器的两种方式,写出来主要是为了对比下。
两种方式都实现了类似这样的函数: handler func(ResponseWriter, *Request),但是第一个例子的函数名字不固定,可以随便起,第二个例子中的函数名字只能是ServeHTTP,其它的不行。
实现http文件共享
文件服务器要用到 http.FileServer提供的Handler,下面的代码就是基于第二种方式实现的。这里就不多解释了,不懂的参考上面的例子,比较下或许有帮助。
源代码如下:
/*
File : httpShareWithTrace.go
Author : Mike
E-Mail : Mike_Zhang@live.com
*/
package main
import (
"net/http"
"os"
"strings"
"log"
)
type TraceHandler struct {
h http.Handler
}
func (r TraceHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
println("get",req.URL.Path," from ",req.RemoteAddr)
r.h.ServeHTTP(w, req)
}
func main() {
port := "8080"//Default port
if len(os.Args)>1 { port = strings.Join(os.Args[1:2],"")}
h := http.FileServer(http.Dir("."))
http.Handle("/", TraceHandler{h})
println("Listening on port ",port,"...")
log.Fatal("ListenAndServe: ", http.ListenAndServe(":"+port, nil))
}
启动应用程序:
Web访问:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)