Как заполнить структуру без дублей, golang

Рейтинг: 1Ответов: 1Опубликовано: 04.03.2023

Не удается заполнить второй массив структур штрихкодами. В чем может быть дело?

package main

import "fmt"

type Stor struct {
    Store_id string
    Goods    []Good
}

type Good struct {
    GoodsId  string
    BarCodes []BarCodes
}

type BarCodes struct {
    BarCode string
}

func (storage *Stor) GetGoodById(goodid string) (*Good, bool) {
    for _, good := range storage.Goods {
        if good.GoodsId == goodid {
            return &good, true
        }
    }

    good := Good{
        GoodsId: goodid,
    }
    arrGoods := &storage.Goods
    *arrGoods = append(*arrGoods, good)

    for _, good := range storage.Goods {
        if good.GoodsId == goodid {
            return &good, true
        }
    }

    return &Good{}, false
}

func (goodst *Good) AddBarCode(barcode string) string {
    for _, bcode := range goodst.BarCodes {
        if bcode.BarCode == barcode {
            return "finded"
        }
    }

    bc := BarCodes{
        BarCode: barcode,
    }
    arrBarCodes := &goodst.BarCodes

    *arrBarCodes = append(*arrBarCodes, bc)

    return "new"
}

func AppendStr(st *Stor, idvalue string, barcode string) {

    good := Good{}
    if goodch, ok := st.GetGoodById(idvalue); ok {
        good = *goodch
    }

    status := good.AddBarCode(barcode)
    fmt.Println(barcode, status)

}

func main() {

    st := Stor{
        Store_id: "123456789",
    }

    AppendStr(&st, "76549", "8888888")
    AppendStr(&st, "76551", "1111111")
    AppendStr(&st, "76549", "8888888")
    AppendStr(&st, "76549", "2222222")
    // AppendStr(&st, "76789", "7777777")
    // AppendStr(&st, "76551", "5555555")
    // AppendStr(&st, "76549", "3333333")

    fmt.Println(st)

}

Товары заполняться, но без штрихкодов {123456789 [{76549 []} {76551 []}]}

Ответы

▲ 1Принят

Вы то и дело возвращаете указатели на временные объекты и модифицируете не там, где надо.

  1. В AppendStr вы копируете значение по указателю во временный объект good = *goodch, затем модифицируете его good.AddBarCode(barcode). Это измнение остаётся во временном объекте и не попадает в тот, что по указателю.

  2. В GetGoodById вы возвращаете return &good, true, то есть указатель на временный объект, создаваемый при итерации. Измнения в этом объекте никак не влияют на исходный список.

    Для указателя на элемент массива нужно возвращать указатель на индексируемый объект

     for i := range storage.Goods {
         if storage.Goods[i].GoodsId == goodid {
             return &storage.Goods[i], true
         }
     }
    

Вот вам работающий вариант: https://go.dev/play/p/0vOM67kDB3Z