> 백엔드 개발 > Golang > `reflect.MakeSlice`로 생성된 슬라이스를 주소 지정할 수 없는 이유는 무엇입니까?

`reflect.MakeSlice`로 생성된 슬라이스를 주소 지정할 수 없는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2024-11-12 08:13:02
원래의
549명이 탐색했습니다.

Why is a Slice Created with `reflect.MakeSlice` Not Addressable?

Reflect.MakeSlice가 주소 지정이 불가능한 값을 반환하는 이유는 무엇입니까?

Go에서 주소 지정 가능성은 변수의 메모리 주소를 얻고 유효성을 보장하는 기능을 의미합니다. . 로컬 스택 변수는 주소 지정이 불가능하며 이 개념은 Reflect.MakeSlice를 사용하여 생성된 값에 적용됩니다.

reflect.MakeSlice를 사용하는 경우 새 슬라이스 값을 생성합니다. 그러나 이 값은 알려진 주소를 가진 메모리 위치에 저장되지 않습니다. 대신 스택에 일시적으로 존재합니다. 이 스택 할당 값은 스택 프레임이 파괴되면 주소가 유효하지 않게 되므로 슬라이스에 대한 포인터를 생성하는 데 사용할 수 없습니다.

주소 지정 가능한 슬라이스 값 얻기

이 문제를 해결하려면 주소 지정 가능한 슬라이스 값을 얻으려면 Reflect.New()를 사용할 수 있습니다. 이 함수는 슬라이스에 대한 포인터를 생성합니다.

myType := reflect.TypeOf(my)
slice := reflect.MakeSlice(reflect.SliceOf(myType), 10, 10)
x := reflect.New(slice.Type()).Elem()
x.Set(slice)
로그인 후 복사

x.Elem() 호출은 포인터를 역참조하고 실제 슬라이스 값을 반환합니다. 이 값은 이제 All() 메서드에 전달하는 데 사용할 수 있습니다.

Go의 주소 지정 가능성 이해

Go 언어 사양에 따르면 값은 다음과 같은 경우 주소 지정이 가능합니다.

  • 슬라이스의 요소
  • 주소 지정 가능한 배열의 요소
  • 주소 지정 가능한 구조체의 필드
  • 포인터 역참조 결과

reflect.MakeSlice의 경우 새로 생성된 슬라이스는 스택에 존재하고 영구 메모리 위치에 저장되지 않기 때문에 이러한 기준을 충족하지 않습니다.

위 내용은 `reflect.MakeSlice`로 생성된 슬라이스를 주소 지정할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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