> 백엔드 개발 > Golang > Go에서 문자열 조각을 사용자 정의 유형 조각으로 안전하게 변환하려면 어떻게 해야 합니까?

Go에서 문자열 조각을 사용자 정의 유형 조각으로 안전하게 변환하려면 어떻게 해야 합니까?

Barbara Streisand
풀어 주다: 2024-12-09 15:18:15
원래의
854명이 탐색했습니다.

How Can I Safely Convert a Slice of Strings to a Slice of Custom Types in Go?

유형 변환: 문자열을 사용자 정의 유형으로

Go에서는 문자열 조각을 사용자 정의 유형 조각으로 변환하는 것이 어려울 수 있습니다. 다음 예를 고려하십시오.

package main

import "fmt"

type Card string
type Hand []Card

func NewHand(cards []Card) Hand {
    hand := Hand(cards)
    return hand
}

func main() {
    value := []string{"a", "b", "c"}
    firstHand := NewHand(value)
    fmt.Println(firstHand)
}
로그인 후 복사

이 코드는 컴파일러 오류를 발생시킵니다.

cannot use value (type []string) as type []Card in argument to NewHand
로그인 후 복사

이 오류의 원인은 관련 없는 유형 간의 우발적인 변환을 방지하기 위한 사양 설계 결정에 있습니다. 우연히 같은 구조를 공유하는 것입니다. 그러나 특정 상황에서는 이러한 슬라이스 간에 변환이 필요할 수 있습니다.

안전하지 않은 변환

동일한 기본 유형을 가진 슬라이스 간에 변환하는 것이 기술적으로 불가능하지는 않습니다. , 안전한 접근 방식에는 슬라이스 복사가 포함됩니다. 그럼에도 불구하고 안전하지 않은 패키지를 사용하여 복사하지 않고 직접 변환을 수행할 수 있습니다.

value := []string{"a", "b", "c"}
// convert &value (type *[]string) to *[]Card via unsafe.Pointer, then deref
cards := *(*[]Card)(unsafe.Pointer(&value))
firstHand := NewHand(cards)
로그인 후 복사

주의

안전하지 않은 패키지를 사용하려면 극도의 주의가 필요합니다. 프로그램이 유형 시스템을 우회하고 임의 메모리에 액세스할 수 있도록 합니다. 변환이 중요한 경우 문자열과 카드 유형을 모두 캡슐화하는 새로운 유형을 정의하고 해당 구조 내에서 안전한 변환을 수행하는 등 다른 옵션을 고려하는 것이 좋습니다.

위 내용은 Go에서 문자열 조각을 사용자 정의 유형 조각으로 안전하게 변환하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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