Docs 菜单
Docs 主页
/
MongoDB Atlas
/ / /

最佳实践

使用 Atlas Go SDK 时请遵循这些最佳实践。

访问响应时,请使用 getter 函数,而不是直接字段访问。

例如,使用 response.GetField()代替response.Field

使用 getter 函数可以实现无缝指针处理,并有助于防止严重错误。 此外,Atlas Go SDK 还提供了用于安全字段修改的SetIsSetUnset方法。

当模型包含指向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 为每个模型提供了专用的HasFieldNameGetFieldName函数,以便在访问time.Time指针的值之前检查其是否为非零。 在执行任何操作之前,始终使用此函数确保指针有效。

  • 使用time.Time方法比较日期值:确认time.Time pointer不为零后,可以安全地使用time.Time方法比较实际日期值。 常用的比较方法包括BeforeAfterEqual

// 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()函数

注意:请参阅 examples/ 下载 /downloadLogs.go 中的示例

使用专用方法创建新模型。

例如,不使用以下内容:

// Surrounding code omitted for brevity
GroupInvitationUpdateRequest{
...
}

使用以下专用方法:

// Surrounding code omitted for brevity
admin.NewGroupInvitationUpdateRequest(...)

使用 golangci-lint 检测使用Atlas Go SDK 时的常见错误。Atlas Go SDK 不提供自己的 linter。

我们不建议使用bodyclose规则,因为它会报告 Atlas GO SDK 和其他库的许多误报。

要学习;了解更多信息,请参阅 bodyclose。

后退

迁移