惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
CXSECURITY Database RSS Feed - CXSecurity.com
L
LINUX DO - 热门话题
S
Secure Thoughts
TaoSecurity Blog
TaoSecurity Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Threat Research - Cisco Blogs
AI
AI
B
Blog RSS Feed
S
Schneier on Security
雷峰网
雷峰网
Schneier on Security
Schneier on Security
Help Net Security
Help Net Security
Cloudbric
Cloudbric
L
LINUX DO - 最新话题
罗磊的独立博客
有赞技术团队
有赞技术团队
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Apple Machine Learning Research
Apple Machine Learning Research
P
Proofpoint News Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
The Hacker News
The Hacker News
博客园 - Franky
Attack and Defense Labs
Attack and Defense Labs
The Cloudflare Blog
Webroot Blog
Webroot Blog
Last Week in AI
Last Week in AI
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
博客园 - 叶小钗
美团技术团队
L
Lohrmann on Cybersecurity
T
The Blog of Author Tim Ferriss
The Last Watchdog
The Last Watchdog
T
Troy Hunt's Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Vercel News
Vercel News
Know Your Adversary
Know Your Adversary
O
OpenAI News
博客园 - 【当耐特】
Hacker News - Newest:
Hacker News - Newest: "LLM"
C
Cybersecurity and Infrastructure Security Agency CISA
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
www.infosecurity-magazine.com
www.infosecurity-magazine.com
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
PCI Perspectives
PCI Perspectives
H
Heimdal Security Blog
I
InfoQ
GbyAI
GbyAI
T
Threatpost
C
Cisco Blogs

