mgo를 사용하여 MongoDB 모델에 인터페이스 삽입
다양한 유형의 노드가 포함된 워크플로 시스템으로 작업할 때 Go 인터페이스를 사용하는 것이 일반적입니다. 다양한 노드 유형을 나타냅니다. 그러나 이 접근 방식은 mgo를 사용하여 이러한 워크플로를 MongoDB에 저장할 때 문제가 됩니다.
다음 예를 고려하세요.
<code class="go">type Workflow struct { CreatedAt time.Time StartedAt time.Time CreatedBy string Nodes []Node } type Node interface { Exec() (int, error) }</code>
여기서 Node는 단일 메소드인 Exec()를 사용하는 인터페이스입니다. 다양한 노드 유형으로 구현할 수 있습니다.
MongoDB에 워크플로를 저장하려면 다음 ID로 찾으려고 시도할 수 있습니다.
<code class="go">w = &Workflow{} collection.FindID(bson.ObjectIdHex(id)).One(w)</code>
그러나 mgo는 역마샬링을 수행할 수 없기 때문에 오류가 발생합니다. Go 구조체에 직접 내장된 노드 인터페이스. 이는 각 노드에 대해 적절한 구체적인 유형을 생성하는 데 필요한 유형 정보가 부족하기 때문입니다.
이 문제를 해결하려면 노드 유형과 실제 노드 값을 모두 명시적으로 보유하는 구조체를 정의할 수 있습니다.
<code class="go">type NodeWithType struct { Node Node `bson:"-"` Type string } type Workflow struct { CreatedAt time.Time StartedAt time.Time CreatedBy string Nodes []NodeWithType }</code>
bson:"-"을 사용하면 Node 하위 필드가 자동 디코딩에서 제외되고 대신 SetBSON 함수에서 수동으로 처리됩니다.
<code class="go">func (nt *NodeWithType) SetBSON(r bson.Raw) error { // Decode the node type from the "Type" field // Create a new instance of the concrete node type based on the decoded type // Unmarshal the remaining document into the concrete node type //... }</code>
이 접근 방식을 사용하면 mgo가 노드 유형을 식별할 수 있습니다. 각 노드를 생성하고 디코딩 중에 적절한 구체적인 인스턴스를 생성하여 유형 정보 문제를 해결합니다.
위 내용은 mgo를 사용하여 MongoDB 모델에 Go 인터페이스를 어떻게 포함할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!