>  기사  >  백엔드 개발  >  Go에서 메모리 복사 없이 문자열에서 바이트 슬라이스를 검색하려면 어떻게 해야 합니까?

Go에서 메모리 복사 없이 문자열에서 바이트 슬라이스를 검색하려면 어떻게 해야 합니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-02 10:59:02757검색

How Can I Retrieve a Byte Slice from a String in Go Without Memory Copying?

안전하지 않은 방법을 사용하여 메모리 복사 없이 문자열에서 바이트 슬라이스 검색

문제:

문자열을 변환해야 합니다. 특히 대규모 데이터 세트를 처리할 때 메모리 복사의 성능 저하 없이 바이트 슬라이스로 복사합니다.

답변:

1단계: 메모리 복사 이해 문제

Go의 문자열은 불변입니다. 즉, 그 자리에서 수정할 수 없습니다. 따라서 []byte(string) 구문을 사용하여 문자열을 바이트 슬라이스로 변환하면 메모리 복사본이 생성됩니다.

2단계: 안전하지 않은 사용

메모리를 방지하려면 복사, 안전하지 않은 작업이 사용될 수 있습니다. 안전하지 않은 문자열 함수는 기본 문자열 데이터에 대한 포인터를 검색하는 데 사용할 수 있습니다.

<code class="go">import "unsafe"

func unsafeGetBytes(s string) []byte {
    return (*[0x7fff0000]byte)(unsafe.Pointer(
        (*reflect.StringHeader)(unsafe.Pointer(&s)).Data),
    )[:len(s):len(s)]
}</code>

설명:

  • unsafe.String 함수는 문자열 데이터에 대한 포인터.
  • 포인터는 큰 바이트 배열([0x7fff0000]바이트)로 캐스팅됩니다. Go에서는 지정되지 않은 크기의 배열에 대한 안전하지 않은 캐스팅을 허용합니다.
  • 그런 다음 배열은 문자열과 동일한 길이의 바이트 슬라이스를 만드는 데 사용됩니다.

추가 고려 사항:

  • 이 방법은 불변성이 문제가 되지 않는 내부 작업에만 사용해야 합니다.
  • 일반 문자열 처리의 경우 WriteString 또는 루프 최적화(문제 설명에 언급됨) 더 효율적입니다.
  • gzip을 사용하여 대규모 데이터 세트를 압축하면 메모리 복사 방지로 인한 성능 향상이 무색해질 가능성이 높습니다.

위 내용은 Go에서 메모리 복사 없이 문자열에서 바이트 슬라이스를 검색하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.