모범 사례
Atlas Go SDK를 사용할 때는 다음 권장사항을 따르세요.
직접 필드 액세스 대신 게터 사용
응답에 액세스할 때 직접 필드 액세스 대신 게터 함수를 사용합니다.
예를 들어 대신 response.GetField()
response.Field
을(를) 사용하세요.
게터 함수를 사용하면 포인터를 원활하게 처리할 수 있고 패닉 오류를 방지할 수 있습니다. 또한 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
함수를 사용하여 nil이 아닌 포인터 확인: 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{} for free-form 객체
참고: 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{} }
이러한 방법을 사용하면 Go에서 포인터로 작업할 때 SDK에서 선택적 값 및 배열 업데이트를 정확하게 처리할 수 있습니다.
바이너리 응답으로 작업하기
Atlas Go SDK에서 io.ReadCloser
유형은 API를 사용하여 바이너리 데이터를 반환하는 데 사용됩니다.
io.Copy
를 사용하여 파일에 저장하거나 다른 stream을 통과합니다.메모리의 모든 바이트를 읽으려면
io.ReadAll
를 사용합니다.데이터를 읽은 후
.Close()
함수를 호출합니다.
참고: 예시 / 다운로드/downloadLogs.go를 참조하세요.
모델 생성을 위한 메서드 사용
새 모델을 만들 때는 전용 메서드를 사용합니다.
예를 들어 다음을 사용하는 대신 다음과 같습니다.
// Surrounding code omitted for brevity GroupInvitationUpdateRequest{ ... }
다음 전용 메서드를 사용합니다:
// Surrounding code omitted for brevity admin.NewGroupInvitationUpdateRequest(...)
golangci-lint 유효성 검사기 사용
golangci-lint 사용 Atlas 고 (Go) SDK를 사용할 때 일반적인 오류를 감지합니다. Atlas 고 (Go) SDK는 자체 린터를 제공하지 않습니다.
Linting 문제
bodyclose
규칙은 Atlas GO SDK 및 기타 라이브러리에서 많은 오탐을 보고하므로 사용하지 않는 것이 좋습니다.