Melhores práticas
Siga estas melhores práticas ao usar o Atlas Go SDK.
Usando getters em vez de acesso direto ao campo
Ao acessar respostas, use a função de getter em vez do acesso direto ao campo.
Por exemplo, use response.GetField()
em vez de response.Field
.
O uso de funções de getter permite o manuseio contínuo do ponteiro e pode ajudar a evitar erros de Pingback. Além disso, o SDK do Atlas Go fornece métodos Set
, IsSet
e Unset
para modificações de campo seguras.
Verificar se há strings vazias para ponteiros de string
Quando um modelo contém um ponteiro para um string
, o Atlas Go SDK envia esse valor para o servidor, mesmo que esteja definido para uma string vazia ( ""
).
Em vez de atribuição direta:
// Surrounding code omitted for brevity test := "" requestBody.StringPointerValue = test
Os usuários devem sempre verificar se há strings vazias antes de atribuí-las:
// Surrounding code omitted for brevity if test != "" requestBody.StringPointerValue = test
Trabalhando com campos de data
No Atlas Go SDK, o tipo *time.Time
representa campos de data para lidar com dados relacionados ao tempo. Quando você compara valores com base em time.Time
, nunca compare ponteiros diretamente ou faça o seguinte:
Evite usar operadores de comparação direta (por exemplo,
myStruct.MyDateField == ""
) para verificar a igualdade. A comparação direta dos ponteiros verificará se eles se referem ao mesmo endereço de memória, em vez de comparar os valores de data reais. Como cada instânciatime.Time
é alocada em diferentes locais de memória, comparações diretas podem produzir resultados inesperados.Use a função
Has
para verificar ponteiros não nulos: O SDK fornece uma funçãoHasFieldName
ouGetFieldName
dedicada para cada modelo para verificar se um ponteirotime.Time
não é nulo antes de acessar seu valor. Sempre use esta função para garantir que o ponteiro seja válido antes de executar quaisquer operações.Use métodos
time.Time
para comparar valores de datas: Depois de confirmar quetime.Time pointer
não é nulo, você pode usar com segurança os métodostime.Time
para comparar os valores de data reais. Os métodos comumente usados para comparação incluemBefore
,After
eEqual
:
// 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. }
Trabalhando com objetos
O Atlas Go SDK representa objetos de formato livre com o tipo Go ìnterface{}
em modelos e parâmetros. Objetos de forma livre incluem objetos de qualquer forma.
O tipo Go ìnterface{}
permite utilizar os seguintes tipos como argumentos de entrada:
Tipos básicos (inteiro, booleano)
Suas próprias estruturas
map[string]interface para objetos de forma livre
OBSERVAÇÃO: o Atlas Go SDK usa objetos de formato livre somente quando os modelos precisam lidar com vários valores conflitantes. Por exemplo, algumas das APIs do Atlas Search existentes permitem fornecer booleanos ou objetos.
Trabalhando com ponteiros
O Atlas Go SDK utiliza ponteiros do SDK para denotar valores opcionais na linguagem de programação Go:
// Surrounding code omitted for brevity type Data struct { // Represents an optional name Name *string `json:"results,omitempty"` }
No exemplo acima, o valor da string é opcional e não será enviado ao servidor se você não defini-lo explicitamente.
Trabalhando com arrays
O Atlas Go SDK representa todas as arrays como ponteiros:
// Surrounding code omitted for brevity type Data struct { Results *[]DataRole `json:"results,omitempty"` }
Os cenários a seguir usam ponteiros com arrays:
Atualizar uma solicitação contendo uma matriz vazia (redefinindo os valores do campo):
Se você definir explicitamente uma propriedade struct como uma array vazia, o SDK enviará uma solicitação de array vazia para a API do Atlas.
// Surrounding code omitted for brevity data := Data{ // Sending an empty array Results: &[]DataRole{} }
Atualizar uma solicitação sem atualizar o campo de array:
Ao executar uma operação de atualização, recomendamos que você não defina a propriedade struct.
// Surrounding code omitted for brevity data := Data{ // Sending an empty array by not setting field values (value is nil) // Results: &[]DataRole{} }
Essas práticas garantem o tratamento preciso de valores opcionais e atualizações de array no SDK quando você trabalha com ponteiros no Go.
Trabalhando com respostas binárias
No Atlas Go SDK, o tipo io.ReadCloser
é usado para retornar dados binários usando as API.
Use
io.Copy
para armazenar em um arquivo ou passar por outro stream.Use
io.ReadAll
para ler todos os bytes na memória.Chame a função
.Close()
após ler os dados
Observação: consulte exemplo em Examples/download/downloadLogs.go
Método de uso para criar modelos
Use métodos dedicados para criar novos modelos.
Por exemplo, em vez de usar o seguinte:
// Surrounding code omitted for brevity GroupInvitationUpdateRequest{ ... }
Use o seguinte método dedicado:
// Surrounding code omitted for brevity admin.NewGroupInvitationUpdateRequest(...)
Usar validadores golangci-lint
Usar golangci-lint para detectar erros comuns ao utilizar o Atlas Go SDK. O Atlas Go SDK não fornece seu próprio linter.
Problemas de linting
Não recomendamos usar a regra bodyclose
, pois ela relata muitos falsos positivos com o Atlas Go SDK e outras bibliotecas.
Para saber mais,consulte bodyclose.