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相 ...
随机推荐
- centos6.5 用户管理
linux 用户管理 命令:useradd 选项: -c comment 备注信息 -d 用户目录 usr/test 不存在 则 -m test 创建 -s shell文件,指定用户的登录Shell. ...
- thinkPHP--SQL连贯操作
一.连贯入门 连贯操作使用起来非常简单,比如查找到 id 为 1,2,3,4 中按照创建时间的倒序的前两 位. //连贯操作入门 $user = M('User'); var_dump($user-& ...
- Express安装过程
1,首选全局安装express,进入nodejs的安装目录执行以下语句 npm install -g express 2,安装工具 npm install -g express-generator 3 ...
- Google Protocol Buffer 的使用
简介 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 ...
- scala-类
---恢复内容开始--- 随笔记录scala中,有哪些类,如何定义一个类,有哪些注意点. 一,scala中有哪些类? 1,简单类 class 2,单例模式 object 3,伴生类 4,case cl ...
- 考查SQLite 3索引对整数排序的性能影响
做个实验,想了解SQLite3索引对整数排序的性能影响. 用这个测试表,考查绿色那列: id name date 自增型主键 字符串型,随机生成 整数型 随机生成,范围0到54354354 1 bMz ...
- Sql Server中不常用的表运算符之APPLY(2)
在Sql Server中不常用的表运算符之APPLY(1)中提到,SQL2005中新支持的APPLY的特性:1.可以直接将表表达式(表值函数或者子查询)作为APPLY语句的右表连接左表.2.由于使用A ...
- Net 分页功能的实现
首先写一个接口 1 2 3 4 5 6 public interface IPagedList { int CurrentPageIndex { get; set; } ...
- windows 下 gvim打开默认全屏显示
在_vimrc文件中加入如下配置即可: autocmd GUIEnter * simalt ~x
- pdo 事物的处理