首页
📷在线壁纸
🎬娱乐天地
🔖友情链接
更多
📝留言板
Search
1
【javascript】JS-向当前url追加参数
2,345 阅读
2
【PHP】生成随机昵称
2,219 阅读
3
【PHP】判断一个字符串是否属于序列化后的数据
2,024 阅读
4
【css】html+css给文章页,做阅读全文
1,975 阅读
5
【PHP】 设计模式(23种)
1,910 阅读
📂默认分类
💓typecho
🏳️🌈代码改变世界
🍇 mysql
🍈 Winform
🍓 golang
🍉 设计模式
🥝 PHP
🍎 python
🍊 nginx
🍋 网络安全
🍍 javascript
🫑 database
🍭文艺范
🍏mac
AI
LLM
image
audio
yolo
3D
code
登录
Search
标签搜索
php
typecho
代码注释
redis
mysql
go
golang
nginx
thinkphp
docker
gin
linux
curl
html
mamp
算法
短网址
构造函数
webhook
代码片段
依然范儿特西
累计撰写
146
篇文章
累计收到
1
条评论
首页
栏目
📂默认分类
💓typecho
🏳️🌈代码改变世界
🍇 mysql
🍈 Winform
🍓 golang
🍉 设计模式
🥝 PHP
🍎 python
🍊 nginx
🍋 网络安全
🍍 javascript
🫑 database
🍭文艺范
🍏mac
AI
LLM
image
audio
yolo
3D
code
页面
📷在线壁纸
🎬娱乐天地
🔖友情链接
📝留言板
搜索到
146
篇与
的结果
2024-02-28
golang 编程规范 - 项目目录结构
参考链接 https://makeoptim.com/golang/standards/project-layout#google_vignette针对API使用的目录结构, 如果有用作其他服务,可以灵活调整 ├── api (项目对外提供和依赖的 API 文件) │ └── dao │ └── http │ └── v1 │ └── v2 │ └── middleware │ └── model │ └── router │ └── service │ └── validator │ ├── cmd (当前项目的可执行文件) │ └── ├── internal (私有的应用程序代码库) │ └── ├── configs (配置文件和初始化文件) │ └── ├── global (全局变量) │ └── ├── deploy (IaaS,PaaS,系统和容器编排部署配置和模板) │ └── ├── pkg (外部应用程序可以使用的库代码) │ └── ├── scripts (用于执行各种构建,安装,分析等操作的脚本) │ └── ├── third_parth (外部辅助工具) │ └── ├── test (单元测试) │ └── ├── vendor (应用程序的依赖关系) │ └──
2024年02月28日
21 阅读
0 评论
1 点赞
2024-02-28
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
在学习Golang中的gin框架的时候,遇到了下面的warning :[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.对于上面的WARNING翻译出来之后也就是 : 您信任所有代理,这是不安全的。我们建议您设置一个值。对于Goland编译器给出的建议 :Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all- proxies for details.也就是去看文档去了解细节,额,好像又啥也没说!那么怎么解决呢?根据warning也就是给gin设置一个信任ip : 127.0.0.1代码 :router := gin.Default() router.SetTrustedProxies([]string{"127.0.0.1"})
2024年02月28日
1 阅读
0 评论
1 点赞
2024-02-27
工作六不做&四个时间段不工作
纯属娱乐,请勿学习!工作我有六不做1,会的,不做,完全没有成长空间,都会了还浪费时间做什么;2,不会的,不做,反正都不会,没法做:3,要被检查的,不做,工作是为了累积工作经验学习知识提升自己,并不是为了完成任务去敷衍领导的;4,不被检查的,不做,辛辛苦苦做半天,甚至没人看一眼,那做什么;5,不到ddl的,不做,enfp心善,工作陪了这么久,临了临了,做完的话,于心不忍6,不能创造奇迹的,不做,一个人,一台电脑,一个夜晚,创造一个奇迹,最好能让公司直接上市!四个时间段不工作上班我有四个时间段不工作1.早上9:00-10:30我不工作,因为刚到公司要先吃点东西,休息一下,调整好状态再工作2.上午10:30-12:00我不工作,因为快要吃饭了我要准备餐具去食堂吃饭3.下午13:30-15:30我不工作,刚午休结束头脑还不清醒容易出错4.下午15:30-18:00我不工作,因为要下班了我得收拾好东西准备回家
2024年02月27日
1 阅读
0 评论
1 点赞
2024-02-20
Redis 只会用缓存?16种妙用让同事直呼牛X
redis 的妙用
2024年02月20日
3 阅读
0 评论
1 点赞
2023-10-10
Gin 框架在中间件中获取 response body 的方法
在写一个Gin框架日志中间件的时候,需要记录请求和响应相关的一些数据,例如请求参数、请求方法、请求时间、请求头、耗时、响应状态码、响应数据等,gin为获取这些数据基本都提供了现成的方法,但是获取响应数据还是有一定难度和复杂度的。那么,该如何获取响应数据也就是 response body 呢?先上代码。代码示例1、先写一个 middleware ,简单打印一下 response bodypackage middleware import ( "bytes" "fmt" "github.com/gin-gonic/gin" ) //自定义一个结构体,实现 gin.ResponseWriter interface type responseWriter struct { gin.ResponseWriter b *bytes.Buffer } //重写 Write([]byte) (int, error) 方法 func (w responseWriter) Write(b []byte) (int, error) { //向一个bytes.buffer中写一份数据来为获取body使用 w.b.Write(b) //完成gin.Context.Writer.Write()原有功能 return w.ResponseWriter.Write(b) } func PrintResponse(c *gin.Context) { writer := responseWriter{ c.Writer, bytes.NewBuffer([]byte{}), } c.Writer = writer c.Next() fmt.Println("response body:" + writer.b.String()) } 2、引用 middleware ,看看效果package main import ( "github.com/gin-gonic/gin" "hello/middleware" "net/http" ) func main() { r := gin.New() //添加获取响应内容 middleware r.Use(middleware.PrintResponse) r.GET("/test", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"name": "laofan"}) }) // Listen and Server in 0.0.0.0:8080 r.Run(":8080") } 打开浏览器访问http://127.0.0.1:8080/test ,即可在控制台中看到 response body 的输出内容response body:{"name":"laofan"}原理通过上面的代码可以看出,gin 通过调用如下方法写入了 response bodyc.JSON(http.StatusOK, gin.H{"name": "laofan"})追进 JSON 方法,源码如下,调用了 Render 方法package gin func (c *Context) JSON(code int, obj interface{}) { c.Render(code, render.JSON{Data: obj}) }追进 Render 方法, 可以看出 gin.Context.Writer 作为参数传给了 r.Render() 方法,这里形参 r 的实参为 render.JSON{Data: obj} ,所以实际调用的是 func (r JSON) Render(w http.ResponseWriter) 方法。package gin // Render writes the response headers and calls render.Render to render data. func (c *Context) Render(code int, r render.Render) { c.Status(code) if !bodyAllowedForStatus(code) { r.WriteContentType(c.Writer) c.Writer.WriteHeaderNow() return } if err := r.Render(c.Writer); err != nil { panic(err) } } func (r JSON) Render(w http.ResponseWriter) 源码如下package render // Render (JSON) writes data with custom ContentType. func (r JSON) Render(w http.ResponseWriter) (err error) { if err = WriteJSON(w, r.Data); err != nil { panic(err) } return } // WriteJSON marshals the given interface object and writes it with custom ContentType. func WriteJSON(w http.ResponseWriter, obj interface{}) error { writeContentType(w, jsonContentType) jsonBytes, err := json.Marshal(obj) if err != nil { return err } _, err = w.Write(jsonBytes) return err } 在 func (r JSON) Render() 方法中,gin.Context.Writer 被传到了 WriteJSON() 方法中,最终写入数据调用的是 gin.Context.Writer.Write() 方法。gin.ResponseWriter 源码如下package gin type Context struct { //... writermem responseWriter Writer ResponseWriter //... } // ResponseWriter ... type ResponseWriter interface { //... http.ResponseWriter //... } 可以看出 gin.Context.Writer 类型为 interface gin.ResponseWriter。package http type ResponseWriter interface { //... Write([]byte) (int, error) //... } 要实现 gin.ResponseWriter 接口,必须实现Write([]byte) (int, error) 方法。所以写入 response body 调用的是 gin.Context.Writer.Write() 方法,gin.Context.Writer 需要是type gin.ResponseWriter interface 的一个具体实现。到此,可以看出上面代码示例的思路:实现 type gin.ResponseWriter interface 并重写 Write([]byte) (int, error) 方法,该方法在实现 gin.Context.Writer.Write() 原有功能的同时,再向一个 bytes.buffer 中写一份数据来用于获取 response body 使用。
2023年10月10日
5 阅读
0 评论
0 点赞
2023-07-06
为什么父辈能存到钱,而我们不能 ?
父辈:水我:星巴克、瑞幸、霸王茶姬、茶颜悦色、奈雪、喜茶、古茗一点点、茶百道、百分茶.....父辈养狗:剩饭我养狗:狗粮、洗澡美容、零食、保健品、衣服、玩具、狗窝.....父辈:锅我:炖锅、炒锅、煎锅、奶锅、珐琅锅、雪平锅、砂锅、空气炸锅.....父辈:吃饱我:火锅、日料、韩餐、西餐、中餐、简餐、减肥餐、下午茶、烧烤、海鲜.....父辈:大宝我:水、乳、精华、眼霜、面霜、气垫、隔离、粉底、腮红、眼影、修容、假睫毛、美瞳......父辈:什么矿泉水20块钱?渴着回家喝我:什么矿泉水20块钱?买两瓶尝尝父辈:不能苦了孩子我:不能苦了自己父辈:存点钱,万一哪天要用呢我:存什么钱,万一明天就死了呢父辈:好好攒钱给儿女买车买房我:儿孙自有儿孙福,没有儿孙我享福父辈:打开电视就看我:打开电视看广告看毛广告开会员
2023年07月06日
9 阅读
0 评论
1 点赞
2023-06-28
pnpm add -g pnpm报错解决方案
pnpm add -g pnpm报错解决方案
2023年06月28日
2 阅读
0 评论
1 点赞
2023-06-07
微信支付&支付宝支付回调出口IP段查询
微信支付&支付宝支付回调出口IP段查询
2023年06月07日
7 阅读
0 评论
0 点赞
2023-05-12
基于thinkorm分页所用的分页样式
基于thinkorm分页所用的分页样式
2023年05月12日
2 阅读
0 评论
1 点赞
2023-04-25
typecho 优化(持续更新中)
1、前台:开启gzip 加速根目录/index.php//开启gizp ob_start('ob_gzhandler'); 2、后台:删除官方日志admin/index.php 此文件后边。删除下段代码:<div class="col-mb-12 col-tb-4" role="complementary"> <section class="latest-link"> <h3><?php _e('官方最新日志'); ?></h3> <div id="typecho-message"> <ul> <li><?php _e('读取中...'); ?></li> </ul> </div> </section> </div>
2023年04月25日
5 阅读
0 评论
0 点赞
1
2
3
...
15