2

次のコードを持つ関数の場合があります。

func halfMatch(text1, text2 string) []string {
    ...
    if (condition) {
         return nil // That's the final code path)
    }
    ...
}

[]string(nil)nilの代わりに戻っています。最初はnil、特定の戻り型を持つ関数で返すと、その型のゼロ値のインスタンスが返されるだけだと思いました。しかし、それから私は簡単なテストを試みました、そしてそれはそうではありません。

なぜnil空の文字列スライスを返すのか誰かが知っていますか?

4

4 に答える 4

16

Nilはタイプではありません。これは、マップ、チャン、ポインター、関数、スライス、およびインターフェースのゼロ値の説明です。

プログラムに「nil」を入れると、goはコンテキストに応じてタイプを与えます。ほとんどの場合、nilを明示的に入力する必要はありません。これも例外ではありません。返される型は[]stringであるため、コンパイラはそれが[] string(nil)でなければならないことを認識しています。

nil文字列スライスは、バッキング配列がなく、長さ/容量がゼロのスライスです。文字通りの「nil」と比較して、その長さと容量を取得できます。これは[]文字列で、空です。nilではない空の[]文字列が必要な場合は、[]string{}を返します。これにより、(長さがゼロの)バッキング配列が作成され、nilと同等ではなくなります。

于 2012-12-20T14:07:04.007 に答える
1

私は何が起こっているのか知っていると信じています。私が使用しているassertライブラリ(github.com/bmizerany/assert)は、内部でを使用していreflect.DeepEqualます。

の戻り値func halfMatch(text1, text2 string) []stringは常に型ですが、戻り値を[]string返し、演算子を介して値nilと比較すると、を返します。ただし、が使用されている場合、タイプは重要であり、両方の値が同じであるとは見なされません。nil==truereflect.DeepEqual

テストとのプレイグラウンドリンク

于 2012-12-20T11:02:22.680 に答える
0

印刷物の出力に戸惑っていると思います。(遊び場リンク

package main

import "fmt"

func f() []string {
    return nil // That's the final code path)
}
func main() {
    result := f()
    fmt.Printf("result = %v\n", result)
    fmt.Printf("result = %v\n", result == nil)
}

生成する

result = []
result = true

だから私は出力が本当にだと思いますnil

于 2012-12-20T10:20:05.343 に答える
0

条件がtrueの場合、Goは空のスライスを返します。

[]をnilと比較しようとすると、真になるため、「テスト」に問題があります。私はあなたのテストを修正して、私が何を意味するかを示します

package main
import "fmt"

func main() {
    //fmt.Println(test1("") == nil)  
    fmt.Println(test1("")) // prints [] 
}

func test1(text1 string) []string {
    if len(text1) > 0 {
        return []string{text1}
    }
    return nil
}
于 2012-12-20T16:09:03.230 に答える