升级某个包:
用go get -u会自动下载最新依赖包并更新mod文件,为了更新sum文件,则需要执行go mod tidy,在更新了go.mod文件后,可以通过运行以下命令来更新go.sum文件: go mod tidy
该命令将根据go.mod文件中的最新依赖项列表,go mod tidy 命令的作用是清理未使用的依赖,并更新 go.mod 以及 go.sum 文件。
首先新项目文件夹里用go mod init,然后写好代码,代码里面有依赖包,然后:
Download required dependencies:
go mod tidy更新go.mod
windows 使用gcc、g++ 配置golang 过程记录 [robotgo、gohook]
遇到问题:一致编译报错
github.com/go-vgo/robotgo
C:\Users\12194\go\pkg\mod\github.com\go-vgo\robotgo@v0.110.0\img.go:92:40: undefined: Bitmap
C:\Users\12194\go\pkg\mod\github.com\go-vgo\robotgo@v0.110.0\img.go:107:38: undefined: Bitmap
C:\Users\12194\go\pkg\mod\github.com\go-vgo\robotgo@v0.110.0\img.go:137:20: undefined: Bitmap
C:\Users\12194\go\pkg\mod\github.com\go-vgo\robotgo@v0.110.0\screen.go:26:28: undefined: Rect
C:\Users\12194\go\pkg\mod\github.com\go-vgo\robotgo@v0.110.0\robotgo_fn_v1.go:9:2: undefined: Move
C:\Users\12194\go\pkg\mod\github.com\go-vgo\robotgo@v0.110.0\robotgo_fn_v1.go:17:2: undefined: Toggle
C:\Users\12194\go\pkg\mod\github.com\go-vgo\robotgo@v0.110.0\robotgo_fn_v1.go:18:2: undefined: MilliSleep
C:\Users\12194\go\pkg\mod\github.com\go-vgo\robotgo@v0.110.0\robotgo_fn_v1.go:20:2: undefined: MoveSmooth
C:\Users\12194\go\pkg\mod\github.com\go-vgo\robotgo@v0.110.0\robotgo_fn_v1.go:21:2: undefined: Toggle
C:\Users\12194\go\pkg\mod\github.com\go-vgo\robotgo@v0.110.0\robotgo_fn_v1.go:29:9: undefined: MoveSmooth
C:\Users\12194\go\pkg\mod\github.com\go-vgo\robotgo@v0.110.0\robotgo_fn_v1.go:29:9: too many errors
Can’t crosscompile from linux to windows · Issue #27 · robotn/gohook (github.com)
这个文章详细说明了错误,以及解决办法我这里也较简单说明一下如何配置
1.首先下载 MinGW 这里到已经打包好的地方下载
Releases · niXman/mingw-builds-binaries (github.com)
2.下载解压之后找到添加到环境变量
3.重中之重配置 go env
设置开启 go C语言编译功能
go env -w CGO_ENABLED=1
设置编译使用的 gcc 的名称,这里的名称和 解压出来 bin 目录下的 gcc 文件名称要保持一致
go env -w CC=i686-w64-mingw32-gcc
设置 g++
go env -w CXX=i686-w64-mingw32-g++
设置 ARCH (具体根据自己的系统)
go env -w GOARCH=windows
系统的操作位数
go env -w GO=[ 386 | amd64 | arm64 ]
原文链接:https://blog.csdn.net/qq_19954983/article/details/137644494
MinGW-w64是一个免费的开源C库,用于针对Windows 32位和64位平台。
i686 和 x86_64 的区别是指编译器的目标架构。这两者之间有一些区别,例如在寄存器数量和大小,内存寻址,指令集等方面。
i686 是 32 位的 x86 架构,另外Win32 - i686 - Windows 32 位版本,本机运行并针对 Windows 32 位进行编译(也可在 Windows 64 位上运行,但在 32 位模式下)
x86_64 是 64 位的 x86 架构。Win64 - x86_64 - Windows 64 位版本,本机运行并针对 Windows 64 位进行编译(不会在 Windows 32 位上运行)
posix 和 win32 的区别是指编译器使用的线程模型。posix 是一种 UNIX API 标准,而 win32 是 Windows 的 API 标准。这两者之间有一些区别,例如在 mingw-w64 中,使用 posix 线程将启用 C++11/C11 多线程功能,并使 libgcc 依赖于 libwinpthreads。而使用 win32 线程则不会启用 C++11 多线程功能。
MCF是MCF Gthread是Windows 7及更高版本的线程支持库,它实现了gthread接口集,GCC在内部使用它来提供本地静态对象的初始化同步,libstdc++在内部使用它来提供C++11线程工具。
seh 和 dwarf 的区别是指编译器使用的异常处理模型。
seh 的意思是结构化异常处理(Structured Exception Handling),是一种在 Windows 上处理异常的机制。seh 可以处理硬件异常(如除零错误)和软件异常(如访问无效内存)。seh 也可以与 C++ 异常兼容。
dwarf 是一种在 Linux 上处理异常的机制,它使用了一种叫做 DWARF 的调试信息格式来描述程序的结构和行为。dwarf 可以处理 C++ 异常,但不能处理硬件异常。
msvcrt 的意思是 Microsoft Visual C++ 运行时(Microsoft Visual C++ Runtime),是一个提供 C 标准库函数的动态链接库。msvcrt 是 Windows 系统自带的,但由于向后兼容性的问题,它没有完全遵循 C99 标准,并且缺少一些功能。
ucrt 的意思是通用 C 运行时(Universal C Runtime),是一个提供 C 标准库函数的动态链接库。ucrt 是 Windows 10 及更新版本的系统自带的,它遵循了 C99 和 C11 标准,并且提供了一些额外的功能。
GDB - GNU 工程调试器
GNU Binutils - 二进制工具的集合
GNU Make - 一个控制可执行文件和其他非源文件生成的工具
Yasm - Yasm 模块化汇编程序项目
NASM - 全网汇编程序
JWasm - 一个免费的MASM兼容汇编程序
LLVM/Clang/LLD/LLDB - LLVM 编译器基础结构
原文链接:https://blog.csdn.net/BjarneCpp/article/details/131614026
升级gorm,就是把最新的下载,并且修改go.mod里的版本信息到最新的。
D:\gowork\src\github.com\3xxx\engineercms>go get gorm.io/gorm
go: downloading gorm.io/gorm v1.25.12
go: upgraded gorm.io/gorm v1.24.3 => v1.25.12
D:\gowork\src\github.com\3xxx\engineercms>go get gorm.io/driver/sqlite
go: downloading gorm.io/driver/sqlite v1.5.6
go: warning: github.com/mattn/go-sqlite3@v2.0.3+incompatible: retracted by module author: Accidental; no major changes or features.
go: to switch to the latest unretracted version, run:
go get github.com/mattn/go-sqlite3@latest
go: upgraded gorm.io/driver/sqlite v1.4.4 => v1.5.6
D:\gowork\src\github.com\3xxx\engineercms>go get github.com/mattn/go-sqlite3@latest
go: downloading github.com/mattn/go-sqlite3 v1.14.24
go: downloading github.com/onsi/ginkgo v1.7.0
go: downloading github.com/onsi/gomega v1.4.3
go: downloading gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15
go: removed github.com/casbin/beego-orm-adapter/v3 v3.0.2
go: downgraded github.com/mattn/go-sqlite3 v2.0.3+incompatible => v1.14.24
D:\gowork\src\github.com\3xxx\engineercms>go get github.com/casbin/beego-orm-adapter/v3
go: added github.com/casbin/beego-orm-adapter/v3 v3.2.0
go: upgraded github.com/mattn/go-sqlite3 v1.14.24 => v2.0.3+incompatible
升级casbin
D:\gowork\src\github.com\engineercms>go get github.com/casbin/casbin/v2
go: added github.com/bmatcuk/doublestar/v4 v4.6.1
go: upgraded github.com/casbin/casbin/v2 v2.60.0 => v2.100.0
go: added github.com/casbin/govaluate v1.2.0
升级excelize
D:\gowork\src\github.com\engineercms>go get github.com/xuri/excelize/v2
go: downloading github.com/stretchr/testify v1.8.4
go: upgraded github.com/richardlehane/msoleps v1.0.3 => v1.0.4
go: upgraded github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 => v0.0.0-20240408161823-9ad904a10d6d
go: upgraded github.com/xuri/excelize/v2 v2.6.1 => v2.9.0
go: upgraded github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 => v0.0.0-20240318013403-ab9948c2c4a7
go: upgraded golang.org/x/crypto v0.21.0 => v0.28.0
go: upgraded golang.org/x/image v0.5.0 => v0.18.0
go: upgraded golang.org/x/net v0.22.0 => v0.30.0
go: upgraded golang.org/x/sys v0.18.0 => v0.26.0
go: upgraded golang.org/x/text v0.14.0 => v0.19.0
提示说没有更新go.sum,需要执行下面的命令,把一些内容写入go.sum
D:\gowork\src\github.com\engineercms>go get github.com/disintegration/imaging@v1.6.2
D:\gowork\src\github.com\engineercms>go get github.com/hhrutter/tiff@v0.0.0-20190829141212-736cae8d0bc7
D:\gowork\src\github.com\engineercms>go get github.com/holys/initials-avatar@v0.0.0-20180809162153-a82edcad3408
D:\gowork\src\github.com\engineercms>go get github.com/holys/initials-avatar@v0.0.0-20180809162153-a82edcad3408
D:\gowork\src\github.com\engineercms>go get github.com/pdfcpu/pdfcpu/pkg/pdfcpu@v0.3.13
D:\gowork\src\github.com\engineercms> go get golang.org/x/crypto/argon2@v0.28.0
D:\gowork\src\github.com\engineercms>go get github.com/kardianos/service@v1.2.2
https://beego.wiki/zh-cn/docs/
https://beego.wiki/docs/module/task/
https://doc.meoying.com/en-US/beego/developing/orm/
1.beego删除了adapter里的logs,validation,……改到core和client文件夹下了
用代理加速clone
D:\gowork\src\github.com>go env -w GOPROXY=https://goproxy.io,direct
D:\gowork\src\github.com>git clone https://github.com/3xxx/engineercms.git
https://www.cnblogs.com/infodriven/p/16351624.html
(十三)GORM 自动建表(Migration特性)
GORM支持Migration特性,支持根据Go Struct结构自动生成对应的表结构。
注意:GORM 的AutoMigrate函数,仅支持建表,不支持修改字段和删除字段,避免意外导致丢失数据。
一、自动迁移(第一次建表)
通过AutoMigrate函数可以快速建表,如果表已经存在不会重复创建。
// 根据User结构体,自动创建表结构.
db.AutoMigrate(&User{})
// 一次创建User、Product、Order三个结构体对应的表结构
db.AutoMigrate(&User{}, &Product{}, &Order{})
// 可以通过Set设置附加参数,下面设置表的存储引擎为InnoDB
db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&User{})
二、Schema方法
1、检测表是否存在
// 检测User结构体对应的表是否存在
db.Migrator().HasTable(&User{})
// 检测表名users是否存在
db.Migrator().HasTable("users")
2、建表
// 根据User结构体建表
db.Migrator().CreateTable(&User{})
3、删除表
// 删除User结构体对应的表
db.Migrator().DropTable(&User{})
// 删除表名为users的表
db.Migrator().DropTable("users")
4、删除字段
// 删除User结构体对应表中的description字段
db.Migrator().DropColumn(&User{}, "Name")
5、添加索引
type User struct {
gorm.Model
Name string `gorm:"size:255;index:idx_name,unique"`
}
// 为 Name 字段创建索引
db.Migrator().CreateIndex(&User{}, "Name")
db.Migrator().CreateIndex(&User{}, "idx_name")
// 为 Name 字段删除索引
db.Migrator().DropIndex(&User{}, "Name")
db.Migrator().DropIndex(&User{}, "idx_name")
// 检查索引是否存在
db.Migrator().HasIndex(&User{}, "Name")
db.Migrator().HasIndex(&User{}, "idx_name")
type User struct {
gorm.Model
Name string `gorm:"size:255;index:idx_name,unique"`
Name2 string `gorm:"size:255;index:idx_name_2,unique"`
}
// 修改索引名
db.Migrator().RenameIndex(&User{}, "Name", "Name2")
db.Migrator().RenameIndex(&User{}, "idx_name", "idx_name_2")
三、组合索引
两个字段使用同一个索引名,Migration将创建复合索引,例如:
type User struct {
Name string `gorm:"index:idx_member"`
Number string `gorm:"index:idx_member"`
}
golang 动态更新表结构
发布时间:2024-10-27 09:39:43
动态更新表结构是在开发过程中常见的需求之一。在使用Golang进行开发时,可以利用GORM库轻松地实现动态更新表结构的功能。本文将详细介绍如何使用GORM进行动态更新表结构,并探讨其实际应用场景。 ## GORM简介 GORM是一个强大的ORM(对象关系映射)库,提供了许多便捷的功能,例如数据库迁移、查询构建以及模型定义等。在Golang开发中,GORM被广泛应用于与数据库交互。 ## 动态更新表结构 在实际开发中,我们经常需要根据需求变化来修改数据库表结构。如果手动修改表结构,往往会引起数据丢失或冗余。而使用GORM,可以方便地实现动态更新表结构而不丢失数据。 下面是一个示例,展示了如何使用GORM进行动态更新表结构的操作:
package main
import ( "fmt" "gorm.io/gorm" "gorm.io/driver/mysql" )
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:255"`
}
func main() {
dsn := "root:password@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 将User模型映射到users表
db.AutoMigrate(&User{})
// 更新表结构,添加Age字段
db.Migrator().AddColumn(&User{}, "Age")
// 更新表结构,修改Name字段
db.Migrator().RenameColumn(&User{}, "Name", "Username")
// 更新表结构,删除Age字段
db.Migrator().DropColumn(&User{}, "Age")
fmt.Println("Table structure updated successfully!")
}
上述示例中,通过db.Migrator()
方法可以获取到迁移器对象,然后可以使用其提供的一系列方法实现对表结构的动态更新。
例如,通过AddColumn
方法可以添加新的字段,通过RenameColumn
方法可以修改字段名,通过DropColumn
方法可以删除字段。
动态更新表结构的应用场景
动态更新表结构功能在很多场景下都非常有用。
下面列举了几个常见的应用场景:
静态配置表
在一些系统中,可能需要将静态的配置信息存储在数据库中。这些配置项可以在运行时动态修改,然后通过动态更新表结构来保证配置项的准确性和完整性。
例如,我们可以创建一个名为config的表,并存储一些静态配置项,例如:config_key和config_value。当配置项发生变化时,只需要更新表结构中的config_key和config_value对应的字段即可。
插件系统
在一些系统中,可能存在插件功能。插件可以是一个独立的功能模块,可以通过动态更新表结构实现对插件的扩展。
例如,我们可以创建一个名为plugins的表,存储插件的信息,包括插件名、版本号等。当需要添加新的插件时,只需要向表结构中添加新的字段即可。
用户自定义字段
在一些系统中,可能需要支持用户自定义字段。这时候可以使用动态更新表结构的功能实现用户自定义字段的添加、删除和修改。
例如,我们可以创建一个名为user_info的表,存储用户的信息。当用户需要添加自定义字段时,只需要向表结构中添加新的字段即可。
小结
使用GORM进行动态更新表结构是一种非常便捷和灵活的方式。通过灵活运用迁移器对象提供的方法,可以在不丢失数据的情况下修改数据库表结构。动态更新表结构的应用场景非常广泛,例如静态配置表、插件系统以及用户自定义字段等。对于需要频繁修改表结构的项目来说,使用GORM进行动态更新表结构将会带来很大的便利。
综上所述,使用GORM进行动态更新表结构是一种十分实用的方法,可以在开发过程中节省时间和精力,同时又能满足动态更新表结构的需求。如果你是一名Golang开发者,不妨尝试使用GORM来实现动态更新表结构,相信会给你带来不错的开发体验。
如何升级和降级依赖项
记住,go get -u
会自动升级和更新mod
例如,无需 clone 仓库中的代码,直接在项目目录中执行go get -u github.com/wechatpay-apiv3/wechatpay-go
- zhaoying818/go GitHub Wiki
应该使用go get来完成日常升级和降级依赖项,这将自动更新go.mod文件。 或者,你也可以直接编辑go.mod。
此外,诸如go build
,go test
或甚至go list
之类的命令将根据需要自动添加新的依赖项以满足导入(更新go.mod并下载新的依赖项)。
要查看所有直接和间接依赖项的可用次要和补丁升级,请运行go list -u -m all。
更新当前模块的所有直接和间接依赖到最新版本:
运行go get -u
去使用最新的次要或补丁版本
运行go get -u=patch
去使用最新补丁版本go get foo
更新到最新版本的foo。go get foo
相当于go get foo @latest
—— 换句话说,如果没有指定@版本,@latest是默认值。
在本节中,”latest”是带有[semver](https://semver.org/)标记的最新版本,如果没有semver标记,则是最新的已知commit提交。 除非存储库中没有其他semver标记,否则预发布标记不会被选为”最新”(详细信息)。
一个常见的错误是认为go get -u foo只能获得foo的最新版本。
实际上,go get -u foo或go get -u foo@latest中的-u意味着也可以获取foo的直接和间接依赖所有的最新版本。
升级foo的一个常见起点是运行go get foo或go get foo@latest而不用-u(一切正常后,再考虑go get -u=patch foo,go get -u=patch,go get -u foo或go get -u)。
要升级或降级到更具体的版本,’go get’允许通过添加@version后缀或”模块查询” 来覆盖版本选择的包参数,例如go get foo @v1.6.2,go get foo@e3702bed2,或go get foo @’ < v1.6.2’
使用诸如go get foo@master之类的分支名称是获取最新提交的一种方式,无论它是否具有semver标记。
通常,不解析为semver标记的模块查询将在go.mod文件中记录为伪版本。
请参阅”模块感知go get”和”模块查询”中go命令文档的部分,以获取有关这些主题的更多信息。
模块能够使用尚未引入模块的软件包,包括在go.mod中记录任何可用的semver标签,并使用这些semver标签进行升级或降级。 模块也可以使用没有任何正确的semver标签的软件包(在这种情况下,它们将使用go.mod中的伪版本进行记录)。
在升级或降级任何依赖项之后,你可能希望为构建(包括直接和间接依赖)的所有包运行测试以检查不兼容性:
$ go test all
gorm不更新0值的解决
// 通过 `Assign` 属性 更新记录——下面用的是`struct`,所以0值不会更新
// db.Where(User{Name: "jinzhu"}).Assign(User{Age: 20}).FirstOrCreate(&user)
// assign非常好用,如果存在了,则只更新某个字段,用`map`就能更新0值了
err = db.Where("business_id = ? AND user_id = ? AND Select_date = ?", businessid, userid, SelectDate).Assign(map[string]interface{}{"allowance": allowance}).FirstOrCreate(&businesscheckin).Error
// 根据 `struct` 更新属性,只会更新非零值的字段
// db.Model(&user).Updates(User{Name: "hello", Age: 18, Active: false})
// 根据 `map` 更新属性
// db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})
gorm乐观锁知识
最后编辑:秦晓川 更新时间:2025-02-22 15:30