Go에서 빈 조각을 반환해야 합니까, 아니면 Nil 조각을 반환해야 합니까?



게시물Should You Return Empty or Nil Slices in Go?Qvault에 처음 등장했습니다.

Go에서는 종종 0 값을 반환합니다. Idiomatic Go는 가드 절의 사용을 권장하며 guard clauses 일찍 반환해야 합니다. 오류와 함께 초기에 반환할 때 관례에 따라 다른 모든 반환 값은 0 값이어야 합니다. 맵 및 슬라이스와 같은 데이터 유형에서 혼란이 발생합니다. nil이어야 합니까 아니면 비어 있어야 합니까?

문제는 다음 구문을 사용해야 하는가입니다.

func getItems(url string) ([]string, error) {
    data, err := makeRequest(url)
    if err != nil {
        return nil, err
    }
    items, err := unpack(data)
    if err != nil {
        return nil, err
    }
    return data, nil
}


또는 이 구문?

func getItems(url string) ([]string, error) {
    data, err := makeRequest(url)
    if err != nil {
        return []string{}, err
    }
    items, err := unpack(data)
    if err != nil {
        return []string{}, err
    }
    return data, nil
}


차이점들



nil과 빈 슬라이스 사이의 몇 가지 차이점을 보여주기 위해 간단한 코드를 실행했습니다.

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    var nilSlice []string
    fmt.Println(nilSlice) // Output: []
    fmt.Println(len(nilSlice), cap(nilSlice)) // Output: 0 0
    fmt.Println(nilSlice == nil) // Output: true
    dat, _ := json.Marshal(nilSlice)
    fmt.Println(string(dat)) // Output: null

    emptySlice := []string{}
    fmt.Println(emptySlice) // Output: []
    fmt.Println(len(emptySlice), cap(emptySlice)) // Output: 0 0
    fmt.Println(emptySlice == nil) // Output: false
    dat, _ = json.Marshal(emptySlice)
    fmt.Println(string(dat)) // Output: []
}



보시다시피 nil과 빈 슬라이스 사이에는 몇 가지 유사점이 있습니다.
  • 둘 다 길이와 캡이 0임
  • 모두 인쇄[]
  • 둘 다 범위 루프 및 추가 기능(여기에 표시되지 않음)에서 같은 방식으로 사용할 수 있습니다
  • .

    다음과 같은 점에서 다릅니다.
  • nil 슬라이스만 nil 검사에 성공함
  • 표준 라이브러리를 사용하여 JSON으로 인코딩하면 nil 슬라이스는 null가 되고 빈 슬라이스는 []가 됩니다.

  • 무엇을 해야 합니까?



    일반적으로 말하자면, nil을 선호합니다.

    Go wiki 에 따르면 nil이 선호되는 스타일입니다. 빈 슬라이스nil를 반환하기만 하면 거의 모든 경우에 잘 작동합니다. 또한 nil 또는 []string{}보다 make([]string, 0)를 입력하는 것이 더 쉽고 일반적으로 구문이 강조 표시되어 읽기 쉽습니다.

    읽어 주셔서 감사합니다!



    질문이나 의견이 있으면 Twitter에서 팔로우하세요.

    좀 가져가 coding courses on our new platform

    Subscribe 더 많은 프로그래밍 기사를 보려면 뉴스레터로

    좋은 웹페이지 즐겨찾기