云原生学习路线导航页(持续更新中)
本文是 知识点积累 系列文章的第一篇,记录golang语言相关的知识点
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"` }
2.json key的命名规范
- model结构体,我们一般都会指定它的json key,应该遵循哪些规范呢?
- 属性名应该是具有定义语义的有意义的名称。
- 属性名必须是 驼峰式(首字母小写,后面单词首字母大写) 的,ASCII码字符串。
- 首字符必须是字母,下划线( _ )或美元符号( $ )。
- 随后的其他字符可以是字母,数字,下划线( _ )或美元符号( $ )。
- 应该避免使用Javascript中的保留关键字(下文附有Javascript保留字清单)
- 参考:https://github.com/darcyliu/google-styleguide/blob/master/JSONStyleGuide.md
- Google Style Guides 项目是Google公司发布的一系列编程规范指南,覆盖了诸如C++、Java、Python、JavaScript等多种编程语言的最佳实践、命名约定、代码格式等方面的建议,旨在帮助开发人员编写一致、易读、易维护的代码,促进团队协作和代码质量的提高。
- google官方开源的github:https://github.com/google/styleguide ,官方文档:https://google.github.io/styleguide/
- 国内共建的中文版github(还不全):https://github.com/zh-google-styleguide/zh-google-styleguide
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:
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") } }
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 的恢复和日志记录支持
6.golang.org/x/…目录是什么,和golang标准库的区别?
- golang承诺除极少数情况,API是可以向前兼容(forward-compatible)的。这是非常大的承诺了,所以golang标准库的代码,要求非常高,不能随便加入
- x包下的代码,具有实验性质,对兼容性的要求没有那么高,一般会向前兼容两个版本,也由官方维护,并且一般不会引用第三方依赖(除 golang.org/x/tools/gopls, golang.org/x/vscode-go, and golang.org/x/pkgsite.之外)
- golang官方也给出了解释
- https://github.com/golang/go/wiki/X-Repositories
7.go的plugin是什么
-
Go语言自1.8版本开始引入了对插件(Plugin)的支持。
- 如果不在程序中明确指定,插件是不会被加载的。
- 通过插件,允许程序在运行时动态加载已经编译好的插件模块。因此,如果我们更新了已有的某个插件,想要不停机的情况下直接更新上去,就更换编译后的可执行文件就可以
- 在Go语言中,使用插件的主要步骤包括:
- 创建一个插件模块(被编译为 .so文件):编写一个独立的Go程序,使用plugin包提供的API进行构建。这个程序需要实现 导出函数,以便主程序可以调用这些函数。
- 主程序加载插件:主程序通过plugin包中的
plugin.Open("./plugin_doctor.so")
函数加载插件模块,并使用插件模块中导出的函数进行交互。
-
学习博客可参考:https://cloud.tencent.com/developer/article/1914954
8.go的包导入相关知识点
https://www.cnblogs.com/wongbingming/p/12950888.html
9.go结构体字段后面的 json:",inline"
什么意思
- json:“,inline” 用于 Go 语言中结构体字段的一个标记,用于表示将该字段的所有子字段展开到当前结构体中
- 使用场景:有时候希望将嵌套结构体的字段,直接展开到当前结构体中,而不是创建一个嵌套的对象。这时就可以使用 json:“,inline” 标记。
- 这样,在 JSON 序列化和反序列化时,被标记的字段及其子字段就会被展开到当前结构体中,并与其它字段平级地处理。
- 举例:
Person
结构体嵌套了Address
结构体,并使用了json:",inline"
标记type Address struct { City string `json:"city"` State string `json:"state"` } type Person struct { Name string `json:"name"` Age int `json:"age"` Address `json:",inline"` }
- 那么,在将一个 Person 对象序列化为 JSON 字符串时,结果如下所示。
{ "name": "John Doe", "age": 30, "city": "New York", "state": "NY" }
10.go结构体字段后面的 json:",omitempty"
什么意思
- omitempty 是 Go 语言中 JSON 标记的一个选项,用于指示在将结构体字段序列化为 JSON 字符串时,如果该字段的值为空(例如零值、空字符串、空数组、空切片、空映射等),则忽略该字段,不将其包含在生成的 JSON 中。
- 举例:
type Person struct { Name string `json:"name"` Age int `json:"age"` // Address 加了 omitempty Address string `json:"address,omitempty"` Phone string `json:"phone,omitempty"` } // 加入当前我创建了一个对象,Address为空 person := Person{ Name: "Alice", Age: 25, Address: "", Phone: "123-456-7890", } // 则序列化为json后,结果为: { "name": "Alice", "age": 25, "phone": "123-456-7890" }