2016-07-28 10 views
1

こんにちは私はdocker.APIContainerとエラー(エラーがなければnil)を返したいが、エラーの場合はドッカーで何を返すべきか?APIContainer?GOのマルチリターン関数で変数を1つだけ返す方法は?

これはコード

func GetContainersRunningImage(imagename string, tag string) ([]docker.Container,string) { 
    logFields := log.Fields{ 

     "handler": "get service", 
    } 
    client, err := docker.NewTLSClient(sconf.DockConf.Endpoint, sconf.DockConf.Cert, sconf.DockConf.Key, sconf.DockConf.Ca) 
    if err != nil { 
     log.WithFields(logFields).Errorf("TLSClient could not be created: %s", err) 
     return _,err.Error() 
    } 
} 

私が何を追加する代わりに_なければならないのですか?私はvar contarray []docker.Containerを作成してそれを返すことを義務づけられていますか?または

+3

「nil」についてはどうですか? – Jakumi

+0

@Jakumi int型でnilを返そうとしましたが、すべての型で返すことができるかどうかを確認しようとしましたが、エラーが返されました。戻り値の型にint型としてnilを使用できません だから私は同じエラー文字列以外のタイプの場合 –

+0

テストのための@Jakumi私は遊び場で構造を作成し、値を返さないようにしました。エラーが発生しました。https://play.golang.org/p/RytEExB6bv –

答えて

0
return nil, err.Error() 

goreturnsが自動的にこれを行います別の方法がある - 文字列のint型と""ため0など

+0

ちょうどテストのために私は遊び場で構造体を作成してゼロ値を返そうとしました。エラーが発生しましたhttps://play.golang.org/p/RytEExB6bv –

+1

あなたは正しく ' nil値。 Goの型は異なる 'nil'値を持っています - int型は' 0'、文字列型は '' ''、ポインタ型は 'nil' ...今ではあなたのコードには2つのオプションがあります:https://play.golang .org/p/tz_is19Lvnまたはhttps://play.golang.org/p/70ilkDhcQc。最初のものは 'nil'構造体を返すことを期待していますが、これはGoでは不可能なので、データ' Fs {} 'のない構造体を返す必要があります。一方、構造体へのポインタは 'nil'にすることができます。 – huygn

1

GetContainersRunningImageは、複数の値を返す:あなたは返却しなければならないことを意味[]docker.Containerstringを、正確に同じ型のシグネチャを持つ2つの値、または具体的な値を返さない場合はnilです。

エラー・ケースを処理しているので、それはエラーの場合はnil値を返すために大丈夫だ:

if err != nil { 
     log.WithFields(logFields).Errorf("TLSClient could not be created: %s", err) 
     return nil, err.Error() 
} 

をしかし、そうでない場合には、あなたは、関数の最後に値を返す必要がエラーを受け取ります。この場合、戻り関数の型シグネチャは、[]docker.Container,stringのタイプである必要があります。

Goでは、関数の戻り値の慣用方法は値であり、エラーが発生した場合はエラーとなります。値の代わりにnilerrorの2つの値を返すifステートメントでエラーを個別に処理しているため、最終的な戻り値は型の値で、エラーの場合はnilである必要があります。

func GetContainersRunningImage(imagename string, tag string) ([]docker.Container,string) { 
    var contarray []docker.Container 

    logFields := log.Fields{ 

     "handler": "get service", 
    } 
    client, err := docker.NewTLSClient(sconf.DockConf.Endpoint, sconf.DockConf.Cert, sconf.DockConf.Key, sconf.DockConf.Ca) 
    if err != nil { 
     log.WithFields(logFields).Errorf("TLSClient could not be created: %s", err) 
     return nil, err.Error() 
    } 

    return contarray, nil 
} 

他の可能性は、戻り値のいずれかを無視する_(下線)変数を使用することであるが、これは変数の割り当てで発生する必要があります。

+0

テスト用です。私は遊び場で構造を作成し、ゼロ値を返そうとしました。エラーが発生しました。https://play.golang.org/p/RytEExB6bv –

関連する問題