当然是非常简陋版,这里的路线及方法完全按照来的 [7天实现web框架][1] 在这里将写代码时发现的知识点及注意事项写在下面 ---------- *加在类型前面指的是他接受的是内存地址,将变量及属性解析成内存地址的方法是在变量前面加上& 也可以利用反射更改变量值,代码如下: ```Go re:=reflect.ValueOf(&x) re=re.Elem() re.SetInt(100) ``` [notice]这一段代码的作用和使用内存地址更改变量是一样的,只不过是用了反射操作内存地址指针的作用[/notice] ---------- Go中的私有方法及变量开头字母通通小写,公告方法及变量开头字母通通使用大写 [notice]注意:在写web服务的api时,返回一个json形式,调用的架构里面的属性也得定义为公共的,否则其他方法里面读取不到里面的值,返回json就没有值,只会是{}[/notice] ---------- Go中的map方法 我们统一采用&在结构体前面的写法,这样是为了将某个结构体指针指向结构体的内存地址 ```Go &Engine{router: make(map[string]HandlerFunc)} ``` [notice]在这里你会发现是使用的make来引用map[/notice] 你会发现当我使用Engine{}获取的变量只是一个拥有Engine的变量类型 当我用make是返回的是引用 当我用new时返回的是指针,这里new的使用方法时new(Engine) [notice]通常我建议是使用make方法来定义的[/notice] ```Go // 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 ---------- ```Go //这里定义一个字符串值赋值给router的map属性key是字段的名称,同时将addRoute方法插入到Engine中 func (engine *Engine) addRoute(method string,patten string,handler HandlerFunc) { key:=method+"-"+patten engine.router[key]=handler } ``` ---------- ```Go // Run 生成一个持续化的网络监听路由 func (engine *Engine)Run(add string)(err error) { return http.ListenAndServe(add,engine) } ``` 这里我们需要注意的是这个方法里面的engine方法还需要一个ServeHTTP的方法,而我们需要按照我们的要求重写这个方法。 ```Go 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值 ```Go 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所对应的架构 ```Go 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",在头部增加这么一个属性 [1]: https://geektutu.com/post/gee-day1.html Loading... 当然是非常简陋版,这里的路线及方法完全按照来的 [7天实现web框架][1] 在这里将写代码时发现的知识点及注意事项写在下面 ---------- *加在类型前面指的是他接受的是内存地址,将变量及属性解析成内存地址的方法是在变量前面加上& 也可以利用反射更改变量值,代码如下: ```Go re:=reflect.ValueOf(&x) re=re.Elem() re.SetInt(100) ``` [notice]这一段代码的作用和使用内存地址更改变量是一样的,只不过是用了反射操作内存地址指针的作用[/notice] ---------- Go中的私有方法及变量开头字母通通小写,公告方法及变量开头字母通通使用大写 [notice]注意:在写web服务的api时,返回一个json形式,调用的架构里面的属性也得定义为公共的,否则其他方法里面读取不到里面的值,返回json就没有值,只会是{}[/notice] ---------- Go中的map方法 我们统一采用&在结构体前面的写法,这样是为了将某个结构体指针指向结构体的内存地址 ```Go &Engine{router: make(map[string]HandlerFunc)} ``` [notice]在这里你会发现是使用的make来引用map[/notice] 你会发现当我使用Engine{}获取的变量只是一个拥有Engine的变量类型 当我用make是返回的是引用 当我用new时返回的是指针,这里new的使用方法时new(Engine) [notice]通常我建议是使用make方法来定义的[/notice] ```Go // 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 ---------- ```Go //这里定义一个字符串值赋值给router的map属性key是字段的名称,同时将addRoute方法插入到Engine中 func (engine *Engine) addRoute(method string,patten string,handler HandlerFunc) { key:=method+"-"+patten engine.router[key]=handler } ``` ---------- ```Go // Run 生成一个持续化的网络监听路由 func (engine *Engine)Run(add string)(err error) { return http.ListenAndServe(add,engine) } ``` 这里我们需要注意的是这个方法里面的engine方法还需要一个ServeHTTP的方法,而我们需要按照我们的要求重写这个方法。 ```Go 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值 ```Go 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所对应的架构 ```Go 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",在头部增加这么一个属性 [1]: https://geektutu.com/post/gee-day1.html 最后修改:2021 年 06 月 14 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 1 如果觉得我的文章对你有用,请随意赞赏