知识点积累
本文主要记录日常学习中遇到的疑难知识点,常规知识点不会在这里进行记录。
1、golang语言相关
1.1.结构体的mapstructure是什么
mapstructure:"default"mapstructure是一个Go语言的库,用于将一个map中的值映射到一个结构体对象。- 在下面的例子中,如果在映射过程中,map中没有包含"name"或"age"键,那么
Person结构体中的Name和Age字段会被设置为其类型的零值(例如""和0)。而对于"gender"字段,如果map中没有"gender"键或者该键的值为空,那么Gender字段会被赋予"default"标签指定的默认值,即"unknown"。
type Person struct { Name string `mapstructure:"name"` Age int `mapstructure:"age"` Gender string `mapstructure:"gender" default:"unknown"` }
1.2.json key的命名规范
- model结构体,我们一般都会指定它的json key,应该遵循哪些规范呢?
- 属性名应该是具有定义语义的有意义的名称。
- 属性名必须是 驼峰式(首字母小写,后面单词首字母大写) 的,ASCII码字符串。
- 首字符必须是字母,下划线( _ )或美元符号( $ )。
- 随后的其他字符可以是字母,数字,下划线( _ )或美元符号( $ )。
- 应该避免使用Javascript中的保留关键字(下文附有Javascript保留字清单)
- 参考:github.com/darcyliu/go…
- Google Style Guides 项目是Google公司发布的一系列编程规范指南,覆盖了诸如C++、Java、Python、JavaScript等多种编程语言的最佳实践、命名约定、代码格式等方面的建议,旨在帮助开发人员编写一致、易读、易维护的代码,促进团队协作和代码质量的提高。
- google官方开源的github:github.com/google/styl… ,官方文档:google.github.io/styleguide/
- 国内共建的中文版github(还不全):github.com/zh-google-s…
1.3.不同版本的UUID
- 我们在go中,可以使用 github.com/satori/go.uuid 工具,使用uuid
- 其中,不同版本的uuid有什么区别?
- Version 1:
- 版本 1 UUID 基于时间戳和节点的 MAC 地址。它包括当前时间和节点的 MAC 地址,以确保全球唯一性。
- 实现原理:使用当前时间作为 UUID 的前 64 位,然后将节点的 MAC 地址的散列(通常是 MD5 散列)作为后 64 位。
- Version 2:
- 版本 2 UUID 是为 DCE 安全需求设计的,包括 POSIX UID/GID 和 POSIX 分布式计算环境(DCE)的组标识符。
- 实现原理:不常用,并且对于一般用途来说并不适用,因此我不建议使用。
- Version 3:
- 版本 3 UUID 基于命名空间和名称的散列值。它使用给定的命名空间和名称作为输入,生成相应的 UUID。
- 实现原理:使用给定的命名空间和名称计算散列值(通常是 MD5 散列),然后根据特定的规则将散列值转换为 UUID。
- Version 4:
- 版本 4 UUID 是随机生成的 UUID,使用随机性作为生成标识符的方法。它具有非常低的碰撞概率。
- 实现原理:通过使用随机数生成器生成128位的随机数,并根据 UUID 标准进行必要的设置,例如将版本字段设置为 4。
- Version 5:
- 版本 5 UUID 类似于版本 3 UUID,但使用 SHA-1 散列替代了 MD5。
- 实现原理:使用给定的命名空间和名称计算 SHA-1 散列值,然后将散列值转换为 UUID。
- Version 1:
1.4.go的sql.NullInt64是什么类型
- sql.NullInt64 是
database/sql包提供的一种类型,是一个结构体,包含两个字段Int64:表示整数值的字段,类型为int64。Valid:表示整数值是否有效的布尔字段,类型为bool。
- sql.NullInt64 可以在处理数据库查询结果时,同时获取到整数值以及该值是否为 NULL 的信息
- 使用示例
package main import ( "database/sql" "fmt" ) func main() { // 模拟从数据库中查询到的结果 result := sql.NullInt64{ Int64: 123, // 整数值 Valid: true, // 值有效 } // 检查整数值是否有效 if result.Valid { // 使用 Int64 字段获取整数值 fmt.Println("Value:", result.Int64) } else { fmt.Println("Value is NULL") } }
1.5.recover中间件是什么
-
在 Go 语言中,"recovery" 通常指的是在程序发生 panic(宕机)时进行恢复的机制。在处理 panic 的过程中,日志记录是非常重要的,因为它可以帮助我们了解程序在出现问题时的上下文信息,从而更好地排查和解决 bug。
-
在 Go 中,你可以使用内置的 defer 和 recover 来捕获 panic,并记录相应的日志信息。一般来说,我们会在程序的入口处或者一些关键的处理函数中设置一个 defer 函数,用来捕获 panic,并记录日志。
-
下面是一个简单的示例代码,演示了如何在发生 panic 时进行日志记录和恢复:
package main import ( "log" ) func main() { defer func() { if r := recover(); r != nil { log.Printf("Recovered from panic: %v", r) // 在这里可以记录日志或者做一些其他的处理 } }() // 模拟发生 panic panic("oops, something went wrong!") } -
此外,一些框架和库也提供了自带的 panic 恢复和日志记录机制,比如 go-zero 框架就提供了对 panic 的恢复和日志记录支持
1.6.golang.org/x/...目录是什么,和golang标准库的区别?
- golang承诺除极少数情况,API是可以向前兼容(forward-compatible)的。这是非常大的承诺了,所以golang标准库的代码,要求非常高,不能随便加入
- x包下的代码,具有实验性质,对兼容性的要求没有那么高,一般会向前兼容两个版本,也由官方维护,并且一般不会引用第三方依赖(除 golang.org/x/tools/gop…, golang.org/x/vscode-go, and golang.org/x/pkgsite.之外)
- golang官方也给出了解释
2、数据库相关(包括gorm框架)
2.1.数据库的DSN是什么
2.2.Gorm的自动迁移
2.2.1.db.WithContext(ctx).AutoMigrate(a)和db.AutoMigrate(a) 有什么区别
-
db.WithContext(ctx).AutoMigrate(a)和db.AutoMigrate(a)是在GORM库中用于数据库迁移的两种方式。db.AutoMigrate(a): 这种方式是最基本的数据库迁移方法。它会将模型a对应的表结构与数据库中的表进行比较,如果有差异则会自动执行相应的操作(创建表、添加列等)。这种方式不会传递上下文(context),因此在执行过程中无法控制超时、取消等操作。db.WithContext(ctx).AutoMigrate(a): 这种方式是使用了上下文(context)的数据库迁移方法。通过传递上下文对象ctx,可以实现对迁移操作的更精细控制。例如,可以设置超时时间、取消迁移操作等。这种方式适用于需要对数据库操作进行超时控制或取消的情况。
-
总之,
db.WithContext(ctx).AutoMigrate(a)相较于db.AutoMigrate(a)提供了更多的灵活性和控制性,可以根据具体需求选择使用。
3、gin框架相关
3.1.在gin中间件中直接return,相当于什么
- 在 Gin 中间件中直接使用
return语句,相当于提前结束当前中间件的执行,并将控制权返回给请求处理链的下一个中间件或处理函数。这意味着后续的中间件或处理函数将不会被执行。