поле среза в структуре перезаписывается последним значением - PullRequest
0 голосов
/ 04 августа 2020

У меня есть функция, которая в основном собирает список пользователей из базы данных mongoDB, а затем сохраняет этих пользователей в структуре.

// GetUsers gets all local users from a MongoDB
func GetUsers() {
    var decode structs.User
    logging.Info("Gathering Users from DB")
    collection := mongoclient.Database.Collection("LocalUsers")
    cur, err := collection.Find(context.TODO(), bson.D{})
    if err != nil {
        logging.Fatal(fmt.Sprintf("In users - Getting data from MongoDB: %s", err))
    }

    for cur.Next(context.TODO()) {
        // create a value into which the single document can be decoded
        err := cur.Decode(&decode)
        if err != nil {
            logging.Fatal(fmt.Sprintf("In users - Error decoding results: %s", err))
        }
        // if there is nothing in the database dont try create a User
        if decode.Username != "" {
            structs.LocalUsers[decode.Username] = decode
            fmt.Printf("stored: %+v\n", structs.LocalUsers[decode.Username].DcList)
            fmt.Printf("struct: %+v\n", structs.LocalUsers[decode.Username].DcList)
        }
        fmt.Printf("in get stored: %+v\n", structs.LocalUsers)
    }
    cur.Close(context.TODO())
}

Рассматриваемая структура

//LocalUsers is just a slice of all users gathered from DB
var LocalUsers = make(map[string]User)

// User describes a user
type User struct {
    Username string
    Password string
    FullName string
    Email    string
    Role     string
    DcList   []string
}

Это Концепция работает в других частях моего кода, однако здесь кажется, что при тестировании при вставке объектов в mon go все работает, как ожидалось. Я получаю ожидаемые результаты et c. Когда я действительно перезапускаю приложение, я заметил, что вся информация такая, как я ожидал, за исключением фрагмента DcList. Он всегда перезаписывается последним элементом l oop. Я провел несколько тестов и просто не могу понять, почему это происходит?

stored: {Username:Admin Password:peopleeater FullName:Administrator Email:admin@here.com Role:Admin DcList:[]}
struct: {Username:Admin Password:peopleeater FullName:Administrator Email:admin@here.com Role:Admin DcList:[]}
stored: {Username:bob Password:password FullName:bob Email:bob@here.com Role:View DcList:[eriks]}
struct: {Username:bob Password:password FullName:bob Email:bob@here.com Role:View DcList:[eriks]}
stored: {Username:test Password:test1 FullName:test1 Email:test1@here.com Role:View DcList:[test1]}
struct: {Username:test Password:test1 FullName:test1 Email:test1@here.com Role:View DcList:[test1]}
stored: {Username:test2 Password:test2 FullName:test2 Email:test2@here.com Role:View DcList:[test2]}
struct: {Username:test2 Password:test2 FullName:test2 Email:test2@here.com Role:View DcList:[test2]}
stored: {Username:test3 Password:test3 FullName:test3 Email:test3@here.com Role:View DcList:[test1]}
struct: {Username:test3 Password:test3 FullName:test3 Email:test3@here.com Role:View DcList:[test1]}
in get stored: map[Admin:{Username:Admin Password:P@$$w0rd FullName:Administrator Email:admin@here.com Role:Admin DcList:[]} bob:{Username:bob Password:password FullName:bob Email:bob@here.com Role:View DcList:[test1]} test:{Username:test Password:test1 FullName:test1 Email:test1@here.com Role:View DcList:[test1]} test2:{Username:test2 Password:test2 FullName:test2 Email:test2@here.com Role:View DcList:[test1]} test3:{Username:test3 Password:test3 FullName:test3 Email:test3@here.com Role:View DcList:[test1]}]

Я подумал, может, мне следует инициализировать срез? Однако мне не приходилось делать это в прошлом, поэтому я не понимаю, где здесь, на данном этапе, это, кажется, происходит? Я знаю, что мне не хватает чего-то простого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...