最佳实践
使用 Atlas Go SDK 时请遵循这些最佳实践。
使用 Getter 代替直接字段访问
访问响应时,请使用 getter 函数,而不是直接字段访问。
例如,使用 response.GetField()
代替response.Field
。
使用 getter 函数可以实现无缝指针处理,并有助于防止严重错误。 此外,Atlas Go SDK 还提供了用于安全字段修改的Set
、 IsSet
和Unset
方法。
检查字符串指针是否为空字符串
当模型包含指向string
的指针时,Atlas Go SDK 会将该值发送到服务器,即使它被设置为空字符串 ( ""
)。
而不是直接赋值:
// Surrounding code omitted for brevity test := "" requestBody.StringPointerValue = test
在分配字符串之前,用户应始终检查是否有空字符串:
// Surrounding code omitted for brevity if test != "" requestBody.StringPointerValue = test
使用日期字段
在 Atlas Go SDK 中, *time.Time
类型表示用于处理时间相关数据的日期字段。 当您基于time.Time
比较值时,要么永远不要直接比较指针,要么执行以下操作:
避免使用直接比较操作符(例如
myStruct.MyDateField == ""
)来检查是否相等。 直接比较指针将检查它们是否引用相同的内存地址,而不是比较实际的日期值。 由于每个time.Time
实例都分配在不同的内存位置,因此直接比较可能会产生意外结果。使用
Has
函数检查非零指针:SDK 为每个模型提供了专用的HasFieldName
或GetFieldName
函数,以便在访问time.Time
指针的值之前检查其是否为非零。 在执行任何操作之前,始终使用此函数确保指针有效。使用
time.Time
方法比较日期值:确认time.Time pointer
不为零后,可以安全地使用time.Time
方法比较实际日期值。 常用的比较方法包括Before
、After
和Equal
:
// Surrounding code omitted for brevity if !sdkModel.HasSomeDateField() { return; } datePtr1 := sdkModel.SomeDateField; if datePtr1.Before(*datePtr2) { // datePtr1 is before datePtr2. } else if datePtr1.After(*datePtr2) { // datePtr1 is after datePtr2. } else { // datePtr1 and datePtr2 are equal. }
使用对象
Atlas Go SDK 在模型和参数中表示具有Go ìnterface{}
类型的自由格式对象。 自由形式对象包括任何形状的对象。
Go语言(Golang) ìnterface{}
类型允许您使用以下类型作为输入参数:
基本类型(整数、布尔值)
您自己的结构
map[string]interface{} 用于自由格式对象
注意: Atlas Go SDK 仅在模型需要处理多个冲突值时才使用自由格式对象。 示例,某些现有的Atlas Search API 允许您提供布尔值或对象。
使用指针
Atlas Go SDK 利用 SDK 指针来表示 Go 编程语言中的可选值:
// Surrounding code omitted for brevity type Data struct { // Represents an optional name Name *string `json:"results,omitempty"` }
在上面的示例中,字符串值是可选的,如果您未显式设置它,则不会将其发送到服务器。
使用数组
Atlas Go SDK 将所有数组表示为指针:
// Surrounding code omitted for brevity type Data struct { Results *[]DataRole `json:"results,omitempty"` }
以下场景将指针与数组结合使用:
更新包含空数组的请求(重置字段值):
如果您将结构体属性显式设置为空数组,则 SDK 将向 Atlas API 发送空数组请求。
// Surrounding code omitted for brevity data := Data{ // Sending an empty array Results: &[]DataRole{} }
更新请求而不更新数组字段:
执行更新操作时,建议不要设置结构体属性。
// Surrounding code omitted for brevity data := Data{ // Sending an empty array by not setting field values (value is nil) // Results: &[]DataRole{} }
当您在 Golang 中使用指针时,这些实践可确保准确处理 SDK 中的可选值和数组更新。
使用二元响应
在 Atlas Go SDK 中, io.ReadCloser
类型用于使用 API 返回二进制数据。
使用
io.Copy
存储在文件上或通过另一个流传递。使用
io.ReadAll
读取内存中的所有字节。读取数据后调用
.Close()
函数
使用方法创建模型
使用专用方法创建新模型。
例如,不使用以下内容:
// Surrounding code omitted for brevity GroupInvitationUpdateRequest{ ... }
使用以下专用方法:
// Surrounding code omitted for brevity admin.NewGroupInvitationUpdateRequest(...)
使用 golangci-lint 验证器
使用 golangci-lint 检测使用Atlas Go SDK 时的常见错误。Atlas Go SDK 不提供自己的 linter。
Linting 问题
我们不建议使用bodyclose
规则,因为它会报告 Atlas GO SDK 和其他库的许多误报。
要学习;了解更多信息,请参阅 bodyclose。