Почему обьект конкретного типа меняет свой тип на выходе из функции?

Суть вопроса изложена в комментах.

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)
→ Ссылка