> 백엔드 개발 > Golang > Go에 포함된 메서드가 상위 개체 필드에 액세스할 수 있나요?

Go에 포함된 메서드가 상위 개체 필드에 액세스할 수 있나요?

Barbara Streisand
풀어 주다: 2024-12-06 18:36:21
원래의
918명이 탐색했습니다.

Can Embedded Methods in Go Access Parent Object Fields?

임베디드 메소드에서 상위 필드 액세스

배경

간략화를 위해 임베디드 메소드를 사용하는 경우 객체지향 프로그래밍에서는 다음과 같은 질문이 생깁니다. 이 메소드가 상위 필드에 액세스할 수 있습니까? object?

목표

목표는 Active Record 패턴을 모방하는 Go용 ORM을 만드는 것입니다. 여기서 Save() 및 Delete()와 같은 메서드가 연결됩니다. 저장되거나 삭제되는 객체. 이 접근 방식은 코드 가독성을 단순화하고 기본 데이터 저장소에서 코드를 분리합니다.

아래 코드는 Foo에 포함된 메서드(Test())를 보여줍니다. 유형:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    test := Foo{Bar: &Bar{}, Name: "name"}
    test.Test()
}

type Foo struct {
    *Bar
    Name string
}

func (s *Foo) Method() {
    fmt.Println("Foo.Method()")
}

type Bar struct {
}

func (s *Bar) Test() {
    t := reflect.TypeOf(s)
    v := reflect.ValueOf(s)
    fmt.Printf("model: %+v %+v %+v\n", s, t, v)
    fmt.Println(s.Name)
    s.Method()
}
로그인 후 복사

질문

포함된 메소드(Test())가 상위(Foo) 객체의 Name 필드에 액세스할 수 있습니까?

답변

아니요, Go for에는 직접적인 방법이 없습니다. 상위 개체의 필드에 액세스하기 위한 내장된 메서드입니다. Test() 메소드의 수신자 유형은 *Bar이고 대상 객체는 Foo 유형입니다.

대체 접근 방식

상위 필드에 액세스하는 것이 필수인 경우 가능합니다. 솔루션에는 다음이 포함됩니다.

  • 삽입된 유형에 인터페이스{} 필드를 추가하고 이를 포함하는 유형으로 설정하는 것
  • user.Save() 대신 db.Save(user) 접근 방식을 채택하여 더 나은 확장성을 제공하고 전역 상태 문제의 위험을 줄입니다.

위 내용은 Go에 포함된 메서드가 상위 개체 필드에 액세스할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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