Go에서 Type Asserted Slice의 요소를 수정할 수 있나요?

Mary-Kate Olsen
풀어 주다: 2024-11-21 00:07:18
원래의
385명이 탐색했습니다.

Can I Modify Elements in Type Asserted Slices in Go?

유형 어설션 슬라이스의 요소 수정

Go에서 슬라이스를 처리할 때 유형 어설션의 한계를 이해하는 것이 중요합니다. 유형 어설션을 사용하면 기본 슬라이스에 특정 유형으로 액세스할 수 있지만 해당 요소를 직접 수정할 수 있는 기능은 부여되지 않습니다.

값과 같은 표현식을 다시 할당하여 요소를 수정하려고 하는 경우.([] 인터페이스{}) = 추가(값.([]인터페이스{})[:i], value.([]인터페이스{})[i 1:]...), 오류가 발생합니다. 이는 유형 주장이 실제 슬라이스에 대한 참조를 제공하지 않고 오히려 복사본을 제공하기 때문입니다. 이 복사본에 대한 모든 변경 사항은 원본 슬라이스에 반영되지 않습니다.

제한 극복

이 제한을 피하려면 슬라이스 포인터 대신 슬라이스 포인터를 저장하는 것이 좋습니다. 인터페이스 내에서 직접 슬라이스합니다. 포인터를 사용하면 인터페이스의 불변성을 위반하지 않고 슬라이스에 액세스하고 수정할 수 있습니다.

예를 들어 다음 예에서는 유형 어설션과 포인터를 사용하여 요소를 성공적으로 제거하는 방법을 보여줍니다.

s := []interface{}{0, "one", "two", 3, 4}

var value interface{} = &s

// Now do the removal:
sp := value.(*[]interface{})

i := 2
*sp = append((*sp)[:i], (*sp)[i+1:]...)

fmt.Println(value)
로그인 후 복사

이 예에서는 *[]인터페이스{} 유형을 사용하여 값 인터페이스의 슬라이스에 대한 포인터를 저장합니다. *sp를 통해 슬라이스에 액세스할 때 이제 원본 슬라이스로 직접 작업하므로 필요에 따라 해당 요소를 수정할 수 있습니다.

유형 어설션 및 포인터의 복잡성을 이해하면 슬라이스를 효과적으로 조작할 수 있습니다. 인터페이스에 래핑되어 Go 코드가 효율적이고 오류 없이 유지되도록 보장합니다.

위 내용은 Go에서 Type Asserted Slice의 요소를 수정할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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