Неправильно заполняется слайс интерфейсов
Всем привет . Прошу помощи в устранении недоразумения моего)) В комментариях привел пример ожидаемлого результата и фактического. Не понимаю, почему так происходит. Как исправить?
package main
import (
"context"
"encoding/json"
"log"
"post/service"
"strings"
"github.com/jackc/pgx/v4"
)
/* struct for get data from db and marshall it */
type MarshData struct {
MarshID string `json:"id"`
MarshNAME string `json:"name"`
MarshAGE int `json:"age"`
}
/* Gets items from db and return slice of byte slices */
func GettingFromDb(Expression string) [][]byte {
data := MarshData{}
var sliceForMarshalled [][]byte
dbconnect, _ := pgx.Connect(context.Background(), strings.TrimSpace(string(service.ReadFile(".connect.txt"))))
rows, err := dbconnect.Query(context.Background(), Expression)
log.Println(err)
for rows.Next() {
rows.Scan(&data.MarshID, &data.MarshNAME, &data.MarshAGE)
marshalled, _ := json.Marshal(MarshData{MarshID: data.MarshID, MarshNAME: data.MarshNAME, MarshAGE: data.MarshAGE})
sliceForMarshalled = append(sliceForMarshalled, marshalled)
}
return sliceForMarshalled
}
/* Unmarshall data and gets fields and returns slice of fields with data from db */
/* ПРОБЛЕМНАЯ ФУНКЦИЯ ПРОБЛЕМНАЯ ФУНКЦИЯ ПРОБЛЕМНАЯ ФУНКЦИЯ ПРОБЛЕМНАЯ ФУНКЦИЯ ПРОБЛЕМНАЯ ФУНКЦИЯ */
func UnmarshallFromDB(Expression string) []interface{} {
data := GettingFromDb(Expression)
var unmarshalledMaps map[string]interface{}
var fieldFromUnmarshelledMaps []interface{}
for i := 0; i < len(data); i++ {
/* Кладу результат десереализации в мапу unmarshalledMaps*/
json.Unmarshal(data[i], &unmarshalledMaps)
/* здесь выводятся правильные мапы с данными и они за каждый проход разные и в конце цикла
// имеют вид:
//
// map[age:someAge1 id:SomeID1 name:SomeName1]
// map[age:someAge2 id:SomeID2 name:SomeName2]
// map[age:someAge3 id:SomeID3 name:SomeName3]
*/
log.Println(unmarshalledMaps)
/* делаю аппенд мапы в слайс интерфесов, ожидаю, что будут зааппенжены разные данные,
так как unmarshalledMaps на каждом проходе цикла имеет разные данные */
fieldFromUnmarshelledMaps = append(fieldFromUnmarshelledMaps, unmarshalledMaps)
}
/* Но здесь я вывожу слайс интерфейсов fieldFromUnmarshelledMaps и вижу
что аппендились одни и те же данные */
/* Вот пример ожидаемого результата:
// map[age:someAge1 id:SomeID1 name:SomeName1]
// map[age:someAge2 id:SomeID2 name:SomeName2]
// map[age:someAge3 id:SomeID3 name:SomeName3]
*/
log.Println(fieldFromUnmarshelledMaps...)
/* Вот то что я получаю:
// map[age:someAge3 id:SomeID3 name:SomeName3]
// map[age:someAge3 id:SomeID3 name:SomeName3]
map[age:someAge3 id:SomeID3 name:SomeName3]
*/
/* При то, что unmarshalledMaps за все проходы меняется и при выводе его имеет вид
// map[age:someAge1 id:SomeID1 name:SomeName1]
// map[age:someAge2 id:SomeID2 name:SomeName2]
// map[age:someAge3 id:SomeID3 name:SomeName3]
*/
return fieldFromUnmarshelledMaps
}
/* it's expamle using this package */
func main() {
UnmarshallFromDB("select * from users")
}