包含标签 go 的文章

Go程序编译后如何缩减大小

序言 在前文 Mac及Linux 如何使用自动化脚本登录JumpServer堡垒机及后面的服务器 中我们提到,使用 python 的 onetimepass 可能会出现偶尔 otp 不正确的情形,比如会生成 5位数 的otp密码。因此可以使用 Go 语言的代替。 本文就使用 MFA的实现代码进行缩减试验。 MFA 的 Go 代码 package main import ( "fmt" "os" "github.com/spf13/viper" "github.com/xlzd/gotp" ) // 从 %HOME%/.mfa.yml 读取个人……

阅读全文

使用 zap 替换 xorm 的日志系统

使用 zap 替换 xorm 的日志系统 zap 是 uber 开发的快速日志。 使用 https://github.com/yxlimo/xormzap 这个简易的适配器即可 代码如下: log.go 工具类 package util import "go.uber.org/zap" var logger *zap.Logger func Log() *zap.Logger { if logger != nil { return logger } g, _ := zap.NewProduction() logger = g return logger } func L() *zap.SugaredLogger { if logger != nil { return logger.Sugar() } return Log().Sugar() } repo.go 基于 xorm 的简陋封装 package repo import ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/yxlimo/xormzap" "xorm.io/xorm" "xorm.io/xorm/names" "yujinping.top/pams/util" ) var engine *xorm.Engine func Repo() *xorm.Engine { if engine != nil { return engine } var err error username := "root" password := "" host := "localhost" port := 3306 database……

阅读全文

go交叉编译生成跨平台应用

Go 交叉编译 Golang 支持交叉编译,可以在一个平台上编译生成另一个平台的可执行程序。 默认情况下,Go的runtime环境变量CGO_ENABLED=1,即默认开始cgo,允许你在Go代码中调用C代码 如果标准库中是在CGO_ENABLED=1情况下编译的,那么编译出来的最终二进制文件可能是动……

阅读全文

go使用embed嵌入静态资源

第一步构建 vue project 可以创建一个简单的vue3 + vite 的项目。 编译时,需要将发布路径设置为 /public/ ,完成后,将 dist 文件夹移动到 go 项目的根文件夹。 嵌入资源文件 嵌入资源文件主要是使用 Go 1.16后增加的编译 //go:embed 预编译方式。 我使用的是 Go 1.18.3 版本。 修改 main.go package main import ( "embed" "io/fs" "net/http" ) // 注意 嵌入文件夹的时候,要使用 dist/** 形式告诉编……

阅读全文

go使用匿名结构体嵌入时警告

现象 使用gin + jwt-go 做jwt验证的时候,写下如下结构体 type CustomClaims struct { Name string `json:"name"` UserId string `json:"userId"` // StandardClaims结构体实现了Claims接口(Valid()函数) jwt.StandardClaims } 初始化结构体 func (c *LoginController) generateToken(user entity.User) (string, error) { // 构造SignKey: 签名和解签名需要使用一个值 j := helper.NewJWT() // 构造用户claims信息(负荷) claims := helper.CustomClaims{ user.RealName,……

阅读全文

version of Delve is too old for Go version

在更新了 go 版本后,使用 GoLand 进行调试会报错 WARNING: undefined behavior - version of Delve is too old for Go version 1.20.5 (maximum supported version 1.19) 这是因为 go 的版本升级后,相对 dlv 的版本就低了。 所以解决办法就是升级对应的 dlv 版本 进入到 GOPATH 中 如果忘记了 GOPATH 是什么,输入 go env GOPATH 即可。 在 GOPATH 对应目录下安装最新版的 dlv go install github.com/go-delve/delve/cmd/dlv@latest 安装完毕后,其被安装在 GOPATH/bin 目录下,即 GOPATH/bin/dlv 打开 GoLand 菜单栏 Help……

阅读全文

go泛型简化数据库读取操作

前提 go 语言已经发布了 1.18 带有正式泛型的版本,但很多文章都仍旧只是限于官方的 Add(数学加减法) 泛型函数例子。因此本文尝试使用泛型来简化数据库操作这一个过程,深入了解及使用这个新版的泛型。当然其中的实现都以简单为主,当做使用泛型的可用例子。 注意本文使用 gorm 作为基础的数据库访问工具,当然……

阅读全文

go web 接口返回time.Time类型数据的格式化

使用自定义类型并重写 JSON 序列化和反序列化的方法 Go Web 接口结构体 type User struct { Id uint64 `json:"id"` Username string `json:"username"` Password string `json:"password"` CreateTime time.Time `json:"createTime"` } 接口输出 createTime 字段的时候其格式并不符合我们的习惯。可以使用类型别名的方式重写 JSON 的两个方法: MarshalJSON() ([]byte, error) UnmarshalJSON(data []byte) error package types import ( "fmt" "time" ) type DateTime time.Time func (d DateTime) MarshalJSON() ([]byte, error) { // 重写time转换成json之后的格式 var str = fmt.Sprintf("\"%s\"", time.Time(d).Format("2006-01-02T15:04:05")) return []byte(str), nil }……

阅读全文

go使用各种orm时无法映射time.Time类型的解决方案

问题现象 无论是使用各种 ORM 工具(sqlx,xorm,gorm 等)访问 MySQL 时,当将记录集映射为结构体的时候,当结构体中有属性类型是time.Time 的时候,总是报unsupported Scan, storing driver.Value type []uint8 into type *time.Time 的错误,并且结构体中的 time.Time 类型字段被设置为默认零值。 解决方案 解决方法是使用 MySQL 驱动程序自带……

阅读全文

接口测试辅助工具sql2json使用说明书

sql2json 使用 go 开发的本地 WEB 服务器,允许将 sql 语句执行结果转换为 json 输出。 可以用于 PostMan 等测试软件测试接口时的数据校验,要求测试人员会编写相应的 SQL 语句。 支持 windows、Linux、Mac 等主流操作系统。 以下以 Mac 版本的命令行版本进行说明,实际使用的时候请根据操作系统使用合适的可执行文件。 下载地……

阅读全文