1. ホーム
  2. networking

[解決済み] Go で HTTP レスポンスに文字列としてアクセスする

2022-04-16 13:08:56

質問

Webリクエストのレスポンスを解析したいのですが、文字列としてアクセスするのに苦労しています。

func main() {
    resp, err := http.Get("http://google.hu/")
    if err != nil {
        // handle error
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)

    ioutil.WriteFile("dump", body, 0600)

    for i:= 0; i < len(body); i++ {
        fmt.Println( body[i] ) // This logs uint8 and prints numbers
    }

    fmt.Println( reflect.TypeOf(body) )
    fmt.Println("done")
}

レスポンスに文字列でアクセスするにはどうすればよいですか? ioutil.WriteFile は、レスポンスをファイルに正しく書き込みます。

パッケージのリファレンスも確認済みですが、あまり参考になりません。

どのように解決するのですか?

bs := string(body) という文字列があれば十分です。

そこから、通常の文字列として使用することができます。

として少し このスレッドでは

(更新後 Go 1.16 -- 2021年第1四半期--。 ioutil ディペロップ : ioutil.ReadAll() => io.ReadAll() ):

var client http.Client
resp, err := client.Get(url)
if err != nil {
    log.Fatal(err)
}
defer resp.Body.Close()

if resp.StatusCode == http.StatusOK {
    bodyBytes, err := io.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }
    bodyString := string(bodyBytes)
    log.Info(bodyString)
}

参照 サンプル .

以下のコメントにもあるように(そして zzn 's 答え ) の場合、これは 変換 (参照 スペック ).

"をご覧ください。 どの程度高いか []byte(string) ? という問題(逆の問題だが、結論は同じ)。 zzzz が挙げられています。

のように、キャストと同じような変換もあります。 uint(myIntvar) これは、ビットをそのまま再解釈するだけです。

ソニア が追加されます。

バイトスライスから文字列を作るには、間違いなくヒープに文字列を割り当てる必要があります。不変性という特性は、これを強制します。

byteでできる限りの作業を行い、最後に文字列を作成することで最適化できる場合があります。それは bytes.Buffer というタイプが便利なことが多い。