<prompt> Andika programu ya Golang inayotekelezea seva rahisi ya HTTP iliyo na ncha za kuunda, kusoma, kusasisha na kufuta rekodi katika hifadhidata ya PostgreSQL. Rekodi zinapaswa kuwakilisha bidhaa zilizo na sifa kama vile kitambulisho, jina, bei na maelezo.PLINFORMAT  <response>: kifurushi kikuukuagiza databasesqlusimbajijsonfmtloginethttpstrconvgithub.comgorillamux_ github.comlibpqaina ya muundo wa bidhaa Kitambulisho int json:idMfuatano wa jina json:jinaMfuatano wa maelezo json:maelezoBei int json:beivar db sql.DBfunc main kosa kosadb, err sql.Openpostgres, useryourusername passwordyourpassword dbnameyourdbname sslmodelemazaikiwa makosa ! nil log.Fatalhitilafuahirisha db.Fungakipanga njia : mux.NewRouterrouter.HandleFuncbidhaa, createProduct.NjiaPOST.router.HandleFuncbidhaa, getProducts.NjiaGET.router.HandleFuncproductsid, getProduct.NjiaGET.router.HandleFuncproductsid, updateProduct.NjiaPUT.router.HandleFuncproductsid, deleteProduct.NjiaFUTA.log.Fatalhttp.ListenAndServe:8080, kipanga njiafunc createProductw http.ResponseWriter, r http.Request var bidhaa Bidhaajson.NewDecoderr.Body.Simbuabidhaaquery : INGIZA KWENYE bidhaa jina, maelezo, bei THAMANI 1, 2, 3 kitambulisho cha KURUDISHAerr : db.QueryRowhoja, product.Name, product.Maelezo, product.Price.Scanproduct.IDikiwa makosa ! nil http.Errorw, err.Error, http.StatusInternalServerErrorkurudiw.Header.WekaAina ya Maudhui, programujsonjson.NewEncoderw.Encoderbidhaafunc getProductsw http.ResponseWriter, r http.Ombi safu mlalo, kosa : db.QueryCHAGUA kitambulisho, jina, maelezo, bei KUTOKA kwa bidhaaikiwa makosa ! nil http.Errorw, err.Error, http.StatusInternalServerErrorkurudiahirisha safu.Fungavar bidhaa Bidhaakwa safu.Next var bidhaa Bidhaakosa : safu.Scanproduct.ID, product.Name, product.Description, product.Priceikiwa makosa ! nil http.Errorw, err.Error, http.StatusInternalServerErrorkurudibidhaa nyongezabidhaa, bidhaaw.Header.WekaAina ya Maudhui, programujsonjson.NewEncoderw.Encoderbidhaafunc getProductw http.ResponseWriter, r http.Ombi params : mux.Varsrid, err : strconv.Atoiparamsidikiwa makosa ! nil http.Errorw, err.Error, http.StatusBadRequestkurudivar bidhaa Bidhaaquery : CHAGUA kitambulisho, jina, maelezo, bei KUTOKA kwa bidhaa WHERE id1err db.QueryRowhoja, kitambulisho.Changanuaproduct.ID, product.Name, product.Description, product.Priceikiwa kosa sql.ErrNoRows http.Haijapatikanaw, rkurudi vinginevyo ikiwa makosa ! nil http.Errorw, err.Error, http.StatusInternalServerErrorkurudiw.Header.WekaAina ya Maudhui, programujsonjson.NewEncoderw.Encoderbidhaafunc updateProductw http.ResponseWriter, r http.Ombi params : mux.Varsrid, err : strconv.Atoiparamsidikiwa makosa ! nil http.Errorw, err.Error, http.StatusBadRequestkurudivar bidhaa Bidhaajson.NewDecoderr.Body.Simbuabidhaaquery : SASISHA bidhaa SET name1, description2, price3 WHERE id4tokeo, kosa : db.Exechoja, bidhaa.Jina, bidhaa.Maelezo, bidhaa.Bei, kitambulishoikiwa makosa ! nil http.Errorw, err.Error, http.StatusInternalServerErrorkurudirowsAffected, _ : result.RowsAffectedikiwa safu zimeathirika 0 http.Haijapatikanaw, rkurudiproduct.ID idw.Header.WekaAina ya Maudhui, programujsonjson.NewEncoderw.Encoderbidhaafunc deleteProductw http.ResponseWriter, r http.Ombi params : mux.Varsrid, err : strconv.Atoiparamsidikiwa makosa ! nil http.Errorw, err.Error, http.StatusBadRequestkurudiquery : FUTA KUTOKA KWA bidhaa WAPI id1matokeo, makosa : db.Exechoja, kitambulishoikiwa makosa ! nil http.Errorw, err.Error, http.StatusInternalServerErrorkurudirowsAffected, _ : result.RowsAffectedikiwa safu zimeathirika 0 http.Haijapatikanaw, rkurudifmt.Fprintfw, Bidhaa iliyofutwa yenye kitambulisho d, kitambulisho 