golang

分类下相关文章

调用百度翻译接口自动为文章标题生成网址 slug

TODO [X] 中文: 调用翻译接口 [X] 英文: 无需处理,参考 php 里的处理,拼接,去掉指定词 [X] 权限控制:仅限 admin 后台调用 [X] 翻译 api [X] slug api: 还是自己手写吧,减少不必要的依赖。https://github.com/gosimple/slug/blob/master/slug.go [X] 单元测试 [X] publish article page add button [X] 整理 antd form input 添加按钮的流程 百度翻译接口 https://fanyi-api.baidu.com/doc/8 免费版: QP ...

阅读全文...

升级 gopls 到最新版本

写了一段单元测试的代码,在 vim 中提示错误 func TestGenSlug(t *testing.T) { assert.Equal(t, "hello-world", genSlug("Hello World")) } 错误信息为: [gopls] cannot use t (variable of type *testing.T) as assert.TestingT value in argument to assert.Equal: wrong type for method Errorf (have func(format stri ...

阅读全文...

golang 解析 byte slice 类型的 MQTT 消息 payload

MQTT Message payload 的类型 可以看到 payload 函数返回 byte slice 类型。 var f mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) { fmt.Printf("TOPIC: %s\n", msg.Topic()) fmt.Printf("MSG: %s\n", msg.Payload()) } type Message interface { Duplicate() bool Qos() byte Retained() ...

阅读全文...

订阅 MQTT 主题后,防止 go 程序退出 main

for 循环会彪 CPU,不好。找了一个 channel 的实现有效解决了这一问题。 实现代码 import ( "os" "os/signal" "syscall" ) func main() { channel := make(chan os.Signal, 1) signal.Notify(channel, os.Interrupt, syscall.SIGTERM) // MQTT 订阅逻辑 // ... <-channel } 代码分析 channel 的发送和接收数据都是阻塞 ...

阅读全文...

MQTT go 客户端发布消息

为了方便客户端测试,搭建好 EMQX 服务之后,需要用 golang 写一个发布消息的测试程序。 用于向指定主题推送消息,这样客户端可以提前测试 MQTT 相关的功能。 安装 Eclipse Paho MQTT Go Client > go get github.com/eclipse/paho.mqtt.golang go: downloading github.com/eclipse/paho.mqtt.golang v1.4.1 go: downloading github.com/gorilla/websocket v1.4.2 go: added github.com/ecl ...

阅读全文...

gin 服务线上没有 systemd 日志的问题

原配置 StandardOutput=append:/some_path/log/access.log StandardError=append:/some_path/log/err.log 我确认了目录权限没有问题。 真正的原因 systemd 版本问题 参考 https://unix.stackexchange.com/questions/321709/redirect-systemd-service-logs-to-file systemd v236 之后支持 file v240 之后支持 append。即每次重启后不会覆盖原文件 而腾讯云上的 systemd 是旧版本的 $ su ...

阅读全文...

gofmt, golint, gopls, govet 的区别

ALEInfo 显示,目前用 NeoVim 打开 go 代码文件时,默认启用了 4 个 linter: Enabled Linters: ['gofmt', 'golint', 'gopls', 'govet'] 其引起的不便是,同一行代码错误,可能会显示两条错误信息。例如, composite literal uses unkeyed fields 这一个问题,显示了两行提示:一个 warning,一个 error。推测是启用了两个 go lint 语法检测。 禁用之前,需要先了解各个工具的功能,及区别。 go vet vet 兽医的意思。。。大概是治疗 go 吉祥物这个大老鼠的吧。 ...

阅读全文...

go warnning: composite literal uses unkeyed fields

在启用了 NeoVim ALE 语法检测插件之后,我发现自己的代码到处都是各种警告,无论是 JS 还是 Go。 而 Go 代码中经常出现的警告信息就是 composite literal uses unkeyed fields。 例如,在使用 Gin I18N 实现多语言翻译的功能时: 警告信息 i18n/i18n.go|32 col 23-45 warning| github.com/gin-contrib/i18n.EmbedLoader composite literal uses unkeyed fields composite: 合成的 出问题的代码: Loader: & ...

阅读全文...

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 ...

阅读全文...

Go build tag 实现条件编译

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

阅读全文...

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

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

阅读全文...

golang template range 循环中引用外部变量

LocalizeUrl 是我自定义的一个函数,接受两个参数,第一个参数是 url,第二个是语言。 但是在 gin template 中使用时报错。 报错的模板代码 {{ range $index, $product := .products }} <a href={{ LocalizeUrl (printf "/product/%d" $product.ID) .lang }}> {{ end }} 晦涩的报错信息 template: index.html:88:69: executing "index.html" at .lang: c ...

阅读全文...

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 ...

阅读全文...

golang gin 的多语言网站国际化支持 i18n

需求 我想在 golang gin 同一套网站模板中同时支持中文和英文,类似 SpringBoot 中的 Thymeleaf I18N 那样,能在模板中调用翻译。 <label th:text="#{label}"></label> 改造思路 但是 gin i18n 的文档里并没有介绍如何在 template 中使用翻译。大概是很少有人用 gin 写网站吧,都是如何在 api 中使用翻译的方式。 Google 搜素了半天,几乎没找到几个模板国际化相关的参考。好不容易找到一个台湾大哥的实现方案,给了我很大启发。 其实就是使用 golang templ ...

阅读全文...