大象笔记

知者行之始,行者知之成

go build tag 实现开发环境与生产环境采用不同的 embed.FS 策略

通过 go embed.FS 将 gin 模板及静态资源文件打包进二进制程序 确实非常方便在服务器上部署、更新程序,但是开发环境调试前端代码就非常麻烦了。 因为每次修改都需要重新编译。 所以,我想利用 go build tag 条件编译来实现,开发环境不启用 embed.FS,只在发布时使用。 重命名问题 xxx redeclared in this block build tag 的互斥来解决。即 //go:build !prod //go:build prod 省略任何一个,如果定义了同名的函数,或者变量,都会导致重复声明的问题。 文件命名来区分 绞尽脑汁起名 load.go / l ...

阅读全文...

用手抠破耳朵,流脓,有异味

最近耳朵痒,就用手抠,越抠越痒,就挠破了。 持续了两个周,开始流脓,结痂; 结痂之后,又痒,手贱,如此反复。 直到流脓开始有异味,感觉大事不妙。 就搜索了一下,大概是外耳道被感染。 于是晚上赶紧去楼下买了 氧氟沙星滴耳液 双氧水 三包医用棉签 一共 13 元。氧氟沙星滴耳液大概 5 块多。 处理流程 先用棉签蘸双氧水清理外耳道。流脓那只耳朵有明显的沙沙声,就像小时候吃跳跳糖的感觉,而正常那只则没有感觉。 然后滴入氧氟沙星滴耳液 十五分钟后用棉签清理 实际感受 其实用双氧水消毒后,感觉已经非常清爽了,只是不放心又继续滴了氧氟沙星滴耳液。 效果 大概3天,基本痊愈了,滴耳液实际只用了一天, ...

阅读全文...

Go build tag 实现条件编译

今天遇到了需要使用条件编译的场景,于是查了一下 golang 是如何支持条件编译的。 条件编译简介 go 文档里称之为,Build Constraints,即,编译限制。 也称为 build tag。 //go:build tag_name 其决定了当前文件是否会被当前 package 所包含。 重点: 用于限制一整个文件是否应该被编译入最终的二进制文件,而不是一个文件中的部分代码片段 (block) build tag 的一些使用场景 测试环境使用 mock 服务;而正式环境使用真实数据 免费版、专业版和企业版提供不同的功能 不同操作系统的兼容性处理。通常用于跨平台,例如 windows ...

阅读全文...

smug 一款用 go 实现的 tmux session manager

之前由 tmuxinator 叛变到了 tmuxp, 但是不想 tmuxp 的打开速度奇慢无比,一个 8 个 window 的配置文件, 打开需要 5 秒以上,慢的不可思议。 于是今天借新建项目的机会,我又尝试了一个用 golang 实现的 tmux session 管理工具 - smug smug 的中文意思是: adj. 自鸣得意的;自以为是的;整洁的 n. 书呆子;自命不凡的家伙 我觉得可能是 session manager using go 的缩写吧,这样容易记忆。 smug 的优势 启动速度相比 tmuxp 这个渣渣快 N 倍,几乎秒开 配置相对 tmuxp 简洁太多 规避了对 ...

阅读全文...

VIM 中编辑 Javascript 保存时使用 ESLint 进行语法检查

为何迫切需要语法检查 昨天再次因为一个语法错误,交流浪费了不少时间。本以为是小改动,改完没看就发给别人了,没想到还是出错了。 对于需要编译的语言还好,编译时可以过滤掉语法错误。 但是对于 js 这种动态语言,特别是单文件,没有打包需求的情况下。 极易写出有语法错误的代码。之前是使用 gulp 插件实现的 js 语法检查。 对于写 tampermonkey 这种单文件的小功能,我只能在 VIM 里进行配置了。 全局安装 ESLint sudo npm install eslint --global (不推荐) VIM Syntastic 配置 Syntastic 是 VIM 的一个语法检查插件 ...

阅读全文...

Building Distributed Applications in Gin

