特定の状況下、つまりプログラムがLinuxまたはMacOSで実行されている場合に文字列を返す関数があります。それ以外の場合は、コードでOS固有のチェックをさらに省略するために戻り値をnilにする必要があります。
func test() (response string) {
if runtime.GOOS != "linux" {
return nil
} else {
/* blablabla*/
}
}
ただし、このコードをコンパイルしようとすると、エラーが発生します。
test.go:10:3:戻り引数の型文字列としてnilを使用できません。
return ""
のような空の文字列のみを返す場合、この戻り値をnil
とコードでさらに比較することはできません。
だから、問題は正しいnil文字列値を返す方法ですか?
ありがとうございました。
""
を使用できない場合は、*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
値を使用できます。そうでなければ、それは役に立たないと考えます。
関連する質問もご覧ください:
string
へのポインターを取得して返すための代替手段: Goでリテラル* int64を実行するにはどうすればよいですか
この機能は慣用的な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
Goでは、複数の戻り値型を使用できます。したがって、これを利用して、エラーまたはその他のタイプを返します。詳細はこちらをご覧ください: http://golangtutorials.blogspot.com/2011/06/return-values-from-go-functions.html?m=1