Пн go FindOne и интерфейс {} - PullRequest
       0

Пн go FindOne и интерфейс {}

0 голосов
/ 30 марта 2020

редактировать: решено, см. Первый ответ. Должен был действительно заметить, что, когда я создавал этот пример ..

Я пытаюсь создать функцию, которая принимает интерфейс вместо указанного типа c и вызывает функцию FindOne. Кто-нибудь знает, почему функция printFirstTrainerByInterface не работает должным образом?

Я использую официальный Go Mon go -драйвер и примеры фрагментов из mongodb- go -driver-tutorial .

package main

import (
    "context"
    "fmt"
    "log"

    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

type Trainer struct {
    Name string
    Age  int
    City string
}

var db *mongo.Database

func main() {
    opts := options.Client().ApplyURI("mongodb://localhost:27017")
    client, err := mongo.Connect(context.TODO(), opts)
    if err != nil {
        log.Fatal(err)
    }
    err = client.Ping(context.TODO(), nil)
    if err != nil {
        log.Fatal(err)
    }
    db = client.Database("test")
    insertTestDocument()

    var result Trainer
    printFirstTrainer(result)

    var result2 Trainer
    printFirstTrainerByInterface(&result2)
}

func insertTestDocument() {
    ash := Trainer{"Ash", 10, "Pallet Town"}
    res, err := db.Collection("trainers").InsertOne(context.TODO(), ash)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Inserted a test document: ", res.InsertedID)
}

func printFirstTrainer(result Trainer) {
    collection := db.Collection("trainers")
    err := collection.FindOne(context.TODO(), bson.M{}).Decode(&result)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Found a single document: %+v\n", result)
}

func printFirstTrainerByInterface(result interface{}) {
    collection := db.Collection("trainers")
    err := collection.FindOne(context.TODO(), bson.M{}).Decode(&result)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Found a single document: %+v\n", result)
}

Вывод:

Inserted a test document:  ObjectID("5e8216f74f41a13f01061d61")
Found a single document: {Name:Ash Age:10 City:Pallet Town}
Found a single document: [{Key:_id Value:ObjectID("5e8216f74f41a13f01061d61")} {Key:name Value:Ash} {Key:age Value:10} {Key:city Value:Pallet Town}]

1 Ответ

2 голосов
/ 30 марта 2020

Вы передаете адрес структуры, в которую хотите декодировать интерфейс. Вы должны передать это как аргумент для декодирования, а не адрес интерфейса. Попробуйте:

err := collection.FindOne(context.TODO(), bson.M{}).Decode(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...