Razeen`s Blog

Let's Encrypt 推出 Gen Y 根证书架构:揭示 Web PKI 的五大未来趋势 通过 Wi-Fi 自动备份你的 iPhone 到 Nas 管理培训感悟:从技术视角看管理之路 UPS 一拖多:保护你的 NAS 和 Linux 服务器 从影音中心到 AI 助手:我的50款 Homelab 服务清单 从SSL证书有效期将缩短到47天聊开去 部署一个自己的 Running Page 谈谈特斯拉 Model Y 用车一年的感受和费用分析 弃用 Disqus 评论,使用自建 Waline 使用 Prometheus 和 Grafana 搭建你的证书监控面板 服务器迁移记:一次磁盘换板引发的Linux分区与挂载的学习 改善信息来源, 利用 RSS 高效获取资讯 (RSShub + Reeder5 + WeWe RSS) 多种 Docker 镜像拉取解决方案与实践 App分享 | AppCleaner - Mac上的卸载神器 Azure OpenAI API 申请和使用 如何开通 OneKey 虚拟信用卡,并充值消费 如何拥有一个可长期在国内使用的国外手机号码 分享开通 ChatGPT Plus 过程 如何开通 Depay 虚拟信用卡,并充值消费 如何开通欧易Web3钱包, 交易入账 如何5分钟内1块钱注册 ChatGPT 如何注册美区的 Apple ID (2023年/无需科学上网) NAS折腾记(11): NASTool3.0体验和降级 NAS折腾记(10): Docker版本的NASTool配置 NAS折腾记(9): NASTool与微信交互,微信发送消息远程下载电影【多图】 NAS折腾记(8):群晖安装 NASTool 实现影音半自动化【多图】 内网穿透(2):Tailscale 组网实现内网穿透,操作简单,无成本 内网穿透(1):总结了11中内网穿透的方式,总有一种适合你 NAS折腾记(7):从零开始设置(黑)群晖系统 NAS折腾记(6):黑群晖系统安装好后怎么洗白? NAS折腾记(5):群晖硬盘休眠设置与分析 NAS折腾记(4): 20分钟手把手带你完美安装 DS918+ 黑群晖7.1.1 NAS折腾记(3):NAS 装机 NAS折腾记(2):B360-ITX 双M.2 双2.5G网口 6 SATA主版 开箱 NAS折腾记(1):328元的4盘位Nas机箱开箱 Openwrt + Clash 全局科学上网 Newifi3 刷入 OpenWrt 固件 v21.02 利用 Markdown 画一些流程图、时序图、甘特图等 Homelab(8): 搭建自用 Gitlab 与 Docker 仓库 Nginx Tcp 转发保留客户端真实 IP (PROXY Protocol) Homelab (7):IPSec VPN(基于证书认证)客户端设置 Homelab (6): 基于自签发证书的 IPSec VPN 搭建 Homelab (5): DDNS 动态域名解析 Homelab (4): Linux 服务器基础环境准备 Homelab (3): 整体网络与基础硬件介绍 Go学习笔记(十)老项目迁移 go module 大型灾难记录 Github Actions 初体验之自动化部署 Hexo 博客 记一次 Nginx DNS 缓存导致转发问题 Homelab (2): 电信悦me网关修改桥接模式,路由器拨号 Homelab (1):5分钟上手黑群晖 NAS 终极 Bash 脚本指南 Typora 自动上传图片到七牛云 Ubuntu 20.04 LTS 有线网卡驱动安装 折腾 Ubuntu 20.04 LTS 开发环境 Go学习笔记(九) 计时器的生命周期[译] 利用 git hook 规范你的代码与 commit message 规范 git commit message 与自动化版本控制 超详细 vim 配置 (with MacVim) Golang 中的 RESTful API 最佳实践 折腾服务器(开篇) 我的第一台个人服务器 Newifi3 实现低成本家庭级科学上网 Go学习笔记(八) | 使用 os/exec 执行命令 如何用 Go 调用 Windows API Mac OS 自动根据 WI-FI 名字改变网络位置 关于 Docker 清理 MIME Types 速查表 Go学习笔记(七) | 理解OAuth 2.0并实现一个客户端 我又又又把博客迁移了 Go学习笔记(六) | 使用swaggo自动生成Restful API文档 书单 - 2018 IPFS 初体验,利用 IPFS 托管你的静态网站 记一次 PostgreSQL LIKE 索引优化,联合字段 LIKE 查询优化。 Disqus 添加有趣的 Reactions 的功能 TLS 1.3 详解 (RFC 8446解读) gRPC在Go中的使用(三)gRPC实现TLS加密通信与流模式 gRPC在Go中的使用(二)gRPC实现简单通讯 gRPC在Go中的使用(一)Protocol Buffers语法与相关使用 CentOS 安装 tshark 抓包工具 Go学习笔记(四) | win上使用VSCode搭建Go开发环境 日常 Postgres 数据库点滴记录 简单了解 PKCS 规范 美食篇 | DIY戚风蛋糕(烤箱做蛋糕) Go学习笔记(三) | 怎么写Go基准测试(性能测试) TLS1.3正式更新,为Nginx添加TLS1.3的支持 一次诡异的数据库删除 GitHub Pages自定义域名开启HTTPS 证书透明度是什么?它是怎么工作的? Go学习笔记(二) | 我对 recover 的一点误解 搭建证书透明度(certificate-transparency)日志服务之从入门到放弃 修复远程登陆 Centos 时,出现 UTF-8 Warning HTTPS篇之SSL握手过程详解 Go学习笔记(一) | postgres与golang点点滴滴 AWS 命令行界面(aws-cli)从安装到快速上手 数字证书分类及怎么区分各类数字证书 常用 linux 命令小结(一)文件目录操作 云服务器搭建 hexo 博客,git hooks自动更新 SSH 免密登陆, SSH Config 配置 Golang CGO Mac 交叉编译 Windows 使用 goose 让数据库迁移更加轻松 开始使用Ghost
Go学习笔记(五) | 使用代码片段(snippets)提高编码效率
2018-12-05 · via Razeen`s Blog

在Coding的时候,难免会有一些重复的代码或者形式相似的代码,在写这些代码的时候,你会觉得索然无味,甚至有点讨厌。这时候,你就会想,这段代码是否可以抽象成一个通用的片段,我简单敲几个快捷键就出来了呢。这也就代码片段所解决的问题。

现在几乎大部分的编译器都支持代码片段,如下图就是我用VSCode写一段简单的代码。

在写这段代码的时候我就用到了代码片段,即1中,当我们敲下func关键词后出现的第三个提示。只需要Tab一下,我们就可以使用该片段。如2中所示,该片段已经为我设定好了哪些位置可能需要填写,我们只需要Tab到对应位置填写即可。

其实这样的片段,我们一直在使用,如for自动补全格式,switch自动补全case等,当然这些都是他人已经定制好的,有时我们需要自己去定义一些符合自己业务场景的该怎么做呢?

VSCode 自定义Go片段

如下图所示:

  1. Shift + Cmd + P 打开命令窗口,输入snippets;

  2. 选择 Preferences: Open User Snippets;

  3. 选择 go.json

