2016-11-24 6 views
-2

以下のコードでは、httpレスポンスボディ 'b'を解析してparseGoQueryを解析していますが、これは初めてのことですが、main()で2回目にすると、応答 'b'がfunc parseGoQueryの内側に0と表示されます。私は、変数 'B' のコピーを渡すと思いますが、ポインタではありません、私は混乱しています...goではポインタの代わりに変数のコピーを解析するには?

resp, _ := client.Get(URL) 
    b :=resp.Body 

    defer b.Close() // close Body when the function returns 
     parseGoQuery("tag1", b) //b is not 0 as expected, good 
    parseGoQuery("tag2", b) //b is 0 !!!??? 

をアドバイスをしてください。ここparseGoQuery

Response.bodyはタイプio.Readcloserである
func parseGoQuery(tag string, b io.Reader) { 
    fmt.Println(tag,b) 
//skipped 
} 

答えて

3

funcをです。 したがって、身体から読んだら、それは閉じられ、それからさらに読もうとすると値はゼロになります。 ボディからの読み取りは一度しかできません。

したがって、bodyから読み込んだデータを変数に格納し、その変数をその関数に渡します。

+0

これは私がやっていることです。ボディからの応答を変数 'b'に格納し、 'b'をfuncに渡します。 – irom

+3

@iromいいえ、これは絶対にあなたが 'b:= resp.Body ':この行は、bが" resp.Body "と同じであると宣言しています。あなたは身体から読んでいないし、"深い "コピーを作っていません。resp.Bodyから複数回読むことはできません。あなたが何をしようとしていても、bから読んだりresp.Bodyから読むかは関係ありません。詳細はGoのツアーをご覧ください。 – Volker

関連する問題