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
応答をファイルに正しく書き込みます。
パッケージリファレンスはすでに確認しましたが、あまり役に立ちませんでした。
ベストアンサー1
bs := string(body)
文字列を取得するには十分なはずです。
そこから、通常の文字列として使用できます。
このスレッドと少し似ています
( Go 1.16 -- Q1 2021 --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)
}
GoByExampleも参照してください。
以下にコメントされているように(およびzznの回答)、これは変換です(仕様を参照)。zzzzが
言及している「はどれくらい高価ですか[]byte(string)
?」(逆の問題ですが、同じ結論が適用されます)を参照してください。
一部の変換はキャストと同じで、 のように
uint(myIntvar)
ビットをその場で再解釈するだけです。
ソニアはこう付け加えた。
バイト スライスから文字列を作成するには、必ずヒープ上に文字列を割り当てる必要があります。不変性により、この処理が強制されます。
場合によっては、[]byte で可能な限り多くの作業を行い、最後に文字列を作成することで最適化できます。このbytes.Buffer
型は多くの場合便利です。