목차
질문 내용
Solution
백엔드 개발 Golang 구조 슬라이싱! =구현하는 인터페이스 슬라이스?

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

Feb 09, 2024 pm 01:03 PM
언어로 가다 overflow

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

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

2009-2025년 탄생 이후 비트코인 ​​가격 BTC 역사적 가격에 대한 가장 완벽한 요약 2009-2025년 탄생 이후 비트코인 ​​가격 BTC 역사적 가격에 대한 가장 완벽한 요약 Jan 15, 2025 pm 08:11 PM

2009-2025년 탄생 이후 비트코인 ​​가격 BTC 역사적 가격에 대한 가장 완벽한 요약

Windows 11 오른쪽 하단에서 시간이 지나갔을 경우 대처법_Windows 11 오른쪽 하단에서 시간이 지났을 경우 대처 방법 Windows 11 오른쪽 하단에서 시간이 지나갔을 경우 대처법_Windows 11 오른쪽 하단에서 시간이 지났을 경우 대처 방법 May 06, 2024 pm 01:20 PM

Windows 11 오른쪽 하단에서 시간이 지나갔을 경우 대처법_Windows 11 오른쪽 하단에서 시간이 지났을 경우 대처 방법

Python에서 다른 사람의 코드를 사용하는 방법 Python에서 다른 사람의 코드를 사용하는 방법 May 05, 2024 pm 07:54 PM

Python에서 다른 사람의 코드를 사용하는 방법

Go 언어의 성능 테스트와 단위 테스트의 차이점 Go 언어의 성능 테스트와 단위 테스트의 차이점 May 08, 2024 pm 03:09 PM

Go 언어의 성능 테스트와 단위 테스트의 차이점

Golang 기술로 분산 시스템을 설계할 때 주의해야 할 함정은 무엇입니까? Golang 기술로 분산 시스템을 설계할 때 주의해야 할 함정은 무엇입니까? May 07, 2024 pm 12:39 PM

Golang 기술로 분산 시스템을 설계할 때 주의해야 할 함정은 무엇입니까?

기계 학습에 사용되는 Golang 기술 라이브러리 및 도구 기계 학습에 사용되는 Golang 기술 라이브러리 및 도구 May 08, 2024 pm 09:42 PM

기계 학습에 사용되는 Golang 기술 라이브러리 및 도구

Java 함수의 재귀 호출을 위한 디버깅 기술은 무엇입니까? Java 함수의 재귀 호출을 위한 디버깅 기술은 무엇입니까? May 05, 2024 am 10:48 AM

Java 함수의 재귀 호출을 위한 디버깅 기술은 무엇입니까?

모바일 IoT 개발에서 Golang 기술의 역할 모바일 IoT 개발에서 Golang 기술의 역할 May 09, 2024 pm 03:51 PM

모바일 IoT 개발에서 Golang 기술의 역할

See all articles