关于这本书 这本书全名是: 《Building Distributed Applications in Gin: A hands-on guide for Go developers to build and deploy distributed web apps with the Gin framework》 名字这么长大概是为了 SEO 吧。。。 国内找不到纸质书,只有 kindle 上有电子版,但是我的 kindle 已吃灰。加上最近迷上了看纸质书,因为可以乱写乱画,还能给大鸿撕着玩。 于是搞了个 PDF 版,在 PDD 上找了家湖南的打印店,A4 纸打印加装订,463 页包邮才 26, ...

阅读全文...

Ant Design Form 字段设置默认值

正确的做法 例如这种,在 form 的 initialValues 里设置各个字段的默认值。 而不是去具体字段里用 value 或 defaultValue 属性来设置默认值。 <Form {...formItemLayout} form={form} name="register" onFinish={onFinish} initialValues={{ residence: ['zhejiang', 'hangzhou', 'xihu'], prefix: '86', }} scrollToFirstError > ...

阅读全文...

nginx 部署 antd pro 在非根目录报 404 错误

例如,使用 antd pro 开发的网站管理后台,在服务器部署时,想部署在 /admin 这种非根目录。根目录留给 go gin 的路由处理。 在 nginx 里按照正常 root 配置,访问时会报 404 错误。 config/config.ts 配置方法 需要修改 antd pro 的配置文件: config/config.ts 添加配置: publicPath: '/admin/', base: '/admin/', 打包目录 打包之后,上传服务器,解压后,将 dist 重命名为 admin。 nginx 配置 location /admin { alias /some/path/f ...

阅读全文...

通过 go embed.FS 将 gin 模板及静态资源文件打包进二进制程序

使用 gin 写网站会涉及到大量的外部文件: HTML 模板文件 静态资源文件:js,css,图片等 多语言翻译文件 发布时,除了要将编译好的二进制文件上传到服务器,还需要将上面提到的三类文件同步到二进制文件所在的目录。这样有两个弊端: 部署麻烦 如果是交付给客户,放在客户服务器上运行,客户能拿到这些文件的明文 embed 打包 go 1.16 引入的新特性 embed 支持将这些外部文件打包入二进制文件。 而且 gin 也支持了 embed,配置起来就更方便了。 首先需要过一遍 go embed 的官方文档,否则 gin 里的 embed 代码不容易理解。 template 及 st ...

阅读全文...

ant design 组件上传视频直传七牛云

由于视频文件太大,不适合通过自己服务器中转一层,还是在前端直接传到七牛云合理。 文档 七牛云 Go SDK 文档,参考上传凭证的生成:https://developer.qiniu.com/kodo/sdk/go 七牛云 JS SDK 文档,参考其自定义文件名:https://developer.qiniu.com/kodo/1283/javascript 关于 token token 上传凭证。 作用:客户端(移动端或者Web端)上传文件的时候,需要从客户自己的业务服务器获取上传凭证 有效期:默认情况下,在不指定上传凭证的有效时间情况下,默认有效期为1个小时。也可以自行指定上传凭证的 ...

阅读全文...

sync.Map 实现 gin template 全局共享变量

需求背景 在用 gin 开发网站的时候,每个页面都需要相同的页眉和页脚。 里面有些变量是通用的,例如: 公司 logo 电话 公司名称 备案号 等等。 但是,每次都在 controller 里从数据库里读取这些配置,有两个弊端: 每个页面的 controller 都需要重复写这个配置参数传入逻辑,啰嗦 这些配置极少变化,每次都读取数据库,没有必要。可以通过缓存来优化 实现逻辑 增加一个 template func,方便 template 中直接调用,省去 controller 中传参的步骤 定义一个全局缓存,sync.Map 类型。 实现代码 cache.go langs 作为可选 ...

阅读全文...

golang 查看变量的原始定义类型

我想把 golang gin 多语言网站的语言配置提取出来,作为项目的配置项。 而我不知道 language.Chinese 到底是什么类型,是不是 zh 这样的字符串,于是想打印一下输出。 测试一下 package main import ( "fmt" "reflect" "golang.org/x/text/language" ) func main() { fmt.Println("Hello, 世界") fmt.Println(language.Chinese) // zh fmt.P ...

阅读全文...