>  기사  >  백엔드 개발  >  `cgo`를 사용하여 `const char *`의 C 배열에 안전하게 액세스하고 Go 문자열로 변환하려면 어떻게 해야 합니까?

`cgo`를 사용하여 `const char *`의 C 배열에 안전하게 액세스하고 Go 문자열로 변환하려면 어떻게 해야 합니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-20 22:59:13634검색

How Can I Safely Access and Convert a C Array of `const char *` to Go Strings Using `cgo`?

Cgo를 사용하여 Go에서 const char * 유형의 C 배열에 액세스

Go에서 const char * 유형의 C 배열로 작업할 때 인덱싱 및 항목을 Go 문자열로 변환합니다. 이 문제는 배열 요소 액세스와 관련된 하위 수준 포인터 연산에서 발생합니다.

이 문제를 극복하기 위한 더 안전하고 편리한 접근 방식은 C 배열을 Go 슬라이스로 변환하는 것입니다. 이 중간 단계는 정확성을 보장하면서 변환 프로세스를 단순화합니다.

C 어레이를 Go 슬라이스로 변환

arraySize := 3
cStrings := (*[1 << 30]*C.char)(unsafe.Pointer(&C.myStringArray))[:arraySize:arraySize]

이 작업으로 다음을 달성합니다.

  • arraySize 배열의 요소 수를 정의합니다.
  • *C.char는 C char 유형에 대한 포인터를 선언합니다.
  • unsafe.Pointer(&C.myStringArray)는 첫 번째 요소의 메모리 주소를 얻습니다. myStringArray 배열에서.
  • [:arraySize:arraySize]는 arraySize의 보폭으로 동일한 C 배열 요소를 가리키는 Go 슬라이스를 생성합니다.

슬라이스 반복 및 변환 항목

C 배열이 슬라이스로 변환되면 반복 작업이 간단해집니다. 예는 다음과 같습니다.

for _, cString := range cStrings {
    fmt.Println(C.GoString(cString))
}

이 루프는 C.GoString()을 사용하여 C 배열의 각 요소를 Go 문자열로 변환한 후 인쇄합니다.

샘플 출력

NAME_OF_FIRST_THING
NAME_OF_SECOND_THING
NAME_OF_THIRD_THING

이 접근 방식을 따르면 직접 포인터 산술의 복잡성을 피하면서 const char * 유형의 C 배열 요소를 효과적으로 인덱싱하고 Go 문자열로 변환할 수 있습니다.

위 내용은 `cgo`를 사용하여 `const char *`의 C 배열에 안전하게 액세스하고 Go 문자열로 변환하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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