PHP 편집기 Apple은 구조 슬라이싱에 대한 퍼즐을 공개하기 위해 왔습니다. 구조 슬라이싱과 구조 슬라이싱이 구현하는 인터페이스 슬라이싱의 차이점은 무엇입니까? Go 언어에서 슬라이스는 크기를 동적으로 변경할 수 있는 편리하고 유연한 데이터 구조입니다. 구조체 슬라이싱은 구조 유형의 요소를 저장하는 특수한 형태의 슬라이싱입니다. 하지만 동일한 인터페이스를 구현하는 슬라이스와 어떻게 다릅니까? 그 답을 함께 알아볼까요?
인터페이스Model
,它是由struct Person
를 구현했습니다.
모델 인스턴스를 얻으려면 다음과 같은 도우미 기능이 있습니다.
으아악위 방법을 사용하면 올바른 유형의 Person 인스턴스를 반환할 수 있습니다(나중에 동일한 방법을 사용하여 새 모델을 쉽게 추가할 수 있습니다).
모델 슬라이스를 반환하기 위해 이와 같은 작업을 수행하려고 하면 오류가 발생합니다. 코드:
으아악불평하러 가기: 无法使用 newPersons()(类型 []Person)作为返回参数中的类型 []Model
내 목표는 요청된 모델 유형이 무엇이든([]Person
、[]FutureModel
、[]Terminator2000
, w/e에 관계없이) 조각을 반환하는 것입니다. 내가 무엇을 놓치고 있으며 그러한 솔루션을 올바르게 구현하는 방법은 무엇입니까?
이것은 제가 방금 답변한 질문과 매우 유사합니다: https://www.php.cn/link/2c029952e202c0e560626a4c5980d64c
짧은 대답은 당신이 옳다는 것입니다. 구조의 조각은 구조에 의해 구현된 인터페이스의 조각과 동일하지 않습니다.
[]Person
和 []Model
具有不同的内存布局。这是因为它们所属的类型具有不同的内存布局。 Model
是一个接口值,这意味着在内存中它的大小为两个字。一个词代表类型信息,另一个词代表数据。 Person
是一个结构,其大小取决于它包含的字段。为了从 []Person
转换为 []Model
배열을 반복하고 각 요소를 유형 변환해야 합니다.
이 변환은 O(n) 연산이고 결과적으로 새로운 슬라이스가 생성되므로 Go는 이 연산을 암시적으로 수행하는 것을 거부합니다. 다음 코드를 사용하여 이 작업을 명시적으로 수행할 수 있습니다.
으아악dskinner가 지적했듯이 슬라이스에 대한 포인터가 아니라 슬라이스에 대한 포인터가 필요할 가능성이 높습니다. 슬라이스에 대한 포인터는 일반적으로 필요하지 않습니다.
으아악위 내용은 구조 슬라이싱! =구현하는 인터페이스 슬라이스?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!