あなたが空またはnilスライスを行く必要がありますか?



ポストShould You Return Empty or Nil Slices in Go?は、Qvaultに最初に現れました.
囲碁では、しばしばゼロ値を返します.慣用的な試みはガード条項の使用を奨励します、そして、guard clausesは早く戻る必要を必要とします.エラーが発生した場合には初期値を返します.混乱は地図やスライスのようなデータ型で起こります.
問題は、この構文を使うべきです.
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と空のスライスの間にはいくつかの類似点があります.
  • の両方は、ゼロ・レングスとキャップ
  • を持ちます
  • 両印刷[]
  • の両方は、範囲ループおよびapend機能(ここでは示されない)
  • において、同様に使うことができる
    次のように異なる.
  • だけがNILチェックを成功させます
  • 標準ライブラリを使用してJSONとしてエンコードされた場合、NILスライスはnullになり、空のスライスは[]になります
  • どうすればいいですか。


    一般的に言えば、NILを好む.
    Go wikiによれば、NILは好ましいスタイルです.我々がちょうど空のスライスnilを返す必要があるとき、実質的にすべてのケースで大きく働きます.nilまたは[]string{}よりもmake([]string, 0)を入力しやすくなり、一般的に構文を強調して読みやすくなります.

    読書ありがとう!


    あなたがどんな質問またはコメントをするならば、さえずりの上で我々について来てください
    いくつかのcoding courses on our new platform
    より多くのプログラミング記事のための我々の会報へのSubscribe