2016-08-23 10 views
2

私はgolangにはかなり新しく、一般にコンパイルされた言語なので、私の無知を許してください。このようなコードでは、変数割り当てと参照渡しの違いは何ですか?

package main 

import "fmt" 

func assign() int { 
    return 1 
} 

func reference(foo *int) int { 
    *foo = 2 
    return 0 
} 

func main() { 
    var a, b int 

    a = assign() 
    reference(&b) 

    fmt.Println(a) 
    fmt.Println(b) 
} 

...参考に値渡しと値渡しの実際の違いは何ですか?

現実世界のコードでは、json.Unmarshal()はUnmarshalledの値を返すのではなく、空の変数にポインタを渡す必要があるのはなぜですか?

+0

「値渡し」となります。したがって、 'reference'関数は参照値になる整数へのポインタをとります。その関数で何かを返す必要はありません。 – squiguy

答えて

0

引数を渡すにはパラメータをコピーする必要がありますが、参照する場合はポインタをオブジェクトに送信するだけです。 Golangは、スライスを含め、デフォルトで値渡しを行います。

json.Unmarshalに関する特定の質問については、Unmarshalコードが、渡されたオブジェクトにjsonで見つかった互換性のある型と同じフィールド名が含まれているかどうかを検証できるようにする理由があると考えます。たとえば、jsonに繰り返しフィールドがある場合は、非マーシャルリング対象のオブジェクトに対応するスライスが必要です。

したがって、JSON文字列に非整列化したい構造体を渡す必要があります。 Unmarshalがフィールドに値を設定できるようにポインタである必要があります。ジェネリックインターフェイスを渡すだけで、Unmarshalはマップを返します。 Unmarshalが構造体/インタフェースへのポインタを取っていない場合は、マップを常に返すように実装されている可能性がありますが、これはもっと便利だと思います。

これは簡単な例ですが、便利な場合があります。https://play.golang.org/p/-n8euepSS0

+0

ああ、そうだ。私はjson.Unmarshal()に特定の型を渡すことについて考えず、戻り値を「フィルタリング」するためにそれを使用しました。今まで私が見てきたすべての例では、JSONのすべての属性を取得するためにすべてがインタフェース{}を使用しています。一方、メソッドがjsonを解析して返した場合、その選択肢はありません。 – Marc

+0

"Golangは、スライスを含め、デフォルトで値渡しします。" - それは当てはまりますが、スライス自体にデータへのポインタが含まれているため、少し複雑です。つまり、参照型として機能します。値によって渡された場合でも要素を変更することができます:https://play.golang.org/p/XmmeiCkRYy 追加によっては、容量によっては追加が機能しない場合もあります(追加によってポインターが新しいメモリーを指し示す可能性があるため場所):https://blog.golang.org/go-slices-usage-and-internals [https://blog.golang.org/slices#TOC_4.](https://blog.golang.org/slices) #TOC_4。) – user1431317

関連する問題