随笔分类 - golang
摘要:1. Map 的主要结构 map 的底层数据结构定义在 Go 源码的 runtime 包中,其核心结构体是 hmap。Go 的 map 使用 哈希表 存储键值对,并结合了**桶(bucket)**机制来优化存储和查找。 hmap 的主要字段 count:存储的键值对数量。 buckets:哈希桶的数
阅读全文
摘要:在Go语言中,自定义类型可以帮助我们更好地组织代码和增强可读性。在本篇博客中,我们将探讨如何创建一个自定义类型,并将其与Swagger文档集成,以便在API中正确序列化和展示。 1. 创建自定义类型 首先,我们定义一个名为 RechargeType 的自定义类型。这个类型将用于表示不同的充值方式。
阅读全文
摘要:在 Go 编程中,切片是一种非常常用的数据结构。理解如何正确地修改切片中的元素非常重要,特别是当我们需要更改这些元素的值时。在这篇文章中,我们将探讨在切片中修改元素的不同方法,并讨论何时使用值切片和指针切片。 1. 使用值切片 在 Go 中,使用值切片(例如 []wmsModel.OrderProd
阅读全文
摘要:1、Golang中死锁的触发条件 1.1 书上关于死锁的四个必要条件的讲解 发生死锁时,线程永远不能完成,系统资源被阻碍使用,以致于阻止了其他作业开始执行。在讨论处理死锁问题的各种方法之前,我们首先深入讨论一下死锁特点。 必要条件: 如果在一个系统中以下四个条件同时成立,那么就能引起死锁: 互斥:至
阅读全文
摘要:在现代金融系统的开发过程中,涉及的数据处理和业务逻辑异常复杂,要求开发者不仅需要掌握基础的编程技术,还需要理解和应用一些高级的技术和策略。本文将探讨在金融系统开发中需要关注的关键知识点,包括事务管理、流水记录、数据一致性、安全性等方面,帮助你构建稳定、安全且高效的金融系统。 1. 事务管理 确保AC
阅读全文
摘要:在 Go 语言中,方法接收者可以是值接收者或指针接收者,而 Go 为开发者提供了一个方便的功能:自动接收者类型转换。这个功能使得我们在调用方法时可以更加灵活,不必担心接收者类型是否完全匹配。然而,尽管这个机制带来了便利,但开发者仍然需要注意方法接收者类型的选择,因为它们在功能、性能以及并发安全性等方
阅读全文
摘要:type TgUser struct { global.GVA_MODEL TelegramId string `json:"telegram_id" form:"telegram_id" gorm:"column:telegram_id;unique;"` Username string `jso
阅读全文
摘要:当在 Go 语言中使用切片时,切片的初始化是一个常见的操作。在本篇博客中,我们将介绍切片的初始化方式以及一些常见的示例。 什么是切片初始化? 切片是一个动态数组,可以根据需要自动调整大小。切片的初始化是为切片分配底层数组并设置切片的长度和容量。切片可以通过字面量、make 函数或从其他切片截取来进行
阅读全文
摘要:在你提供的代码片段中,涉及了变量作用域和闭包的问题,让我们来分析一下为什么输出的是 error2 而不是 error。 func msg() (result string) { err := errors.New("error") defer func() { fmt.Println(err) //
阅读全文
摘要:在 Go 语言中,使用 , 符号可以同时定义多个变量,并且它们可以是不同类型的变量。这种方式称为并行赋值(parallel assignment)。 让我们来看你提供的代码片段: err := errors.New("error") if err != nil { return } // err :
阅读全文
摘要:在Go语言中,defer语句用于延迟执行一个函数直到包含它的函数体执行完毕。在使用defer时,函数的参数会在defer语句执行时被计算,并且函数调用会被延迟执行。 如果你希望在函数返回时调用defer语句,并且想要传递一些参数给defer延迟调用的函数,你可以通过将这些参数先保存在变量中,然后在d
阅读全文
摘要:在Go语言中,我们经常需要将整数转换为字符串。然而,直接使用string()函数进行转换可能会导致意想不到的结果。这是因为string()函数会将整数解释为Unicode字符的代码点,而不是将其转换为对应的数字字符串。 错误的转换方式 例如,如果我们尝试将整数65转换为字符串: s := strin
阅读全文
摘要:做个记录,gorm在更新字段的时候,如果字符串字段是空的,那么将不会更新到数据库。 在使用gorm将一个字段更新为空的时候,发现并不生效,不了解具体什么原因,所以此时需要打开debug模式,查看原生SQL是如何执行的。 type Student struct { Model Email string
阅读全文
摘要:软删除 如果您的模型包含了一个 gorm.deletedat 字段(gorm.Model 已经包含了该字段),它将自动获得软删除的能力! 拥有软删除能力的模型调用 Delete 时,记录不会从数据库中被真正删除。但 GORM 会将 DeletedAt 置为当前时间, 并且你不能再通过普通的查询方法找
阅读全文
摘要:1,回答问题之前,先看下面这段代码 package main import "fmt" type girl struct { Name string Age int } func main() { gl := make(map[string]*girl) studs := []girl{ {Name
阅读全文
摘要:golang在defer修改返回值时需要格外注意! 如果未提前声明返回值的话,在defer中修改返回值是无效的操作。原因如下: package main func test1() int { i := 1 defer func() { // 实际则是将局部变量i的地址指针传入,调用runtime.d
阅读全文
摘要:在 Go 语言中,函数的参数传递是值传递的方式。当函数被调用时,函数参数的值会被拷贝到函数的参数变量中。 对于指针类型的参数,指针本身也是以值的方式进行传递。这意味着函数内部的指针参数将获得原始指针的拷贝,但这个拷贝仍然指向相同的内存地址。 当在函数内部修改通过指针传递的变量时,由于指针本身是值传递
阅读全文
摘要:准备工作 创建新项目 kratos new helloworld cd helloworld # 拉取项目依赖 go mod download # 项目中的 config 等请自行修改 添加事务 如果您还不了解 Kratos、 mysql 事务 和 GORM 的话请先了解一下。 data 层承载事务
阅读全文
摘要:背景 在看源码时,一些源码方法没有方法体,难道说明这些方法为空?例如:time.Now调用的 now(), time.Sleep , reflect.makechan // Provided by package runtime. func now() (sec int64, nsec int32,
阅读全文
摘要:背景是查询一个有N亿条记录的mysql表 使用go多协程同时查询一个区间的不同数据代码: func txHashesWorker(id int, tasks <-chan Task, results chan<- int, wg *sync.WaitGroup) { defer wg.Done()
阅读全文