2017-09-18 6 views
0

golangは複数の戻り値をサポートしています。例:golangのマルチリターン値の理解方法

func test() (string, string) { 
    return "1", "1" 
} 

a, b := test() 

または

a, _ := test() 

ではなく:

b = test() //wrong 

しかし、いくつかの組み込み型は、そのような< []としてため

- 、サポートする複数のリターンが

key, exist := map[key] 

key := map[key] 

chから値を読み取ることができますこのようなannel

c <- myChan 

c, exist <- myChan 

なぜ動作の正常な機能を持つ組込み演算子が矛盾するのか、これを達成する方法は?

+2

あなたは基本的に質問しています:なぜGoは言語仕様を実装していますか? – Volker

+0

[Golangの[OK]のようなマップを通常の関数で返す](https://stackoverflow.com/questions/28487036/return-map-like-ok-in-golang-on-normal-functions/28487270#)の可能な複製28487270)。 – icza

答えて

8

明確golang specificationで指定されたこの現象:

  1. Receive operator

Aは特殊な形態

x, ok = <-ch 
x, ok := <-ch 
var x, ok = <-ch 
var x, ok T = <-ch 
の割り当てまたは初期化で使用される表現を受け取ります

は、通信が成功したかどうかを報告する追加の型なしブール結果を生成します。受信した値がチャネルに正常に送信された場合にtrue、チャネルが閉じられて空のために生成されたゼロ値の場合はfalseです。

  • Index expression
  • 型マップのマップのインデックス式は[K] V特殊形式の割当または初期化に使用

    v, ok = a[x] 
    v, ok := a[x] 
    var v, ok = a[x] 
    var v, ok T = a[x] 
    

    追加型なしブール値を生成します。キーxがマップに存在する場合、okの値はtrueで、そうでない場合はfalseです。

  • Assignments
  • タプル割り当ては、変数のリストに多値動作の個々の要素を割り当てます。 2つの形式があります。最初の例では、右側のオペランドは、関数呼び出し、チャネルまたはマップ操作、または型アサーションなどの単一の複数値式です。左側のオペランドの数は、値の数と一致しなければなりません。 fが2つの値を返す関数である場合、例えば、

    x, y = f() 
    

    は、xとyの第二の最初の値を割り当てます。 2番目の形式では、左側のオペランドの数は右側の式の数と等しくなければならず、それぞれの値は1つの値でなければならず、右側のn番目の式は左側のn番目のオペランドに割り当てられます。

    そこであなたは、この動作は、言語設計で指定されていると自分でReceive operatorと​​ために指定されたものを達成することはできません見ることができるように。

    1

    関数から返される複数の値を、いわゆる「カンマ・オーケー」イディオムと混同しています。

    関数の戻り値では、それらのすべてを処理するか、またはいずれも処理しないでください。シンプル。

    「Comma ok」はより微妙です。 2番目の値が指定されている場合、しばしばの動作がに変更されます。これらの文を考えてみます。

    v, ok := x.(int) 
    // vs 
    v := x.(int) 
    

    xは整数を保持するインタフェースである場合xは(0, falseを返す)最初の文が動作する別のタイプを保持し、2つ目がパニックになる場合は、すべてのは、しかし、十分です。

    "comma ok"形式のステートメントの各タイプは異なる特殊なケースであり、複数の代入(複数の関数の戻り値など)と同じではありません。あなたはそれらを比較することはできません、それぞれは独自のルールで、独自のものです。

    関連する問題