web-dev-qa-db-ja.com

GoでNil文字列を返す方法は?

特定の状況下、つまりプログラムがLinuxまたはMacOSで実行されている場合に文字列を返す関数があります。それ以外の場合は、コードでOS固有のチェックをさらに省略するために戻り値をnilにする必要があります。

func test() (response string) {
    if runtime.GOOS != "linux" {  
        return nil
    } else {
        /* blablabla*/
    }
}

ただし、このコードをコンパイルしようとすると、エラーが発生します。

test.go:10:3​​:戻り引数の型文字列としてnilを使用できません。

return ""のような空の文字列のみを返す場合、この戻り値をnilとコードでさらに比較することはできません。

だから、問題は正しいnil文字列値を返す方法ですか?

ありがとうございました。

8
sotona

""を使用できない場合は、*string型のポインターを返します。または-これはGoであるため、(response string, ok bool)などの複数の戻り値を宣言できます。

*stringの使用:返す「有用な」文字列がない場合にnilポインターを返します。その際、ローカル変数に割り当てて、そのアドレスを返します。

func test() (response *string) {
    if runtime.GOOS != "linux" {
        return nil
    } else {
        ret := "useful"
        return &ret
    }
}

複数の戻り値を使用する:有用な文字列を返す場合は、ok = trueで返します。例:

return "useful", true

そうでなければ:

return "", false

これは次のようになります。

func test() (response string, ok bool) {
    if runtime.GOOS != "linux" {
        return "", false
    } else {
        return "useful", true
    }
}

呼び出し元で、最初にok戻り値を確認します。 trueの場合は、string値を使用できます。そうでなければ、それは役に立たないと考えます。

関連する質問もご覧ください:

Goでオプションの文字列を表す方法

stringへのポインターを取得して返すための代替手段: Goでリテラル* int64を実行するにはどうすればよいですか

17
icza

Goには複数の戻り値の組み込みサポートがあります

この機能は慣用的なGo、 でよく使用され、関数から結果とエラー値の両方を返します。

あなたの場合、次のようになります。

func test() (response string, err error) {
    if runtime.GOOS != "linux" {  
        return "", nil
    } else {
        /* blablabla*/
    }
}

その後:

response, err := test()
if err != nil { 
    // Error handling code
    return;
}

// Normal code 

エラーを無視する場合は、_を使用します。

response, _ := test()
// Normal code
3
Nicholas

Goでは、複数の戻り値型を使用できます。したがって、これを利用して、エラーまたはその他のタイプを返します。詳細はこちらをご覧ください: http://golangtutorials.blogspot.com/2011/06/return-values-from-go-functions.html?m=1

0
Mightee