구조 슬라이싱! =구현하는 인터페이스 슬라이스?

PHPz
풀어 주다: 2024-02-09 13:03:08
앞으로
396명이 탐색했습니다.

구조 슬라이싱! =구현하는 인터페이스 슬라이스?

PHP 편집기 Apple은 구조 슬라이싱에 대한 퍼즐을 공개하기 위해 왔습니다. 구조 슬라이싱과 구조 슬라이싱이 구현하는 인터페이스 슬라이싱의 차이점은 무엇입니까? Go 언어에서 슬라이스는 크기를 동적으로 변경할 수 있는 편리하고 유연한 데이터 구조입니다. 구조체 슬라이싱은 구조 유형의 요소를 저장하는 특수한 형태의 슬라이싱입니다. 하지만 동일한 인터페이스를 구현하는 슬라이스와 어떻게 다릅니까? 그 답을 함께 알아볼까요?

질문 내용

인터페이스Model,它是由struct Person를 구현했습니다.

모델 인스턴스를 얻으려면 다음과 같은 도우미 기능이 있습니다.

으아악

위 방법을 사용하면 올바른 유형의 Person 인스턴스를 반환할 수 있습니다(나중에 동일한 방법을 사용하여 새 모델을 쉽게 추가할 수 있습니다).

모델 슬라이스를 반환하기 위해 이와 같은 작업을 수행하려고 하면 오류가 발생합니다. 코드:

으아악

불평하러 가기: 无法使用 newPersons()(类型 []Person)作为返回参数中的类型 []Model

내 목표는 요청된 모델 유형이 무엇이든([]Person[]FutureModel[]Terminator2000, w/e에 관계없이) 조각을 반환하는 것입니다. 내가 무엇을 놓치고 있으며 그러한 솔루션을 올바르게 구현하는 방법은 무엇입니까?

Solution

이것은 제가 방금 답변한 질문과 매우 유사합니다: https://www.php.cn/link/2c029952e202c0e560626a4c5980d64c

짧은 대답은 당신이 옳다는 것입니다. 구조의 조각은 구조에 의해 구현된 인터페이스의 조각과 동일하지 않습니다.

[]Person[]Model 具有不同的内存布局。这是因为它们所属的类型具有不同的内存布局。 Model 是一个接口值,这意味着在内存中它的大小为两个字。一个词代表类型信息,另一个词代表数据。 Person 是一个结构,其大小取决于它包含的字段。为了从 []Person 转换为 []Model 배열을 반복하고 각 요소를 유형 변환해야 합니다.

이 변환은 O(n) 연산이고 결과적으로 새로운 슬라이스가 생성되므로 Go는 이 연산을 암시적으로 수행하는 것을 거부합니다. 다음 코드를 사용하여 이 작업을 명시적으로 수행할 수 있습니다.

으아악

dskinner가 지적했듯이 슬라이스에 대한 포인터가 아니라 슬라이스에 대한 포인터가 필요할 가능성이 높습니다. 슬라이스에 대한 포인터는 일반적으로 필요하지 않습니다.

으아악

위 내용은 구조 슬라이싱! =구현하는 인터페이스 슬라이스?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!