Go의 유형 별명은 기본 유형의 메소드를 상속합니까?

DDD
풀어 주다: 2024-11-23 01:30:29
원래의
604명이 탐색했습니다.

Do Type Aliases in Go Inherit Methods from Their Underlying Type?

유형 별칭 및 메서드 상속

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

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
}
로그인 후 복사

이 코드는 다양한 방법을 보여줍니다. 유형 별명 생성 및 메소드에 미치는 영향 상속.

유형 별칭과 유형 정의

Go에는 별칭과 정의라는 두 가지 유형의 유형 선언이 있습니다.

  • 유형 별칭: 구조를 수정하지 않고 기존 유형에 대한 새 이름을 만듭니다. 동작.
  • 유형 정의: 고유한 필드 및 메소드 세트를 사용하여 새 유형을 생성합니다.

유형 별칭을 사용한 메소드 상속

durWithMethods 유형 별칭은 기본 유형에서 메소드를 상속하는 새로운 유형을 생성합니다. dur를 입력하면 시간이 포함됩니다.Duration. 따라서 durWithMethods는 time.Duration에서 String() 메서드에 액세스할 수 있습니다.

fmt.Println(d.String()) // works
로그인 후 복사

반면, durWithoutMethods 유형 별칭은 단순히 time.Duration의 이름을 바꿉니다. time.Duration은 원시 유형이므로 메소드가 없습니다. 따라서 durWithoutMethods에는 String() 메서드가 없습니다.

fmt.Println(dWM.String()) // doesn't compile
로그인 후 복사

동일 기본 유형을 사용한 유형 별칭

단순히 기존 유형의 이름을 바꾸는 진정한 유형 별칭입니다. , 다음과 같습니다:

type sameAsDuration = time.Duration
로그인 후 복사

이 경우 sameAsDuration time.Duration과 동일한 메소드를 갖습니다. 동일한 유형을 나타내기 때문입니다.

var sad sameAsDuration
fmt.Println(sad.String()) // works
로그인 후 복사

따라서 유형 별칭과 유형 정의 간의 미묘한 차이와 메소드 상속에 미치는 영향으로 인해 혼란이 발생합니다. 유형 별칭은 기본 유형의 메소드를 유지하는 반면 유형 정의는 자체 메소드 세트를 사용하여 새로운 유형을 생성합니다.

위 내용은 Go의 유형 별명은 기본 유형의 메소드를 상속합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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