当然是非常简陋版,这里的路线及方法完全按照来的 7天实现web框架
在这里将写代码时发现的知识点及注意事项写在下面
*加在类型前面指的是他接受的是内存地址,将变量及属性解析成内存地址的方法是在变量前面加上&
也可以利用反射更改变量值,代码如下:
re:=reflect.ValueOf(&x)
re=re.Elem()
re.SetInt(100)
[notice]这一段代码的作用和使用内存地址更改变量是一样的,只不过是用了反射操作内存地址指针的作用[/notice]
Go中的私有方法及变量开头字母通通小写,公告方法及变量开头字母通通使用大写
[notice]注意:在写web服务的api时,返回一个json形式,调用的架构里面的属性也得定义为公共的,否则其他方法里面读取不到里面的值,返回json就没有值,只会是{}[/notice]
Go中的map方法
我们统一采用&在结构体前面的写法,这样是为了将某个结构体指针指向结构体的内存地址
&Engine{router: make(map[string]HandlerFunc)}
[notice]在这里你会发现是使用的make来引用map[/notice]
你会发现当我使用Engine{}获取的变量只是一个拥有Engine的变量类型
当我用make是返回的是引用
当我用new时返回的是指针,这里new的使用方法时new(Engine)
[notice]通常我建议是使用make方法来定义的[/notice]
// Engine 架构定义一个属性为map
type Engine struct {
router map[string]HandlerFunc
}
// New 返回生成map的Engine架构内存地址
func New() *Engine {
return &Engine{router: make(map[string]HandlerFunc)}
}
map键值使用[key]的操作获取到指定的key键值的值。
_, ok := map1[key1] // 如果key1存在则ok == true,否则ok为false
//这里定义一个字符串值赋值给router的map属性key是字段的名称,同时将addRoute方法插入到Engine中
func (engine *Engine) addRoute(method string,patten string,handler HandlerFunc) {
key:=method+"-"+patten
engine.router[key]=handler
}
// Run 生成一个持续化的网络监听路由
func (engine *Engine)Run(add string)(err error) {
return http.ListenAndServe(add,engine)
}
这里我们需要注意的是这个方法里面的engine方法还需要一个ServeHTTP的方法,而我们需要按照我们的要求重写这个方法。
func (engine *Engine)ServeHTTP(w http.ResponseWriter,r *http.Request) {
key:=r.Method+"-"+r.URL.Path
if handler,ok:=engine.router[key];ok{
handler(w,r)
}else{
//不存在这个路径返回404
_, err := fmt.Fprint(w,"404 文件不存在哦",r.URL)
if err != nil {
return
}
}
}
go利用GET获取连接中的value值
return c.R.URL.Query().Get(key)
这一段语句是将返回得到架构的url地址进行解析,而Get,可以获取请求url连接后面的值
假设key是a,则在http://localhost:8080/api/service/get?a=a1 这个连接里面获取到a1,key是a,对应的到的值是a1,当然当多个a为key值时,他会获取多个key所对应的多个value值。
[notice-block]记得使用FromValue之前先使用 r.PareseFrom[/notice-block]
C所对应的架构
type Context struct {
W http.ResponseWriter
R *http.Request
//分别是path路径 method请求类型 statuscode标识码
Path string
Method string
StatusCode int
}
//WriteHeader(),这是设置的返回的状态码
Header().Set(key,value)
设置请求返回的header值,如增加token,“dsfgsdgdfg",在头部增加这么一个属性