这样我们就可以编辑该go.json文件了。片段的书写就是以json的形式在该文件内定义的,具体格式如下:

"Print to console": {
	"prefix": "log",
	"body": [
		"console.log('$1');",
		"$2"
	],
	"description": "Log output to console"
},

其中:

  1. prefix 指的是前缀,也就是当我们敲出log时,就自动提示该片段;
  2. body 就是片段的具体内容,$1,$2… 是占位符号,当使用片段时就可以使用Tab在这些占位符之间跳跃;我们也可以使用${1:default}来设置一些标签帮助我们辨识。
  3. description 以及 Print to console 都是我们在选择该片段时提示的内容。description可不写。

效果如下所示:

例子

1.在使用gin的时候,我们的Handle函数总是这样的func HandleXXX(c *gin.Context),于是我们可以定义一个gin handle的片段;

	"GIN Route Handler": {
		"prefix": "ginh",
		"body": [
			"// Handle${1} godoc",
			"func Handle${1}(c *gin.Context) {",
			"$2",
			"}",
		]
	},

2.在使用gorm的时候,我们定义结构需要指定字段名称等,其形式总是这样的gorm:\"column:xxx",于是:

	"GORM" : {
		"prefix": "gormcl",
		"body" : [
			"`gorm:\"column:${1:columnName}\"`",
			"$2"
		]
	},

3.在使用Swago自动生成API文档时,我们需要去按照固定的范式写注释,于是:

	"SWAG API": {
		"prefix": "swag",
		"body": [
			"// @Summary $1",
                        "// @Tags $2",
			"// @Description $3",
			"// @Accept ${4:mpfd} ${5:json}",
			"// @Produce ${6:json}",
			"// @Param ${7:param} ${8:query} ${9:string} ${10:true} \"${11:describe}\"  ${12:Enums()} ${13:default}",
			"// @Success 200 {${14:object}} ${15:model}",
			"// @Router /${16:path} [${17:get}]"
		]
	},

等等,有了片段后,我们可以通过prefix+Tab更加高效的将这些重复内容编写出来,快去试试吧~

vim自定义Go片段

当然,除了宇宙第一编辑器VSCode外,vim上使用片段也是相当爽快的。

在vim上使用片段,需要装两个插件

  Plugin 'SirVer/ultisnips'
  Plugin 'honza/vim-snippets'

前者是片段的引擎,后者是网友提供的一些片段集合,安装好这两个插件后,我们在~/.vim/bundle/vim-snippets/UltiSnips~/.vim/bundle/vim-snippets/snippets 下能看到多种语言的代码片段。

这里 UltiSnips/*snippets/* 下的区别是片段使用的引擎不一样。 SnipMateUltiSnips是vim比较流行的片段引擎。 不同的引擎,语法稍有区别。 但UltiSnips是兼容SnipMate的。

我们这里主要看到~/.vim/bundle/vim-snippets/UltiSnips/go.snippets。打开该文件,我们能看到很多已经定义好的片段,只要按照该语法在该文件加入自定义片段即可使用。

其语法结构很简单

snippet <prefix> <name>
<body>
endsnippet

有时我们会看到<name> 后面会接着b,a,等字符。

其中b意味着 begin (snippet should be expanded only at the beginning of a line),也就是表示该片段只能在一段开始的时候使用。

a代表这自动展开的意思,其实还有w,i,r,s,t,m等限定词,具体可以使用:help ultisnip查看帮助文档。

了解语法后,可以将上面VSCode使用的片段在vim实现了~

例子

1.gin handle

snippet ginh "GIN Route Handler" b
// Handle$1 godoc
func Handle$1(c *gin.Context) {
    $2
}
endsnippet

2.gorm

snippet gormcl "gorm comments" 
\`gorm:"column:${1:columnName}$2"\`
endsnippet

3.swago

snippet swag "swag comments for api doc" b
// @Summary $1
// @Tags $2
// @Description $3
// @Accept ${4:mpfd} ${5:json}
// @Produce ${6:json}
// @Param ${7:param} ${8:query} ${9:string} ${10:true} "${11:describe}" ${12:Enums()} ${13:default}
// @Success 200 {${14:object}} ${15:model}
// @Router ${16:path} [${17:get}]
endsnippet

在实际的coding过程中,不断的积累一些代码片段,写一些适合自己业务场景的片段,确实能行而有效的提高代码的效率,提高代码的整洁度。