임베디드 메소드가 상위 필드에 액세스할 수 있나요?
Go에서 임베디드 메소드는 코드 재사용 및 구성을 위한 강력한 메커니즘입니다. 그러나 일반적인 질문이 생깁니다. 임베디드 메소드가 상위 구조체의 필드에 직접 액세스할 수 있습니까?
Background
컨텍스트에 따라 활성 레코드를 생성한다고 가정합니다. 가독성과 추상화를 위해 일반적인 CRUD 메소드가 사용자 구조체에 내장된 Go용 ORM 스타일입니다. 이렇게 하면 data.Save(user) 대신 user.Save()를 작성할 수 있습니다.
예
다음 코드 조각을 고려하세요.
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 메서드는 Bar에 포함되어 있으며 상위 Foo 구조체의 Name 필드에 액세스하려고 시도합니다.
답변
안타깝게도 Go는 이를 제공하지 않습니다. 상위 구조체의 필드에 액세스하기 위한 임베디드 메서드에 대한 직접적인 메커니즘. Test 메서드의 수신자는 Bar에 대한 포인터이며 Go가 그것이 포함되었는지 여부를 확인할 방법이 없습니다.
가능한 해결책
이 기능을 사용할 수 있는 한 가지 가능한 해결 방법은 인터페이스{} 멤버를 Bar 구조체에 추가하는 것입니다. 이를 구현하는 유형은 해당 멤버를 포함 유형으로 설정해야 합니다. 이 멤버의 초기화는 호출자의 책임이거나 ORM 메서드를 통해 처리될 수 있습니다. 그러나 이 접근 방식은 추가적인 복잡성과 잠재적인 유지 관리 문제를 야기합니다.
대체 관점
또는 API를 db.Save(user)로 구성하지 못할 가능성을 고려하십시오. 보기만큼 해로울 수 있습니다. 이 접근 방식은 여러 데이터베이스를 지원하고 전역 상태에 의존하지 않는 간단한 방법을 제공합니다.
위 내용은 Embedded Go 메소드가 상위 구조체 필드에 액세스할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!