Почему обьект конкретного типа меняет свой тип на выходе из функции?
Суть вопроса изложена в комментах.
type Transaction struct {
Tid string `json:"tid,omitempty" gorm:"tid"`
Requested_sum int `json:"sum,omitempty" gorm:"rsum"`
DenyReason int `json:"denyreason,omitempty" gorm:"dreason"`
Payer User `json:"payer,omitempty" gorm:"payer"`
Reciever User `json:"reciever,omitempty" gorm:"reciever"`
Err error `json:"-" gorm:"-"`
Success bool `json:"success,omitempty" gorm:"success"`
Accepted bool `json:"accepted,omitempty" gorm:"accepted"`
}
type Transactionentry struct {
Tid string `gorm:"tid" json:"tid"`
Transaction string `gorm:"transaction" json:"transaction"`
}
func init() {
model := Transactionentry{}
// вызов полиморфной функции.
rows, err := getEntriesFromPostgres(model)
if err != nil {
log.Println(err)
return
}
// Подготовил пару ключ значение куда будут сканироваться ключи и значения.
k, v := "", ""
for rows.Next() {
// Здесь все ожидаемо
// v это строка json
err := rows.Scan(&k, &v)
if err != nil {
log.Println(err)
return
}
// здесь прямо указываю в переменную какого типа должна производится распаковка json
l := Transaction{}
// но при вызове распаковщика возвращается мапа string[any] вместо Transaction
unpacked := unpackJSON([]byte(v), l)
// соответственно доступа к полям нет.
// если попытаться сделать утверждение типов например:
/*
log.Println(unpacked.(Transaction))
*/
// то программа благополучно паникует, что неудивительно, ведь unpacked стал map[string]any
// хоть посылался в функцию как Transaction
// А нужно чтобы unpacked так Transaction и возвращался но при этом
// unpackJSON осталась полиморфной.
log.Println(unpacked)
}
}
func getEntriesFromPostgres(model any) (*sql.Rows, error) {
db := postgreser.Database{}
db.ConfigAndRun()
rows, err := db.DB.Model(&model).Rows()
if err != nil {
return &sql.Rows{}, err
}
return rows, nil
}
func unpackJSON(packed []byte, unpacked any) any {
err := json.Unmarshal(packed, &unpacked)
if err != nil {
log.Println(err)
return struct{}{}
}
return unpacked
}
Ответы (1 шт):
Автор решения: Quester
→ Ссылка
Решил проблему. Нужно было сразу unpackJSON передать поинтер на обьект целевого типа. А я передавал any а потом пытался передеть функции Unmarshal уже поинтер на any.
было при вызове unpackJSON:
unpacked := unpackJSON([]byte(v), l)
стало при вызове unpackJSON:
unpacked := unpackJSON([]byte(v), &l)
было при вызове json.Unmarshal:
err := json.Unmarshal(packed, &unpacked)
стало при вызове json.Unmarshal:
err := json.Unmarshal(packed, unpacked)