go http.Handler
http1
package main import (
"log"
"net/http"
"fmt"
) func main() {
db:=database{"shoes":,"socks":}
log.Fatal(http.ListenAndServe("localhost:5000",db))
}
type dollars float32 func (d dollars) String() string {
return fmt.Sprintf("$%.2f",d)
}
type database map[string]dollars func (db database) ServeHTTP(w http.ResponseWriter, req *http.Request) {
for item,price:=range db{
fmt.Fprintf(w,"%s: %s\n",item,price)
}
}
打开浏览器:http://localhost:5000/

http2
package main import (
"fmt"
"net/http"
"log"
) func main() {
db:=database{"shoes":,"socks":}
mux:=http.NewServeMux()
mux.Handle("/list",http.HandlerFunc(db.list))
mux.Handle("/price",http.HandlerFunc(db.price))
log.Fatal(http.ListenAndServe("localhost:5000",mux))
}
type database map[string]dollars
type dollars float32 func (d dollars) String() string {
return fmt.Sprintf("$%.2f",d)
}
func (db database) list(w http.ResponseWriter, req *http.Request) {
for item,price:=range db{
fmt.Fprintf(w,"%s: %s\n",item,price)
}
}
func (db database) price(w http.ResponseWriter,req *http.Request) {
item:=req.URL.Query().Get("item")
price,ok:=db[item]
if !ok{
w.WriteHeader(http.StatusNotFound)
fmt.Fprintf(w,"no such item: %q\n",item)
return
}
fmt.Fprintf(w,"%s\n",price)
}
打开浏览器:http://localhost:5000/price?item=socks

clock1
package main import (
"net"
"io"
"time"
"log"
) func main() {
listener,err:=net.Listen("tcp","localhost:8000")
if err!=nil{
log.Fatal(err)
}
for{
conn,err:=listener.Accept()
if err!=nil{
log.Print(err)
continue
}
handleConn(conn)
}
} func handleConn(c net.Conn) {
defer c.Close()
for{
_,err:=io.WriteString(c,time.Now().Format("15:04:05\r\n"))
if err!=nil{
return
}
time.Sleep(*time.Second)
}
}
运行clock1,打开cmd,使用telnet localhost 8000 进行连接

或者使用下面的程序
netcat1
package main import (
"io"
"log"
"net"
"os"
) func main() {
conn,err:=net.Dial("tcp","localhost:8000")
if err!=nil{
log.Fatal(err)
}
defer conn.Close()
mustCopy(os.Stdout,conn)
} func mustCopy(dst io.Writer, src io.Reader) {
if _,err:=io.Copy(dst,src);err!=nil{
log.Fatal(err)
}
}
为了让服务器支持并发,只需要在handleConn上添加一个go
clock2
for{
conn,err:=listener.Accept()
if err!=nil{
log.Print(err)
continue
}
go handleConn2(conn)
}
go http.Handler的更多相关文章
- android Handler介绍
Handler使用介绍: Handler根据接收的消息,处理UI更新.Thread线程发出消息,通知Handler更新UI. Handler mHandler = new Handler() { p ...
- Handler
1.1 继承AbstractController优点:能定制请求方式 package cn.happyl.controller; import javax.servlet.http.HttpServl ...
- Android消息处理机制(Handler、Looper、MessageQueue与Message)
Android是消息驱动的,实现消息驱动有几个要素: 消息的表示:Message 消息队列:MessageQueue 消息循环,用于循环取出消息进行处理:Looper 消息处理,消息循环从消息队列中取 ...
- Android笔记——Handler Runnable与Thread的区别
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...
- Android消息传递之Handler消息机制
前言: 无论是现在所做的项目还是以前的项目中,都会遇见线程之间通信.组件之间通信,目前统一采用EventBus来做处理,在总结学习EventBus之前,觉得还是需要学习总结一下最初的实现方式,也算是不 ...
- Handler系列之内存泄漏
本篇简单的讲一下平常使用Handler时造成内存泄漏的问题. 什么是内存泄漏?大白话讲就是分配出去的内存,回收不回来.严重会导致内存不足OOM.下面来看一下造成内存泄漏的代码: public clas ...
- Handler系列之创建子线程Handler
上一篇我介绍了Handler机制的工作原理,默认情况下,ActivityThread类为我们创建的了主线程的Looper和消息队列,所以当你创建Handler之后发送消息的时候,消息的轮训和handl ...
- Handler系列之原理分析
上一节我们讲解了Handler的基本使用方法,也是平时大家用到的最多的使用方式.那么本节让我们来学习一下Handler的工作原理吧!!! 我们知道Android中我们只能在ui线程(主线程)更新ui信 ...
- Handler系列之使用
作为一个Android开发者,我们肯定熟悉并使用过Handler机制.最常用的使用场景是"在子线程更新ui",实际上我们知道上面的说话是错误的.因为Android中只有主线程才能更 ...
- 阶段一:用Handler和Message实现计时效果及其中一些疑问
“阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 本来是打算继续做天气预报的优化的,但因为某些原因,我要先把之前做的小应用优化一下.所以今天就插播一下用Handle ...
随机推荐
- [leetcode]76. Minimum Window Substring最小字符串窗口
Given a string S and a string T, find the minimum window in S which will contain all the characters ...
- kubernetes namespace Terminating
1.kubectl get namespace annoying-namespace-to-delete -o json > tmp.jsonthen edit tmp.json and rem ...
- delphi 中OutputDebugString 函数的妙用(转载)
原文地址 https://www.peganza.com/delphi-and-outputdebugstring.html Ever wanted to monitor your Delphi ap ...
- selenium实现淘宝的商品爬取
一.问题 本次利用selenium自动化测试,完成对淘宝的爬取,这样可以避免一些反爬的措施,也是一种爬虫常用的手段.本次实战的难点: 1.如何利用selenium绕过淘宝的登录界面 2.获取淘宝的页面 ...
- 2019.02.14 codechef Chef at the Food Fair(线段树+泰勒展开)
传送门 题意:现在有nnn个位置,每个位置上有一个值aia_iai. 要求支持如下两种操作: 区间乘vvv 求区间的(1−ai)(1-a_i)(1−ai)之积 思路: 考虑转换式子: Ans=∏i ...
- Memcache cpu占用过高
分析应该是memcache的内存大小还是默认配置,已经满足不了当前的大数据量的需要了,大量的新缓存需要进入,同时大量的旧缓存又需要被淘汰出来,一进一出导致CPU占用过多.进入注册表,找到:HKEY_L ...
- UVa 11481 Arrange the Numbers (组合数学)
题意:给定 n,m,k,问你在 1 ~ n 的排列中,前 m 个恰好有 k 个不在自己位置的排列有多少个. 析:枚举 m+1 ~ n 中有多少个恰好在自己位置,这个是C(n-m, i),然后前面选出 ...
- [solution] JZOJ-5795 词典
[solution]JZOJ-5795 词典 题面 Description 小C有$n$个字符串$T_1 T_n$,给出$m$个询问 第$i$个询问给出一个字符串$S_i$,对于每个询问,我们可以得到 ...
- jsp页面有一个注册form表单,传值的时候后台接收到的全部是null
[页面上的传值元素一定要有name属性才可在后台接受到参数的值.切记!] 此处一定要注意,form表单里面的元素,比如input元素是否和后台的requset.getparameter();中的参数名 ...
- TabLoaout简单框架
import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design. ...