ベストプラクティス
Atlas Go SDK を使用する場合は、次のベストプラクティスに従ってください。
直接フィールドアクセスの代わりに getter を使用
応答にアクセスするときは、フィールドに直接アクセスするのではなく、getter 関数を使用します。
たとえば、 response.Field
の代わりに response.GetField()
を使用します。
getter 関数を使用するとシームレスなポインター処理が可能になり、エラーを防ぐことができます。 さらに、Atlas Go SDK は、安全なフィールド変更のためのSet
、 IsSet
、 Unset
メソッドを提供します。
string ポインターの空の文字列のチェック
モデルにstring
へのポインターが含まれている場合、空のAtlasGo string(""
)に設定されている場合でも、 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
インスタンスは異なるメモリに割り当てられているため、直接比較すると予期しない結果が生じる可能性があります。nil 以外のポインターをチェックするには、
Has
関数を使用します。SDK は各モデル専用のHasFieldName
またはGetFieldName
関数を提供しており、time.Time
ポインターが nil 以外であるかどうかをその値にアクセスする前に確認できます。 操作を実行する前には、必ずこの関数を使用して、ポインターが有効であることを確認してください。日付値を比較するには、
time.Time
メソッドを使用します。time.Time pointer
が nil 以外であることを確認したら、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 ì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"` }
上記の例では、string の値は任意であり、明示的に設定しないとサーバーに送信されません。
配列の操作
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{} }
以下のように、配列フィールドを更新せずにリクエストを更新します。
アップデート操作を実行するときは、 struct プロパティを設定しないことをお勧めします。
// Surrounding code omitted for brevity data := Data{ // Sending an empty array by not setting field values (value is nil) // Results: &[]DataRole{} }
これらのプラクティスにより、 Goでポインターを操作するときに、SDK で任意の値と配列の更新を正確に処理できるようになります。
バイナリ応答の操作
Atlas Go SDK では、API を使用してバイナリ データを返すのにio.ReadCloser
型が使用されます。
ファイルに保存したり、別のストリームを渡したりするには、
io.Copy
を使用します。メモリ内のすべてのバイトを読み取るには、
io.ReadAll
を使用します。データを読み込んだ後、
.Close()
関数を呼び出す
メソッドを使用してモデルを作成する
新しいモデルの作成には専用のメソッドを使用します。
たとえば、代わりに次のようなものを使用します。
// Surrounding code omitted for brevity GroupInvitationUpdateRequest{ ... }
次の専用メソッドを使用します。
// Surrounding code omitted for brevity admin.NewGroupInvitationUpdateRequest(...)
Use golangci-lint Validators
golangci-lint の 使用 Atlas Go SDK を使用するときに一般的なエラーを検出するには、 を使用します。Atlas Go SDK は独自のコネクターを提供しません。
リンティングの問題
Atlas Go SDK やその他のライブラリでは多数の誤検知が報告されるため、 bodyclose
ルールの使用は推奨されません。
詳細については、 bodyclose を参照してください。