>백엔드 개발 >Golang >Go의 유형 별칭이 내장 유형에서 상속될 때 왜 다르게 동작합니까?

Go의 유형 별칭이 내장 유형에서 상속될 때 왜 다르게 동작합니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-22 11:56:12584검색

Why Do Type Aliases in Go Behave Differently When They Inherit from Embedded Types?

유형 별칭 복잡성 탐구

다음 코드 조각을 고려하세요.

package main

import (
    "fmt"
    "time"
)

type dur struct {
    time.Duration
}

type durWithMethods dur

type durWithoutMethods time.Duration

func main() {
    var d durWithMethods // works ??
    fmt.Println(d.String())
    
    var dWM durWithoutMethods
    fmt.Println(dWM.String()) // doesn't compile
}

직접 time.Duration(durWithoutMethods)의 별칭은 어떤 것도 상속하지 않습니다. 메서드, 중첩된 유형 별칭(durWithMethods)은 해당 메서드에 대한 액세스 권한을 부여합니다. 이러한 혼란은 유형 정의와 유형 별칭 간의 근본적인 차이에서 비롯됩니다.

새 유형 정의와 기존 유형 이름 바꾸기

Go에서 유형 선언은 두 가지 범주로 나뉩니다. 유형 정의 및 유형 별칭. 유형 정의는 하나 이상의 기존 유형을 삽입하여 새로운 유형을 탄생시킵니다. 중첩 유형이 아닌 최상위 내장 유형에서만 메서드를 상속합니다.

반면에 유형 별칭은 새 식별자를 기존 유형에 바인딩하는 단순한 약어입니다. 새로운 유형을 생성하지 않으므로 기본 유형은 변경되지 않습니다. 기본 유형과 연관된 모든 메소드는 원래 이름이나 별칭을 통해 쉽게 액세스할 수 있습니다.

durWithMethods 이해

durWithMethods 유형은 dur 유형을 다음과 같이 효과적으로 확장합니다. 그것을 삽입. dur에는 time.Duration이 포함되어 있으므로 String()을 포함하여 Duration의 메서드를 상속합니다. 따라서 코드의 d.String()은 예상대로 작동합니다.

Unveiling durWithoutMethods

durWithMethods와 달리 durWithoutMethods는 time.Duration의 직접적인 별칭입니다. 아무것도 확장하지 않으므로 기본 time.Duration 유형으로만 구성됩니다. time.Duration 메소드는 별도의 메소드 세트가 있는 고유한 유형이기 때문에 durWithoutMethods로 전송되지 않습니다. 따라서 dWM.String()은 컴파일되지 않습니다.

위 내용은 Go의 유형 별칭이 내장 유형에서 상속될 때 왜 다르게 동작합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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