Golang 文件服务器小结
花了一个星期学习文件服务器,老是在一些地方搞混,整理一下所学的,清晰了不少。
学Go半个月,还有很多不懂的地方,有理解错误的,还望高手指出。
注:以下代码中,w为http.ResponseWriter类型, r为*http.Request类型
1、先该清楚一些类型的意义:
Handler:处理请求和生成返回的接口。其实就是接口。
ServerMux:路由,也是一种Handler。还是接口。
Request:用户的请求信息,用来解析用户的请求信息包括,POST、GET、Cookie、URL等信息。
Response:服务器需要反馈给用户端的信息。
ResponseWriter:生成Response的接口。也还是接口
Conn:网络连接。
ServerMux有map表,map的key是r.URL.String(),而Value记录的是一个方法,这个方法与ServeHTTP是一样的,也叫HandlerFunc。另一个方法是Handle 用来注册HandlerFunc。
ServeMUx实现Handler接口,充当http.ListenAndServe()的第二个参数。
http.ListenAndServe()的第二个参数是Handle接口,实现配置外部路由器(也就是非默认的路由器)。
2、设置路由的方法:
(1)
func fooHandler(w,r){ }
http.Handle("/foo", fooHandler)//此处是http.Handle,而不是http.Handler
(2)
http.HandleFunc("/foo", func(w,r){
//处理
})
以上配置的是默认路由
如果自己使用了ServeMux作为路由,就得用其他配置方法了
(3)配置ServeMux路由
1)
mux:=http.NewServeMux()
mux.Handle("/foo",&fooHandler{})//第二个参数是一个Handler,可以是定义一个Handler接口,也可以是返回Handler的函数。比如:StripPrefix(prefix string, h Handler) Handler {}等。
type fooHandler struct{}
func (*fooHandler)serveHTTP(w,r){
//处理
}
2)
mux:=http.NewServeMux()
mux.HandleFunc("/foo", fooHandler)
func fooHandler(w,r){
//处理
}
3)
Var mux map[string] func(w,r)
mux=make[string]func(w,r)
mux["/foo"]=fooHandler
func fooHandler(w,r){
}
再定义一个Handler作为默认的handler,实现路由
type myHandler struct{}
func (*myHandler)ServeHTTP(w,r){
if h,ok:=mux[r.URL.String()];ok{ //注意mux[]的匹配。需要的时候,要用path包,比如我就用到了mux[path.Dir(r.URL.path)]。
h(w,r)
return
}
}
server自己定义:
server:=http.Server{
Addr: ":9090",
Handler: &myhandler{}, //myhandler在这里使用
ReadTimeout: 5 * time.Second,
}
3、简单文件服务器实现的三种方法
(1)
package main import (
"fmt"
"log"
"net/http"
) func sayHello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "%v", "Hello,this is from FileServer1.") //输出到客户端
}
func main() {
http.HandleFunc("/", sayHello)
err := http.ListenAndServe(":9090", nil) //使用默认handler = DefaultServeMux
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
FileServer1
(2)
package main import (
"fmt"
"log"
"net/http"
) type myhandler struct {
} func sayHello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "%v", "Hello,this is from FileServer2.")
}
func (*myhandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "%v", "Bye,this is from FileServer2.")
} func main() {
mux := http.NewServeMux()
mux.Handle("/b", &myhandler{})
mux.HandleFunc("/", sayHello)
err := http.ListenAndServe(":9090", mux)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
(3)
package main import (
"fmt"
"log"
"net/http"
"time"
) type myhandler struct {
} var mux map[string]func(http.ResponseWriter, *http.Request) func sayHello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "%v", "Hello,this is from FileServer3.")
}
func (*myhandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if h, ok := mux[r.URL.String()]; ok {
h(w, r)
return
}
} func main() {
server := http.Server{
Addr: ":9090",
Handler: &myhandler{},
ReadTimeout: * time.Second,
}
mux = make(map[string]func(http.ResponseWriter, *http.Request))
mux["/"] = sayHello
err := server.ListenAndServe()
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
Golang 文件服务器小结的更多相关文章
- golang 文件服务器
在go语言中可以用一句代码做一个文件服务器.如果有很多文件需要通过网页来供其他人下载,可以使用这个方法. package main import ( "log" "net ...
- Golang格式化小结
Golang的格式化使用了与c.python等语言类似的风格,但是更加丰富和通用.格式化函数在fmt包中,如:fmt.Printf,fmt.Fprintf,fmt.Sprintf,fmt.Printl ...
- Golang vs PHP 之文件服务器
前面的话 作者为golang脑残粉,本篇内容可能会引起phper不适,请慎读! 前两天有同事遇到一个问题,需要一个能支持上传.下载功能的HTTP服务器做一个数据中心.我刚好弄过,于是答应帮他搭一个. ...
- Golang从文件服务器获取图片显示到客户端
一.需求 A(客户端)--------------->B(服务端)-------------->C(文件服务器) 在客户端需要显示图片列表,但是不想C(文件服务器)的地址被暴露出来,所以现 ...
- 【GoLang】并发小结
006.并发 1 概念 1.1 goroutine是Go并行设计的核心,goroutine的本质是轻量级线程 1.2 golang的runtime实现了对轻量级线程即goroutine的智能调度管理 ...
- golang 服务平滑重启小结
背景 golang 程序平滑重启框架 supervisor 出现 defunct 原因 使用 master/worker 模式 背景 在业务快速增长中,前期只是验证模式是否可行,初期忽略程序发布重启带 ...
- Golang语言细节小结
前段时间,看了菜鸟入门,较浅的认识一下golang的语法习惯和规则,然后跟别人做了个爬虫项目,但是对于golang语言的语法结构还不是很懂.又看了遍<go实战>第二章. 构建程序在构建可执 ...
- golang中字符串的查找方法小结
1)func Contains(s, substr string) bool这个函数是查找某个字符是否在这个字符串中存在,存在返回true 示例如下: import ( "fmt" ...
- golang文件上传和下载
[代码]golang 实现的文件服务(包括上传,下载的server端和client端) (2013-09-20 02:03:52) 转载▼ 标签: golang go 文件服务器 it 分类: GO相 ...
随机推荐
- ppt 数组课后作业
任务要求:随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中. 设计思路:建一个数组,在for语句中将随机数存入数组中,然后每生成一个数就进行相加, ...
- zt:Linux查看程序端口占用情况
http://www.cnblogs.com/benio/archive/2010/09/15/1826728.html yxr注: 由于安装eda工具libero,license要配端口,为确认端口 ...
- python基础知识---迭代器、生成器、装饰器
一.迭代器 二.生成器 http://www.cnblogs.com/huxi/archive/2011/07/14/2106863.html def func(): #定义生成器,和普通函数的区别是 ...
- ---bind 配置
http://blog.csdn.net/zjunjun/article/details/7419125
- iOS 解压打包静态库命令
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Hannotate SC" } p.p2 { margin: 0.0px ...
- SQL Server 的表数据简单操作
--表数据操作----添加表数据----向现有表添加数据--[use 要操作数据表的数据库名称go]insert [into] 数据表 [(字段名1,字段名2,字段名3, ...)] values(值 ...
- javascript照片墙效果
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- C语言 值传递和地址传递
不少同学在学到C语言的指针部分时感到很困惑,对经常提到的"值传递"和"地址传递"两个概念弄不 明白.实际上,因为地址本身也可以作为一个特殊的"值&qu ...
- javascript 中的继承实现, call,apply,prototype,构造函数
javascript中继承可以通过call.apply.protoperty实现 1.call call的含义: foo.call(thisObject, args...) 表示函数foo调用的时候, ...
- Unity Application 前后台切换调用关系
[Unity Application 前后台切换调用关系] http://blog.csdn.net/aa4790139/article/details/48087877