> 백엔드 개발 > Golang > Go에서 io.Reader를 문자열로 효율적으로 변환하려면 어떻게 해야 합니까?

Go에서 io.Reader를 문자열로 효율적으로 변환하려면 어떻게 해야 합니까?

Linda Hamilton
풀어 주다: 2024-12-29 13:46:12
원래의
212명이 탐색했습니다.

How Can I Efficiently Convert an io.Reader to a String in Go?

io.Reader를 문자열로 효율적으로 변환

문제:

io.ReadCloser를 고려하세요. http.Response에서 얻은 객체입니다. 전체 스트림을 문자열로 효율적으로 변환하려면 어떻게 해야 합니까?

해결책:

Strings.Builder 사용(Go 1.10 이상):

이것은 Go 1.10에서 선호되고 가장 효율적인 방법이며 위:

import "strings"

func ioReaderToString(r io.ReadCloser) (string, error) {
    buf := new(strings.Builder)
    if _, err := io.Copy(buf, r); err != nil {
        return "", err
    }

    return buf.String(), nil
}
로그인 후 복사

레거시 방법(Go <= 1.9의 경우):

[참고: 이 솔루션은 오래되었으며 권장되지 않습니다. Strings.Builder.]

  1. 스트림을 읽어서 bytes.Buffer:
import "bytes"

buf := new(bytes.Buffer)
if _, err := buf.ReadFrom(r); err != nil {
    return "", err
}
로그인 후 복사
로그인 후 복사
  1. 버퍼를 문자열로 변환합니다(여기에서 비효율적인 복사 작업이 발생합니다):
s := buf.String()
로그인 후 복사

안전하지 않은 방법(고급 및 위험):

[매우 주의해서 사용하세요]

  1. 스트림을 바이트로 읽습니다.버퍼:
import "bytes"

buf := new(bytes.Buffer)
if _, err := buf.ReadFrom(r); err != nil {
    return "", err
}
로그인 후 복사
로그인 후 복사
  1. 버퍼를 바이트로 변환 Slice:
b := buf.Bytes()
로그인 후 복사
  1. 안전하지 않음 바이트 슬라이스를 문자열로 변환:
import "unsafe"

s := *(*string)(unsafe.Pointer(&b))
로그인 후 복사

안전하지 않음에 대한 주의 사항 방법:

  • 모든 컴파일러 또는 아키텍처에서 작동하지 않을 수 있습니다.
  • 결과 문자열은 변경 가능하므로 잠재적으로 예상치 못한 동작이 발생할 수 있습니다.

권장 사항:

Strings.Builder 메서드는 효율적이고 안전하며 안전하지 않은 메서드의 함정을 피합니다.

위 내용은 Go에서 io.Reader를 문자열로 효율적으로 변환하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