<prompt> Unda seva ya Golang REST API ambayo ina sehemu za mwisho za kuongeza, kusasisha, kufuta na kurejesha maelezo kuhusu vitabu vilivyohifadhiwa katika hifadhidata ya PostgreSQL. Muundo wa kitabu unapaswa kuwa na sehemu kama vile kichwa, mwandishi, mwaka wa uchapishaji na aina.  <response>: Ili kuunda seva ya Golang REST API na mahitaji maalum, fuata hatua hizi:1. Sakinisha vifurushi na zana zinazohitajikaKwanza, hakikisha kuwa Go imesakinishwa kwenye mashine yako. Unaweza kuipakua kutoka Kisha, sakinisha vifurushi vifuatavyo:- Gorilla Mux ya kuelekeza: nenda pata -u github.comgorillamux- kiendesha pq cha PostgreSQL: nenda pata -u github.comlibpq2. Sanidi hifadhidata ya PostgreSQLUnda hifadhidata mpya ya PostgreSQL na jedwali ili kuhifadhi maelezo ya kitabu. Amri ya SQL inapaswa kuonekana kama hii: sqlCREATE TABLE vitabu id UFUNGUO WA MSINGI WA SERIAL, kichwa VARCHAR100 SI UFUPI, mwandishi VARCHAR100 NOT NULL, mwaka_wa_chapisho INT NOT NULL, aina ya VARCHAR50 SIYO BATILI;3. Unda faili ya main.goKatika folda yako ya mradi, unda faili ya main.go na uingize vifurushi muhimu:nendakifurushi kikuukuagiza databasesqlusimbajijsonfmtloginethttpgithub.comgorillamux_ github.comlibpqconst mwenyeji mwenyeji wa ndanibandari 5432mtumiaji mtumiaji_wakonenosiri nenosiri_lakodbname jina_la_ lakochapa muundo wa kitabu Kitambulisho int json:idMfuatano wa kichwa json:kichwaMfuatano wa mwandishi json:mwandishiPublicationYear int json:publication_yearMfuatano wa aina json:ainavar db sql.DBfunc main psqlInfo : fmt.Sprintfhosts portd users passwords dbnames sslmodelemaza,mwenyeji, bandari, mtumiaji, nenosiri, dbnamekosa kosadb, err sql.Funguapostgres, psqlInfoikiwa makosa ! nil hofu makosaahirisha db.Fungamakosa db.Pingikiwa makosa ! nil hofu makosakipanga njia : mux.NewRouterrouter.HandleFuncvitabu, getBooks.NjiaGETrouter.HandleFuncbooksid, getBook.NjiaGET.router.HandleFuncvitabu, createBook.NjiaPOSTrouter.HandleFuncbooksid, updateBook.NjiaPUT.router.HandleFuncbooksid, deleteBook.NjiaFUTA.log.Fatalhttp.ListenAndServe:8000, kipanga njia4. Tekeleza ncha za APISasa, tekeleza kazi za kila mwisho:nendafunc getBooksw http.ResponseWriter, r http.Ombi w.Header.WekaAina ya Maudhui, programujsonvar vitabu Kitabutokeo, kosa : db.QueryCHAGUA kitambulisho, kichwa, mwandishi, uchapishaji_mwaka, aina FROM vitabuikiwa makosa ! nil hofuerr.Errorahirisha matokeo.Fungakwa matokeo.Inayofuata var kitabu Kitabuerr : result.Scanbook.ID, book.Title, book.Author, book.PublicationYear, book.Genreikiwa makosa ! nil hofuerr.Errorvitabu nyongezavitabu, kitabujson.NewEncoderw.Encodevitabufunc getBookw http.ResponseWriter, r http.Ombi w.Header.WekaAina ya Maudhui, programujsonparams : mux.Varsrmatokeo, makosa : db.QueryCHAGUA kitambulisho, kichwa, mwandishi, publication_year, aina FROM vitabu WHERE id 1, paramsidikiwa makosa ! nil hofuerr.Errorahirisha matokeo.Fungavar kitabu Kitabukwa matokeo.Inayofuata err : result.Scanbook.ID, book.Title, book.Author, book.PublicationYear, book.Genreikiwa makosa ! nil hofuerr.Errorjson.NewEncoderw.Encoderkitabufunc createBookw http.ResponseWriter, r http.Ombi w.Header.WekaAina ya Maudhui, programujsonvar kitabu Kitabu_ json.NewDecoderr.Body.Simbuakitabuerr : db.QueryRowINGIZA NDANI ya vitabu jina, mwandishi, mwaka_wa_chapisho, aina THAMANI 1, 2, 3, 4 kitambulisho cha KURUDISHA;, kitabu.Kichwa, kitabu.Mwandishi, kitabu.PublicationYear, book.Genre .Changanuakitabu.IDikiwa makosa ! nil hofuerr.Errorjson.NewEncoderw.Encoderkitabufunc updateBookw http.ResponseWriter, r http.Ombi w.Header.WekaAina ya Maudhui, programujsonparams : mux.Varsrvar kitabu Kitabu_ json.NewDecoderr.Body.Simbuakitabudb.ExecUPDATE vitabu SET title1, author2, publication_year3, genre4 WHERE id5, book.Title, book.Author, book.PublicationYear, book.Genre, paramsid matokeo, makosa : db.QueryCHAGUA kitambulisho, kichwa, mwandishi, publication_year, aina FROM vitabu WHERE id 1, paramsidikiwa makosa ! nil hofuerr.Errorahirisha matokeo.Fungakwa matokeo.Inayofuata err : result.Scanbook.ID, book.Title, book.Author, book.PublicationYear, book.Genreikiwa makosa ! nil hofuerr.Errorjson.NewEncoderw.Encoderkitabufunc deleteBookw http.ResponseWriter, r http.Ombi w.Header.WekaAina ya Maudhui, programujsonparams : mux.Varsrdb.ExecFUTA KUTOKA kwa vitabu WHERE id 1, paramsidjson.NewEncoderw.Encodemapstringstringresult: success5. Endesha sevaSasa, unaweza kuendesha seva yako ya REST API kwa kutekeleza go run main.go. Seva itasikiliza kwenye port 8000 na kutoa vidokezo vya kuongeza, kusasisha, kufuta na kurejesha maelezo ya kitabu.Unaweza kujaribu miisho kwa kutumia zana kama Postman au curl. 