分类 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 驱动程序自带……

阅读全文

go使用条件编译的形式集成swagger

安装 swag-go 的依赖 首先在项目根目录安装 swag-go 的依赖: go install github.com/go-openapi/swag 并在项目根目录执行生成 swagger 文档命令 swag init 在 routers 包内创建 swagger.go: //go:build doc // +build doc /** * 注意条件编译注释 //go:build doc 只能出现在代码文件的最顶部(这是Go 1.17的新的条件编译语法),不建议再使用//+build doc 旧的条件编译语法 */ package routers import ( \_ "demo/docs" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" ) func init() { swagHandler = ginSwagger.WrapHandler(swaggerFiles.Handler)……

阅读全文