{"id":303632,"date":"2020-05-14T21:00:32","date_gmt":"2020-05-14T21:00:32","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=303632"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=303632","title":{"rendered":"\u0428\u0430\u0431\u043b\u043e\u043d backend \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430 Golang \u2014 \u0447\u0430\u0441\u0442\u044c 2 (REST API)"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/500554\/\">\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043d\u0438\u0436\u0435 \u0448\u0430\u0431\u043b\u043e\u043d \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430 Golang \u0431\u044b\u043b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0437\u043d\u0430\u043d\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u0430, \u043a\u0440\u043e\u043c\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u2014 \u044d\u0442\u043e \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043d\u0430 Go. <\/p>\n<p>  <\/p>\n<p><strong><a href=\"https:\/\/habr.com\/ru\/post\/492062\/\">\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/a><\/strong> \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0431\u044b\u043b\u0430 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 HTTP \u0441\u0435\u0440\u0432\u0435\u0440\u0443:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 HTTP \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b<\/li>\n<li>\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 TLS HTTP \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/li>\n<li>\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0440\u043e\u0443\u0442\u0435\u0440\u0430 \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f HTTP \u0438 prof-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432<\/li>\n<li>\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f HTTP \u0442\u0440\u0430\u0444\u0438\u043a\u0430, \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043e\u043a \u0432 HTTP<\/li>\n<li>HTTP Basic \u0438 MS AD \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f, JSON Web Token<\/li>\n<li>\u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0432 \u043a\u0430\u043d\u0430\u043b \u043e\u0448\u0438\u0431\u043e\u043a<\/li>\n<li>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/li>\n<li>\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0433\u043e \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/li>\n<li>\u0441\u0431\u043e\u0440\u043a\u0430 \u043a\u043e\u0434\u0430 \u0441 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435\u043c \u0432\u0435\u0440\u0441\u0438\u0438, \u0434\u0430\u0442\u044b \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 commit<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e REST API.<br \/>  \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 <a href=\"https:\/\/github.com\/romapres2010\/httpserver\" rel=\"nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/a> \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u0435\u0436\u043d\u0435\u0439.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5d3\/ec6\/db2\/5d3ec6db2b43d2b01e06665fa558d027.png\" alt=\"\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 REST API\"><\/p>\n<p>  <\/p>\n<p>\u0412 \u0445\u043e\u0434\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043d\u0430 <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/raw\/master\/img\/test_environment.png\" rel=\"nofollow\">\u0441\u0442\u0435\u043d\u0434\u0435<\/a> \u0431\u044b\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/raw\/master\/img\/get_db_memory_json.png\" rel=\"nofollow\">\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b<\/a>.<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u0437 PostgreSQL \u2014 \u0434\u043e 16 000 [get\/sec], \u0441oncurrency 1024, \u043c\u0435\u0434\u0438\u0430\u043d\u0430 60 [ms]. \u041a\u0430\u0436\u0434\u044b Get \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u043e\u0431\u0449\u0438\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 360 000 000 \u0441\u0442\u0440\u043e\u043a. \u0420\u0430\u0437\u043c\u0435\u0440 JSON 1800 \u0431\u0430\u0439\u0442.<\/li>\n<li>\u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u0443 \u0446\u0438\u0444\u0440\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0434\u043e 100 000 \u2014 120 000 [get\/sec], \u0441oncurrency 1024, \u043c\u0435\u0434\u0438\u0430\u043d\u0430 2 [ms]. Transfer rate \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 200-250 [MB\/sec]<\/li>\n<li>\u043d\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0443 \u0432 PostgreSQL \u2014 \u043e\u043a\u043e\u043b\u043e 10 000 [insert\/sec].<\/li>\n<\/ul>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2 id=\"soderzhanie-stati\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438<\/h2>\n<p>  <\/p>\n<ol>\n<li>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430<\/li>\n<li>\u041c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445<br \/> \n<ul>\n<li>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 <\/li>\n<li>\u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 <\/li>\n<li>\u041f\u0443\u043b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438 <\/li>\n<li>Marshal \/ Unmarshal \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 JSON <\/li>\n<\/ul>\n<\/li>\n<li>\u0421\u043b\u043e\u0439 <strong>SQLXX<\/strong> <br \/> \n<ul>\n<li>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043f\u0430\u043d\u0438\u043a <\/li>\n<li>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0411\u0414 <\/li>\n<li>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 SQL <\/li>\n<\/ul>\n<\/li>\n<li>\u0421\u043b\u043e\u0439 <strong>DB<\/strong> <br \/> \n<ul>\n<li>\u0418\u0437\u043e\u043b\u044f\u0446\u0438\u044e \u043e\u0442 \u0441\u043b\u043e\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0411\u0414<\/li>\n<li>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 <\/li>\n<li>\u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 <\/li>\n<\/ul>\n<\/li>\n<li>\u0421\u043b\u043e\u0439 <strong>JSON<\/strong> <br \/> \n<ul>\n<li>Marshal \/ Unmarshal JSON <\/li>\n<li>Unmarshal JSON <\/li>\n<li>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 <\/li>\n<li>\u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 JSON <\/li>\n<\/ul>\n<\/li>\n<li>\u0421\u043b\u043e\u0439 <strong>HTTP<\/strong> <br \/> \n<ul>\n<li>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0431\u0443\u0444\u0435\u0440\u043d\u044b\u043c \u043f\u0443\u043b\u043e\u043c <\/li>\n<li>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a GET, POST, PUT <\/li>\n<li>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 <\/li>\n<\/ul>\n<\/li>\n<li>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 <br \/> \n<ul>\n<li>\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434 <\/li>\n<li>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>  <\/p>\n<h2 id=\"1-opisanie-arhitekturnogo-podhoda\">1. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430<\/h2>\n<p>  <\/p>\n<p>\u0428\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u0432\u0438\u0434\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u043b\u043e\u0435\u0432.<\/p>\n<p>  <\/p>\n<ol>\n<li>\u0421\u043b\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 <strong>Model<\/strong> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430:<br \/> \n<ul>\n<li>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n<li>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n<li>\u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n<li>\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f Marshal \/ Unmarshal JSON \u043c\u043e\u0434\u0435\u043b\u0438<\/li>\n<li>\u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043f\u0443\u043b\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438<\/li>\n<li>\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438<\/li>\n<\/ul>\n<\/li>\n<li>\u0421\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0439 \u0441\u043b\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0411\u0414 <strong>SQLXX<\/strong> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430:<br \/> \n<ul>\n<li>\u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044e \u043e\u0442 \u0441\u043b\u043e\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0411\u0414<\/li>\n<li>\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0411\u0414<\/li>\n<li>\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043f\u0430\u043d\u0438\u043a<\/li>\n<li>\u0440\u0430\u0431\u043e\u0442\u0430 \u0441 SQL<\/li>\n<\/ul>\n<\/li>\n<li>\u0421\u043b\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0411\u0414 <strong>DB<\/strong> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430:<br \/> \n<ul>\n<li>\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0411\u0414, \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044f \u043e\u0442 \u0441\u043b\u043e\u044f SQL<\/li>\n<li>\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n<li>\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u043c\u0438<\/li>\n<li>\u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438<\/li>\n<\/ul>\n<\/li>\n<li>\u0421\u043b\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 JSON <strong>JSON<\/strong> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430:<br \/> \n<ul>\n<li>\u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n<li>Marshal \/ Unmarshal JSON<\/li>\n<li>\u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 JSON<\/li>\n<\/ul>\n<\/li>\n<li>\u0421\u043b\u043e\u0439 HTTP \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 <strong>HTTP<\/strong> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430:<br \/> \n<ul>\n<li>\u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/li>\n<li>\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c HTTP \u043c\u0435\u0442\u043e\u0434\u0430<\/li>\n<li>\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 (basic, MS AD, &#8230;)<\/li>\n<li>\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u0438 token<\/li>\n<li>\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043b\u0430 (body) \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/li>\n<li>\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 (header) \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/li>\n<li>\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u043d\u044b\u043c \u043f\u0443\u043b\u043e\u043c \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u043e\u0432<\/li>\n<li>\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u0430<\/li>\n<li>\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 HSTS Strict-Transport-Security<\/li>\n<li>\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Content-Type \u0434\u043b\u044f \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 (response)<\/li>\n<li>\u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e HTTP \u043e\u0442\u0432\u0435\u0442\u0430<\/li>\n<li>\u0437\u0430\u043f\u0438\u0441\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 (header) \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430<\/li>\n<li>\u0437\u0430\u043f\u0438\u0441\u044c \u0442\u0435\u043b\u0430 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430<\/li>\n<li>\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043e\u043a<\/li>\n<li>\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 defer recovery \u0434\u043b\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 panic<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u043b\u043e\u0435\u0432 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u0441 \u043a\u043b\u0430\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e REST API \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b: FaaS, \u043e\u0447\u0435\u0440\u0435\u0434\u044c, gRPC.<\/p>\n<p>  <\/p>\n<h2 id=\"2-model-dannyh-model\">2 \u041c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 <strong>Model<\/strong><\/h2>\n<p>  <\/p>\n<h3 id=\"21-struktura-modeli-dannyh-interfeys-obrabotki\">2.1. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/h3>\n<p>  <\/p>\n<h4 id=\"211-primer-formalizovannoy-modeli-dannyh\">2.1.1 \u041f\u0440\u0438\u043c\u0435\u0440 \u0444\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/h4>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0446\u0435\u043b\u0435\u0439 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438, \u0432 \u0448\u0430\u0431\u043b\u043e\u043d \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0434\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/blob\/master\/model\/model.go\" rel=\"nofollow\">&quot;Department&quot; \u0438 &quot;Employee&quot;<\/a>. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u0432 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0411\u0414.<br \/>  \u041d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u0435\u0433\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0411\u0414, \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f JOSN \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432\u0430\u043b\u0438\u0430\u0446\u0438\u0438.<br \/>  \u0418\u043c\u0435\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u0440\u0430\u0442\u043a\u0438\u0445 \u0438\u043c\u0435\u043d \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 (\u0431\u0438\u0437\u043d\u0435\u0441-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432).<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">\/\/ Dept represent object &quot;Department&quot; type Dept struct {     Deptno int         `db:&quot;deptno&quot; json:&quot;deptNumber&quot; validate:&quot;required&quot;`     Dname  string      `db:&quot;dname&quot; json:&quot;deptName&quot; validate:&quot;required&quot;`     Loc    null.String `db:&quot;loc&quot; json:&quot;deptLocation,nullempty&quot;`     Emps   []*Emp      `json:&quot;emps,omitempty&quot;` }  \/\/ Emp represent object &quot;Employee&quot; type Emp struct {     Empno    int         `db:&quot;empno&quot; json:&quot;empNo&quot; validate:&quot;required&quot;`     Ename    null.String `db:&quot;ename&quot; json:&quot;empName,nullempty&quot;`     Job      null.String `db:&quot;job&quot; json:&quot;job,nullempty&quot;`     Mgr      null.Int    `db:&quot;mgr&quot; json:&quot;mgr,omitempty&quot;`     Hiredate null.String `db:&quot;hiredate&quot; json:&quot;hiredate,nullempty&quot;`     Sal      null.Int    `db:&quot;sal&quot; json:&quot;sal,nullempty&quot; validate:&quot;gte=0&quot;`     Comm     null.Int    `db:&quot;comm&quot; json:&quot;comm,nullempty&quot; validate:&quot;gte=0&quot;`     Deptno   null.Int    `db:&quot;deptno&quot; json:&quot;deptNumber,nullempty&quot;` }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/blob\/master\/model\/model_service.go\" rel=\"nofollow\">\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432<\/a>.<br \/>  \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0448\u0435 \u043b\u0435\u0436\u0430\u0449\u0438\u0435 \u0441\u043b\u043e\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0442 \u0441\u043b\u043e\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u0441 \u043e\u0434\u043d\u043e\u0439 \u0411\u0414 \u043d\u0430 \u0434\u0440\u0443\u0433\u0443\u044e).<br \/>  \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043e\u0431\u044b\u0447\u043d\u043e, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0431\u0438\u0437\u043d\u0435\u0441-\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 (\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e). \u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0441 \u0442\u0438\u043f\u043e\u043c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0439 &quot;\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f&quot; \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0440\u0430\u0437\u043d\u043e\u0441\u0438\u0442\u044c \u043f\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c.<br \/>  \u0422\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0430 REST API \u043d\u0430\u0434 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0411\u0414, \u0442\u043e \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0432 \u043d\u0435\u0433\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435: Get, Create, Update.<br \/>  \u0412\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u0435\u0440\u0432\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 context.Context \u2014 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c &quot;\u043e\u0442\u043c\u0435\u043d\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432&quot;.<br \/>  \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438, \u043f\u0440\u0438\u0447\u0435\u043c \u043f\u0440\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u044b. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c sync.Pool.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">\/\/ DeptService represent basic interface for Dept type DeptService interface {     GetDept(ctx context.Context, out *Dept) (bool, error)     GetDeptsPK(ctx context.Context, out *DeptPKs) error     CreateDept(ctx context.Context, in *Dept, out *Dept) error     UpdateDept(ctx context.Context, in *Dept, out *Dept)  (bool, error) }  \/\/ EmpService represent basic interface for Emp type EmpService interface {     GetEmp(ctx context.Context, out *Emp) (bool, error)     GetEmpsByDept(ctx context.Context, in *Dept, out *EmpSlice) error     CreateEmp(ctx context.Context, in *Emp, out *Emp) error     UpdateEmp(ctx context.Context, in *Emp, out *Emp)  (bool, error) }<\/code><\/pre>\n<p>  <\/p>\n<h4 id=\"212-primer-modeli-dannyh-dlya-raboty-s-ocheredyu\">2.1.2 \u041f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e<\/h4>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e IBM MQ.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">\/\/ Request represent a type for request type Request struct {     QObject               string \/\/ \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0447\u0435\u0440\u0435\u0434\u0438     QueueName             string \/\/ \u0438\u043c\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438     QueueOptions          int32  \/\/ MQOO_OUTPUT, MQOO_BROWSE, MQOO_INPUT_AS_Q_DEF       QueueWaitInterval     int    \/\/ \u043f\u0435\u0440\u0438\u043e\u0434 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 seconds     MsgIdHex              string \/\/ \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 Hex \u0444\u043e\u0440\u043c\u0430\u0442\u0435     CorrelIdHex           string \/\/ \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u0440\u0440\u0435\u043b\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 Hex \u0444\u043e\u0440\u043c\u0430\u0442\u0435     MesFormat             string \/\/ MQFMT_NONE, MQFMT_STRING     MesSyncpoint          int32  \/\/ MQPMO_NO_SYNCPOINT, MQPMO_SYNCPOINT     MesOptions            int32  \/\/     BrowseOptions         int32  \/\/ MQGMO_BROWSE_FIRST, MQGMO_BROWSE_NEXT, ...     Bufsize               int    \/\/ \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f     Buf                   []byte `json:&quot;-&quot;` \/\/ \u0431\u0443\u0444\u0435\u0440 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 }  \/\/ Response represent a type for response type Response struct {     QObject      string \/\/ \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0447\u0435\u0440\u0435\u0434\u0438     QueueName    string \/\/ \u0438\u043c\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438     MsgId        []byte \/\/ \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 byte \u0444\u043e\u0440\u043c\u0430\u0442\u0435     MsgIdHex     string \/\/ \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 Hex \u0444\u043e\u0440\u043c\u0430\u0442\u0435     CorrelId     []byte \/\/ \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u0440\u0440\u0435\u043b\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 byte \u0444\u043e\u0440\u043c\u0430\u0442\u0435     CorrelIdHex  string \/\/ \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u0440\u0440\u0435\u043b\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 Hex \u0444\u043e\u0440\u043c\u0430\u0442\u0435     PutDate      string \/\/ \u0434\u0430\u0442\u0430 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c     PutTime      string \/\/ \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c     DataLen      int    \/\/ \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f     ErrCode      string \/\/ \u043a\u043e\u0434 \u043e\u0448\u0438\u0431\u043a\u0438     ErrMes       string \/\/ \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e \u043e\u0448\u0438\u0431\u043a\u0438     ErrTrace     string \/\/ \u0442\u0440\u0430\u0439\u0441 \u043c\u0435\u0441\u0442\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043a\u0438     CauseErrCode string \/\/ \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u043e\u0448\u0438\u0431\u043a\u0438 - \u043f\u0440\u0438\u0447\u0438\u043d\u044b     CauseErrMes  string \/\/ \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 - \u043f\u0440\u0438\u0447\u0438\u043d\u044b     Buf          []byte \/\/ \u0431\u0443\u0444\u0435\u0440 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e IBM MQ.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">\/\/ QueueService represent basic service for queue type QueueService interface {     OpenQueue(ctx context.Context, req *Request, resp *Response) error     CloseQueue(ctx context.Context, req *Request, resp *Response) error     BrowseMessage(ctx context.Context, req *Request, resp *Response) error     BrowseFirstMessage(ctx context.Context, req *Request, resp *Response) error     BrowseNextMessage(ctx context.Context, req *Request, resp *Response) error     BrowseUnderMessage(ctx context.Context, req *Request, resp *Response) error     GetMessage(ctx context.Context, req *Request, resp *Response) error     DeleteUnderMessage(ctx context.Context, req *Request, resp *Response) error     PutMessage(ctx context.Context, req *Request, resp *Response) error     RegisterCallback(ctx context.Context, req *Request, resp *Response) error     DeregisterCallback(ctx context.Context, req *Request, resp *Response) error }<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"22-validaciya-modeli-dannyh\">2.2. \u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/h3>\n<p>  <\/p>\n<p>\u042f \u043f\u0440\u0438\u0432\u044b\u043a \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u043f\u043e \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u044b\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432:<\/p>\n<p>  <\/p>\n<ol>\n<li><strong>\u041e\u0434\u0438\u043d \u0430\u0442\u0440\u0438\u0431\u0443\u0442<\/strong> \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043e\u0434\u043d\u0438\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, &quot;\u0437\u0430\u0440\u043f\u043b\u0430\u0442\u0430&quot; &gt; 0, &quot;\u0438\u043c\u044f&quot; not null.<\/li>\n<li><strong>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/strong> \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, &quot;\u0434\u0430\u0442\u0430 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f&quot; &gt;= &quot;\u0434\u0430\u0442\u0430 \u043d\u0430\u0447\u0430\u043b\u0430&quot;<\/li>\n<li><strong>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f)<\/strong> \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, &quot;\u0434\u0430\u0442\u0430 \u043f\u043b\u0430\u043d\u043e\u0432\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u043e\u0440\u0434\u0435\u0440\u0430&quot; &gt;= &quot;\u0434\u0430\u0442\u044b \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f \u043e\u0440\u0434\u0435\u0440\u0430&quot; <\/li>\n<li><strong>\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438<\/strong> \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 (PK, UK), \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u0430\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/li>\n<li><strong>\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439<\/strong> \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0439 (FK), \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0437\u0430\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u0442\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0442\u043e\u0432\u0430\u0440\u043d\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439.<\/li>\n<li><strong>\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438<\/strong> \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0438 \u0441\u0442\u0430\u0440\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u043b\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 1, 2 \u0438 3 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 4, 5, 6 \u0443\u0440\u043e\u0432\u043d\u0435\u0439, \u043e\u0431\u044b\u0447\u043d\u043e, \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0445\u043e\u0434 \u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445.<br \/>  \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0436\u0435\u0441\u0442\u043a\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445, \u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434.<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0438 \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u0430.<\/li>\n<li>\u041d\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0411\u0414 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u043b\u043e\u0439 &quot;\u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e API&quot;. \u041d\u0430\u0431\u043e\u0440 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 DML \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u0412\u0441\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u043b\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e API. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0411\u0414 Oracle \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u044e\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e API.<\/li>\n<li>\u041d\u0430\u0434 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u043e\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439 (View API), \u043e\u0431\u044b\u0447\u043d\u043e, \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u0411\u0414.<\/li>\n<li>\u0414\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f Instead of Trigger \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 DML \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e API.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0415\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u043e\u0434\u0445\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u0411\u0414 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u0434\u043b\u044f DML \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u0414\u0430\u043d\u043d\u044b\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 (\u0432 \u0411\u0414 Oracle \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b). \u041f\u043e\u0442\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e API, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<br \/>  \u042d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043c\u0430\u0441\u0441\u043e\u0432\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435\u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0435, \u0442\u043e \u043f\u0440\u043e\u0449\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e 1, 2 \u0438 3 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 JSON \u0441\u0445\u0435\u043c\u044b.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432 3 \u0447\u0430\u0441\u0442\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0431\u0443\u0434\u0443\u0442 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 1, 2 \u0438 3 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/github.com\/go-playground\/validator\/tree\/v10.2.0\" rel=\"nofollow\">gopkg.in\/go-playground\/validator<\/a>.<br \/>  \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 4 \u0443\u0440\u043e\u0432\u043d\u044f \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u043e \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u0438 \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u0430\u043c (PK, UK).<br \/>  \u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a 5 \u0438 6 \u0443\u0440\u043e\u0432\u043d\u044f \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043c\u0435\u0441\u0442\u0430 \u0434\u043b\u044f \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<h3 id=\"23-pul-obektov-modeli\">2.3. \u041f\u0443\u043b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438<\/h3>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u0430\u044f \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u0441\u0445\u0435\u043c\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f REST API (JSON-&gt;Model-&gt;DB) \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440). \u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f, \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u0411\u0414, \u043f\u0430\u0440\u0441\u044f\u0442\u0441\u044f \u0432 JSON \u0438 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f. \u041f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a API, \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043d\u0430 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430 (GC). \u042d\u0442\u043e \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0435\u0437\u043a\u043e\u0435 \u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 (\u0434\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b GC).<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u0438\u043d \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 GC \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e <a href=\"https:\/\/golang.org\/src\/sync\/pool.go\" rel=\"nofollow\">sync.Pool<\/a>. \u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439. \u041a\u043e\u0433\u0434\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u2014 \u043a\u043b\u0430\u0434\u0435\u043c \u0435\u0433\u043e \u0432 sync.Pool.<br \/>  \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u2014 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a sync.Pool, \u0435\u0441\u043b\u0438 \u0442\u0430\u043c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043d\u0430 \u043d\u0435\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0443\u043b\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e sync.Pool \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/li>\n<li>\u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u0437 \u043f\u0443\u043b\u0430 \u2014 \u043f\u043e\u0441\u043b\u0435 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043e\u0447\u0438\u0441\u0442\u043a\u0443<\/li>\n<li>\u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u043f\u0443\u043b<\/li>\n<li>\u043e\u0447\u0438\u0441\u0442\u043a\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u2014 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0432 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/blob\/master\/model\/model_pool.go\" rel=\"nofollow\">\u043f\u0443\u043b\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 Dept<\/a><\/p>\n<p>  <\/p>\n<pre><code class=\"go\">\/\/ deptsPool represent depts pooling var deptsPool = sync.Pool{     New: func() interface{} { return new(Dept) }, }  \/\/ GetDept allocates a new struct or grabs a cached one func GetDept() *Dept {     p := deptsPool.Get().(*Dept)     p.Reset()     return p }  \/\/ PutDept return struct to cache func PutDept(p *Dept, isCascad bool) {     if p != nil {         PutEmpSlice(p.Emps, isCascad)         p.Emps = nil         deptsPool.Put(p)     } }  \/\/ Reset reset all fields in structure - use for sync.Pool func (p *Dept) Reset() {     p.Deptno = 0     p.Dname = &quot;&quot;     p.Loc.String = &quot;&quot;     p.Loc.Valid = false     if p.Emps != nil {         EmpSlice(p.Emps).Reset()     }     p.Emps = nil } <\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0443\u043b\u0430 \u0441\u0440\u0435\u0437\u043e\u0432 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0443\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u043e\u0431\u043d\u0443\u043b\u044f\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0440\u0435\u0437\u0430<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">\/\/EmpSlice represent slice of Emps type EmpSlice []*Emp  \/\/ PutEmpSlice return struct to cache func PutEmpSlice(p EmpSlice) {     if p != nil {         for i := range p {             p[i] = nil \/\/ \u0447\u0442\u043e \u0431\u044b \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u0432\u0438\u0441\u0448\u0438\u0445 \u0441\u0441\u044b\u043b\u043e\u043a         }         p = p[:0] \/\/ \u0441\u0431\u0440\u043e\u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0441\u0440\u0435\u0437\u0430         empSlicePool.Put(p)     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u043c\u0435\u0440\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438, \u0447\u0442\u043e \u043f\u0440\u0438 \u0438\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435, \u043d\u0430 1000000 Get \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0431\u044b\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 500 \u043d\u043e\u0432\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0438\u0437 \u043f\u0443\u043b\u0430.<br \/>  \u041d\u0443\u0436\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u0432 \u0432\u0438\u0434\u0443, \u0447\u0442\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 sync.Pool \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0437\u0430\u0442\u0440\u0430\u0442 CPU, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0438 \u0440\u0435\u0434\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 sync.Pool \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e.<br \/>  \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b dept \u0438 emp \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0435 \u0438 \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u0441\u0442\u043e\u044f\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0434\u0438 \u043d\u0438\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u043b. <\/p>\n<p>  <\/p>\n<h3 id=\"24-marshal--unmarshal-modeli-v-json\">2.4. Marshal \/ Unmarshal \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 JSON<\/h3>\n<p>  <\/p>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 encoding\/json \u043d\u0435 \u0441\u043b\u0430\u0432\u0438\u0442\u0441\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e.<br \/>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b \u0434\u0432\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/francoispqt\/gojay\" rel=\"nofollow\">github.com\/francoispqt\/gojay<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/mailru\/easyjson\" rel=\"nofollow\">github.com\/mailru\/easyjson<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u0430\u0432\u0442\u043e\u0440\u043e\u0432 \u0435\u0441\u0442\u044c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f. \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432 \u0446\u0435\u043b\u043e\u043c \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c\u0430\u044f.<br \/>  \u0418\u0437 \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/francoispqt\/gojay\" rel=\"nofollow\">github.com\/francoispqt\/gojay<\/a><br \/> \n<ul>\n<li>\u041e\u0442\u043b\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 NULL \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0438\u0437 \u0411\u0414.<\/li>\n<li>\u041d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 sync.Pool \u0434\u043b\u044f \u0431\u0443\u0444\u0435\u0440\u043e\u0432 \u043f\u0440\u0438 encode. \u0415\u0441\u043b\u0438 \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u043e, \u043e\u0442 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0432 2 \u0440\u0430\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u0435, \u0432 \u043d\u0435\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435, \u0430 \u0441\u0442\u0430\u0440\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f. \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u2014 \u0440\u0430\u0432\u0435\u043d 512 \u0431\u0430\u0439\u0442.<\/li>\n<li>\u041d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 encode JSON.<\/li>\n<\/ul>\n<\/li>\n<li><a href=\"https:\/\/github.com\/mailru\/easyjson\" rel=\"nofollow\">github.com\/mailru\/easyjson<\/a><br \/> \n<ul>\n<li>\u041d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 NULL \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0438\u0437 \u0411\u0414<\/li>\n<li>\u0418\u043c\u0435\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 sync.Pool. \u0420\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 \u0432\u0430\u0440\u044c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0442 512 \u0434\u043e 32768 \u0431\u0430\u0439\u0442 (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f). \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c encode JSON \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430.<\/li>\n<li>\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 encode JSON<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/github.com\/mailru\/easyjson\" rel=\"nofollow\">github.com\/mailru\/easyjson<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u044f\u0434\u043e\u043c \u0441 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0443\u0436\u043d\u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c\/\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 JSON \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">\/\/easyjson:json type Dept struct {     Deptno int         `db:&quot;deptno&quot; json:&quot;deptNumber&quot; validate:&quot;required&quot;`     Dname  string      `db:&quot;dname&quot; json:&quot;deptName&quot; validate:&quot;required&quot;`     Loc    null.String `db:&quot;loc&quot; json:&quot;deptLocation,nullempty&quot;`     Emps   []*Emp      `json:&quot;emps,omitempty&quot;` }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b easyjson \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b NULL \u043f\u043e\u043b\u044f \u0438\u0437 \u0411\u0414, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"https:\/\/github.com\/guregu\/null\/tree\/v4.0.0\" rel=\"nofollow\">gopkg.in\/guregu\/null.v4<\/a>. \u041f\u043e\u043b\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c NULL \u0432 \u0411\u0414 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <strong>&quot;Loc null.String&quot;<\/strong> \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0445 <strong>&quot;Loc sql.NullString&quot;<\/strong>.<\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439.<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">easyjson model.go<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Marshal \/ Unmarshal \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435, \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u043e\u043c JSON.<\/p>\n<p>  <\/p>\n<h2 id=\"3-sloy-sqlxx\">3. \u0421\u043b\u043e\u0439 <strong>SQLXX<\/strong><\/h2>\n<p>  <\/p>\n<p>\u0421\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0439 \u0441\u043b\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0411\u0414 <strong>SQLXX<\/strong> \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043f\u0430\u043d\u0438\u043a \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0411\u0414<\/li>\n<li>\u0418\u0437\u043e\u043b\u044f\u0446\u0438\u044e \u043e\u0442 \u0441\u043b\u043e\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0411\u0414<\/li>\n<li>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0411\u0414, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 Listen\/notify \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 PostgreSQL (jackc\/pgx\/stdlib \u0438 lib\/pq)<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u043a \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0411\u0414, \u0442\u043e \u044d\u0442\u043e\u0442 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0432\u0430\u043c \u0432\u0440\u044f\u0434 \u043b\u0438 \u043d\u0443\u0436\u0435\u043d.<br \/>  \u042f \u0435\u0433\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u043b \u0432 \u0448\u0430\u0431\u043b\u043e\u043d, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c, \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043f\u0430\u043d\u0438\u043a \u0438 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 SQL \u043e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u043b\u043e\u0435\u0432.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u0430\u043a\u0435\u0442\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/blob\/master\/sqlxx\/sqlxx.go\" rel=\"nofollow\">httpserver\/sqlxx<\/a> \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0438\u043f\u044b \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <a href=\"https:\/\/github.com\/jmoiron\/sqlx\" rel=\"nofollow\">jmoiron\/sqlx<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">\/\/ DB is a wrapper around sqlx.DB type DB struct {     *sqlx.DB      cfg     *Config     sqlStms SQLStms \/\/ SQL \u043a\u043e\u043c\u0430\u043d\u0434\u044b }  \/\/ Tx is an sqlx wrapper around sqlx.Tx type Tx struct {     *sqlx.Tx }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0430\u044f \u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442, \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0441 \u043c\u0435\u043d\u044c\u0448\u0438\u043c\u0438 \u0437\u0430\u0442\u0440\u0430\u0442\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u0441 \u043f\u0430\u043a\u0435\u0442\u0430 <a href=\"https:\/\/github.com\/jmoiron\/sqlx\" rel=\"nofollow\">jmoiron\/sqlx<\/a>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u043f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/github.com\/jackc\/pgx\" rel=\"nofollow\">jackc\/pgx<\/a>.<\/p>\n<p>  <\/p>\n<h3 id=\"31-obrabotka-oshibok-i-panik\">3.1. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043f\u0430\u043d\u0438\u043a<\/h3>\n<p>  <\/p>\n<p>\u041f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/github.com\/jmoiron\/sqlx\" rel=\"nofollow\">jmoiron\/sqlx<\/a> \u043d\u0430\u043f\u0438\u0447\u043a\u0430\u043d \u043f\u0430\u043d\u0438\u043a\u0430\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044b \u0432\u0441\u0435 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b: <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/blob\/master\/sqlxx\/sqlxx.go\" rel=\"nofollow\">Beginx, Rollback, Commit, Select, Get, Exec<\/a>.<br \/>  \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0430\u043d\u0438\u043a\u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e.<br \/>  \u041f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0435 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043c\u0435\u0441\u0442\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 INFO \u0431\u0435\u0437 trace. \u0412 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043e\u0431\u044b\u0447\u043d\u043e, \u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u044d\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u0438\u043b\u0438 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0432\u044b\u0448\u0435.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">func Commit(reqID uint64, tx *Tx) (myerr error) {     \/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u0430\u043d\u0438\u043a\u0438     defer func() {         r := recover()         if r != nil {             msg := &quot;PostgreSQL recover from panic: commit transaction: reqID&quot;             switch t := r.(type) {             case string:                 myerr = myerror.New(&quot;4008&quot;, msg, reqID, t).PrintfInfo()             case error:                 myerr = myerror.WithCause(&quot;4006&quot;, msg, t, reqID).PrintfInfo()             default:                 myerr = myerror.New(&quot;4006&quot;, msg, reqID).PrintfInfo()             }         }     }()      \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u043b\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438     if tx == nil {         return myerror.New(&quot;4004&quot;, &quot;Transaction is not defined: reqID&quot;, reqID).PrintfInfo()     }      if err := tx.Commit(); err != nil {         return myerror.WithCause(&quot;4008&quot;, &quot;Error commit the transaction: reqID&quot;, err, reqID).PrintfInfo()     }     return nil }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0430 \u044d\u0442\u043e\u043c \u0441\u043b\u043e\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 interface{}, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439, \u043d\u043e \u0438 \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u043d\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">func Select(reqID uint64, tx *Tx, sqlStm *SQLStm, dest interface{}, args ...interface{}) (myerr error) {     if dest != nil &amp;&amp; !reflect.ValueOf(dest).IsNil() {         \/\/ ...     }     return myerror.New(&quot;4400&quot;, &quot;Incorrect call - nil dest interface{} pointer: reqID&quot;, reqID).PrintfInfo() }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f reflect.ValueOf(in).IsNil() \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u0430\u043d\u0438\u043a\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e \u0432\u0441\u0435\u0445 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u043e\u044f \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0430\u043d\u0438\u043a\u0438 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e.<\/p>\n<p>  <\/p>\n<h3 id=\"32-parametry-bd\">3.2. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0411\u0414<\/h3>\n<p>  <\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0436\u0435 \u0441\u043b\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0411\u0414 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043e\u0431\u0449\u0435\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433 \u0444\u0430\u0439\u043b\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">\/\/ Config \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0411\u0414 type Config struct {     ConnectString   string \/\/ \u0441\u0442\u0440\u043e\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0411\u0414     Host            string \/\/ host \u0411\u0414     Port            string \/\/ \u043f\u043e\u0440\u0442 \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440\u0430 \u0411\u0414     Dbname          string \/\/ \u0438\u043c\u044f \u0411\u0414     SslMode         string \/\/ \u0440\u0435\u0436\u0438\u043c SSL     User            string \/\/ \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0411\u0414     Pass            string \/\/ \u043f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f     ConnMaxLifetime int    \/\/ \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445     MaxOpenConns    int    \/\/ \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439     MaxIdleConns    int    \/\/ \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439     DriverName      string \/\/ \u0438\u043c\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 &quot;postgres&quot; | &quot;pgx&quot; | &quot;godror&quot; } <\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"33-rabota-s-sql\">3.3. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 SQL<\/h3>\n<p>  <\/p>\n<p>\u0421\u043b\u043e\u0439 <strong>SQLXX<\/strong> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 SQL \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u0438 interface{}.<br \/>  \u041e\u043d \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0438 \u043e \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0438 \u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 SQL \u043a\u043e\u043c\u0430\u043d\u0434.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u043e\u0435 <strong>SQLXX<\/strong> \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f SQL \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438 \u0445\u044d\u0448 \u0442\u0430\u0431\u043b\u0438\u0446\u0430. \u041c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c SQL \u0438 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0444\u0430\u0439\u043b\u0435, \u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u044f \u043d\u0435 \u0432\u0438\u0436\u0443, \u0430 \u0440\u0438\u0441\u043a \u043e\u0448\u0438\u0431\u043e\u043a \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 (\u043b\u044e\u0431\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 SQL \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f).<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">\/\/ SQLStm represent SQL text and sqlx.Stmt type SQLStm struct {     Text      string     \/\/ \u0442\u0435\u043a\u0441\u0442 SQL \u043a\u043e\u043c\u0430\u043d\u0434\u044b     Stmt      *sqlx.Stmt \/\/ \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u0430\u044f SQL \u043a\u043e\u043c\u0430\u043d\u0434\u0430     IsPrepare bool       \/\/ \u043f\u0440\u0438\u0437\u043d\u0430\u043a, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c SQL \u043a\u043e\u043c\u0430\u043d\u0434\u0443 }  \/\/ SQLStms represent SQLStm map type SQLStms map[string]*SQLStm<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"4-sloy-db\">4. \u0421\u043b\u043e\u0439 <strong>DB<\/strong><\/h2>\n<p>  <\/p>\n<p>\u0421\u043b\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <strong>DB<\/strong> \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0418\u0437\u043e\u043b\u044f\u0446\u0438\u044e \u043e\u0442 \u0441\u043b\u043e\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0411\u0414<\/li>\n<li>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0411\u0414<\/li>\n<li>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u043c\u0438<\/li>\n<li>\u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438<\/li>\n<\/ul>\n<p>  <\/p>\n<h3 id=\"41-podklyuchenie-k-bd-rabota-s-sql\">4.1. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0411\u0414, \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 SQL<\/h3>\n<p>  <\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0438\u043c\u0435\u0442\u044c \u0432 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0411\u0414 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b (\u0431\u0438\u0437\u043d\u0435\u0441-\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438) \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u043b\u044e\u0447\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u044b\u0439 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 (PK) \u2014 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 \u0411\u0414 \u0438\u043b\u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 API. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u043b\u0438 GUID, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0434\u0430\u0436\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0435\u0439, \u0442\u0430\u043a \u043a\u0430\u043a BTree \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438.<\/li>\n<li>\u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 (UK), \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, &quot;\u041d\u043e\u043c\u0435\u0440 \u043e\u0442\u0434\u0435\u043b\u0430&quot;. \u041d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0439 UK \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u0440\u0438 \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438.<\/li>\n<li>\u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0439 (FK) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u044b\u0435 PK. \u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0439 (FK), \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 FK \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e API \u0432 \u0411\u0414. \u041d\u0443\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043d\u0430 \u0432\u0441\u0435 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 FK.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 dept \u0438 emp, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0432 \u0448\u0430\u0431\u043b\u043e\u043d, \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u2014 \u0432 \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445 \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/blob\/master\/db\/db.go\" rel=\"nofollow\">DB<\/a> \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0438 \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0445\u044d\u0448 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 SQL \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438.<br \/>  \u0412\u0441\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 SQL \u0438\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043a\u043b\u044e\u0447\u0430\u043c \u0445\u044d\u0448 \u0442\u0430\u0431\u043b\u0438\u0446\u044b: &quot;GetDept&quot;, &quot;GetDeptUK&quot;, &quot;DeptExists&quot; \u0438 \u0442.\u0434. \u042d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0440\u0438\u0441\u043a \u043e\u0448\u0438\u0431\u043e\u043a \u0432 SQL.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u043c\u043e\u0434\u0435\u043b\u0438, \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e SQL \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u0435\u0439 \u043f\u043e \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u043e\u043c\u0443 PK, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, &quot;GetDept&quot;<\/li>\n<li>\u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u0435\u0439 \u043f\u043e \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u043e\u043c\u0443 UK, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, &quot;GetDeptUK&quot;<\/li>\n<li>\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u043e\u043c\u0443 PK \u0438\u043b\u0438 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u043e\u043c\u0443 UK, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, &quot;DeptExists&quot;<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u0411\u0414, \u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u043e\u0439 View API. \u0417\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u043e\u0439 SQL \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 REST API \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u0440\u043e\u0433\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0437\u0430\u043d\u044f\u0442\u0438\u0435. \u041b\u0443\u0447\u0448\u0435 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u044d\u0442\u043e \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0411\u0414.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">service.SQLStms = map[string]*sql.SQLStm{     &quot;GetDept&quot;:         &amp;sql.SQLStm{&quot;SELECT deptno, dname, loc FROM dept WHERE deptno = $1&quot;, nil, true},     &quot;GetDeptUK&quot;:       &amp;sql.SQLStm{&quot;SELECT deptno, dname, loc FROM dept WHERE deptno = $1&quot;, nil, true},     &quot;DeptExists&quot;:      &amp;sql.SQLStm{&quot;SELECT 1 FROM dept WHERE deptno = $1&quot;, nil, true},     &quot;GetDepts&quot;:        &amp;sql.SQLStm{&quot;SELECT deptno, dname, loc FROM dept&quot;, nil, true},     &quot;GetDeptsPK&quot;:      &amp;sql.SQLStm{&quot;SELECT deptno FROM dept&quot;, nil, true},     &quot;CreateDept&quot;:      &amp;sql.SQLStm{&quot;INSERT INTO dept (deptno, dname, loc) VALUES (:deptno, :dname, :loc)&quot;, nil, false},     &quot;UpdateDept&quot;:      &amp;sql.SQLStm{&quot;UPDATE dept SET dname = :dname, loc = :loc WHERE deptno = :deptno&quot;, nil, false},     &quot;EmpExists&quot;:       &amp;sql.SQLStm{&quot;SELECT 1 FROM emp WHERE empno = $1&quot;, nil, true},     &quot;GetEmp&quot;:          &amp;sql.SQLStm{&quot;SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno FROM emp WHERE empno = $1&quot;, nil, true},     &quot;GetEmpUK&quot;:        &amp;sql.SQLStm{&quot;SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno FROM emp WHERE empno = $1&quot;, nil, true},     &quot;GetEmpsByDept&quot;:   &amp;sql.SQLStm{&quot;SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno FROM emp WHERE deptno = $1&quot;, nil, true},     &quot;GetEmpsPKByDept&quot;: &amp;sql.SQLStm{&quot;SELECT empno FROM emp WHERE deptno = $1&quot;, nil, true},     &quot;CreateEmp&quot;:       &amp;sql.SQLStm{&quot;INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES (:empno, :ename, :job, :mgr, :hiredate, :sal, :comm, :deptno)&quot;, nil, false},     &quot;UpdateEmp&quot;:       &amp;sql.SQLStm{&quot;UPDATE emp SET empno = :empno, ename = :ename, job = :job, mgr = :mgr, hiredate = :hiredate, sal = :sal, comm = :comm, deptno = :deptno WHERE empno = :empno&quot;, nil, false}, }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, SQL \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e &quot;\u043f\u0430\u0440\u0441\u044f\u0442\u0441\u044f&quot;.<\/p>\n<p>  <\/p>\n<h3 id=\"42-realizaciya-interfeysov-modeli-dannyh\">4.2. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/h3>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0430 \u043d\u0430 \u0434\u0432\u0430 \u0441\u043b\u043e\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0441\u043b\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435.<\/li>\n<li>\u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0441\u043b\u043e\u0439 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u043c\u0438 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 \u043c\u043e\u0434\u0435\u043b\u0438.<\/li>\n<\/ul>\n<p>  <\/p>\n<h4 id=\"421-shablon-get-metodov\">4.2.1 \u0428\u0430\u0431\u043b\u043e\u043d Get \u043c\u0435\u0442\u043e\u0434\u043e\u0432<\/h4>\n<p>  <\/p>\n<p>\u0428\u0430\u0431\u043b\u043e\u043d \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0441\u043b\u043e\u044f \u0434\u043b\u044f <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/blob\/master\/db\/db_dept.go\" rel=\"nofollow\">Get<\/a> \u043c\u0435\u0442\u043e\u0434\u0430 \u043a\u0440\u0430\u0439\u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b, \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0443\u0431\u0440\u0430\u043d\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">func (s *Service) getDept(ctx context.Context, tx *mysql.Tx, out *model.Dept) (exists bool, myerr error) {      \/\/ \u0417\u0430\u043f\u0440\u043e\u0441\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442     if exists, myerr = s.db.Get(reqID, tx, &quot;GetDept&quot;, out, out.Deptno); myerr != nil {         return false, myerr     }      \/\/ \u0417\u0430\u043f\u0440\u043e\u0441\u0438\u043c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b     if exists {         outEmps := model.GetEmpSlice() \/\/ \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043c \u0438\u0437 pool \u0441\u0440\u0435\u0437 \u0434\u043b\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432         if myerr = s.getEmpsByDept(ctx, tx, out, &amp;outEmps); myerr != nil {             return false, myerr         }         out.Emps = outEmps \/\/ \u0412\u0441\u0442\u0440\u043e\u0438\u043c \u0441\u0440\u0435\u0437 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442     }      return exists, nil }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0441\u043b\u043e\u0439 \u0434\u043b\u044f <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/blob\/master\/db\/db_dept.go\" rel=\"nofollow\">Get<\/a> \u043c\u0435\u0442\u043e\u0434\u0430 \u0435\u0449\u0435 \u043f\u0440\u043e\u0449\u0435.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">func (s *Service) GetDept(ctx context.Context, out *model.Dept) (exists bool, myerr error) {     return s.getDept(ctx, nil, out) }<\/code><\/pre>\n<p>  <\/p>\n<h4 id=\"422-shablon-create-metodov\">4.2.2 \u0428\u0430\u0431\u043b\u043e\u043d Create \u043c\u0435\u0442\u043e\u0434\u043e\u0432<\/h4>\n<p>  <\/p>\n<p>\u0428\u0430\u0431\u043b\u043e\u043d \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0441\u043b\u043e\u044f \u0434\u043b\u044f <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/blob\/master\/db\/db_dept.go\" rel=\"nofollow\">Create<\/a> \u043c\u0435\u0442\u043e\u0434\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0448\u0430\u0433\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0443\u043b\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <strong>newDept<\/strong>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f <strong>model.GetDept()<\/strong>. \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0435, \u0442\u043e \u0434\u0435\u0448\u0435\u0432\u043b\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u0438\u0445 \u0432 \u0441\u0442\u0435\u043a\u0435 \u0432 \u0432\u0438\u0434\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.<\/li>\n<li>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u0443\u0436\u0435 \u0442\u0430\u043a\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0432 \u0411\u0414. \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043b\u0443\u0447\u0448\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u043e \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043a\u043b\u044e\u0447\u0443 UK (\u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 Dept \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u043c).<br \/> \n<ul>\n<li>\u0432 \u0432\u044b\u0437\u043e\u0432\u0435 <strong>Get(reqID, tx, &quot;DeptExists&quot;, &amp;foo, in.Deptno)<\/strong>, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u2014 \u044d\u0442\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u044b UK. \u041e\u043d\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a <strong>args &#8230;interface{}<\/strong>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432.<\/li>\n<li>\u0435\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u2014 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0448\u0438\u0431\u043a\u0430. \u041d\u0435\u044f\u0432\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0435 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442\u0441\u044f.<\/li>\n<\/ul>\n<\/li>\n<li>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u043e\u0433\u043e PK<br \/> \n<ul>\n<li>\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a. \u0411\u043e\u043b\u044c\u0448\u0435 \u0434\u043b\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u0430\u0445\u043e\u0432\u043a\u0438, \u0435\u0441\u043b\u0438 SQL \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0435 \u0432\u0435\u0440\u043d\u043e \u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \/ \u043e\u0431\u043d\u043e\u0432\u0438\u0442 \u0431\u043e\u043b\u0435\u0435 1 \u0441\u0442\u0440\u043e\u043a\u0438. \u0428\u0430\u0431\u043b\u043e\u043d \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430 \u044d\u0442\u043e\u043c \u0441\u043b\u043e\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443.<\/li>\n<li>\u0435\u0441\u043b\u0438 \u0432 \u0411\u0414 \u0435\u0441\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0435 API, \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0435\u043d\u044f\u044e\u0442 \/ \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u043e\u0433\u043e PK, \u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f, \u043e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0411\u0414 <strong>Get(reqID, tx, &quot;GetDeptUK&quot;, newDept, in.Deptno)<\/strong> \u043f\u043e \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u043e\u043c\u0443 UK.<\/li>\n<\/ul>\n<\/li>\n<li>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<br \/> \n<ul>\n<li>\u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u0446\u0438\u043a\u043b\u043e\u043c \u043f\u043e \u0432\u0441\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043a\u043b\u044e\u0447\u0430 FK <strong>newEmp.Deptno = null.Int{sql.NullInt64{int64(newDept.Deptno), true}}<\/strong> \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0434\u043e\u0431\u044a\u0435\u043a\u0442\u0430 <strong>createEmp(ctx, tx, newEmp, nil)<\/strong>.<\/li>\n<li>\u0428\u0430\u0431\u043b\u043e\u043d \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0442\u0430\u043a \u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443.<\/li>\n<\/ul>\n<\/li>\n<li>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u043b\u043e\u043a \u2014 \u044d\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414 \u043f\u043e \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u043e\u043c\u0443 PK<br \/> \n<ul>\n<li>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u2014 \u043d\u0430 \u0441\u043b\u043e\u0435 JSON \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0438 \u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0411\u0414 \u0434\u0430\u043d\u043d\u044b\u0435.<\/li>\n<li>\u0442\u0430\u043a \u0436\u0435 \u0443\u0434\u043e\u0431\u043d\u043e \u0432 \u0445\u043e\u0434\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u0442\u0435\u043b\u0435 HTTP \u043e\u0442\u0432\u0435\u0442\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0432 \u0411\u0414 \u0434\u0430\u043d\u043d\u044b\u0435.<\/li>\n<li>\u0434\u043b\u044f \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u043e\u0439 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u043b\u0443\u0447\u0448\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c nil \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 out.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"go\">func (s *Service) createDept(ctx context.Context, tx *mysql.Tx, in *model.Dept, out *model.Dept) (myerr error) {      newDept := model.GetDept()         \/\/ \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043c \u0438\u0437 pool \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0432 \u0411\u0414     defer model.PutDept(newDept, true) \/\/ \u0412\u0435\u0440\u043d\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 pool      { \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043f\u043e \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043a\u043b\u044e\u0447\u0443 UK         var foo int         exists, myerr := s.db.Get(reqID, tx, &quot;DeptExists&quot;, &amp;foo, in.Deptno)         if myerr != nil {             return myerr         }         if exists {             return myerror.New(&quot;4004&quot;, &quot;Error create - row already exists: reqID, Deptno&quot;, reqID, in.Deptno).PrintfInfo()         }     } \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043f\u043e \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043a\u043b\u044e\u0447\u0443 UK      { \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0432\u0441\u0442\u0430\u0432\u043a\u0443 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u043e\u0433\u043e PK         rows, myerr := s.db.Exec(reqID, tx, &quot;CreateDept&quot;, in)         if myerr != nil {             return myerr         }         \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a         if rows != 1 {             return myerror.New(&quot;4004&quot;, &quot;Error create: reqID, Deptno, rows&quot;, reqID, in.Deptno, rows).PrintfInfo()         }          \/\/ \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 - \u0432 \u0411\u0414 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0442\u044c \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0435\u043d\u044f\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435         \/\/ \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e UK, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u044b\u0439 PK \u043c\u044b \u0435\u0449\u0435 \u043d\u0435 \u0437\u043d\u0430\u0435\u043c         exists, myerr := s.db.Get(reqID, tx, &quot;GetDeptUK&quot;, newDept, in.Deptno)         if myerr != nil {             return myerr         }         if !exists {             return myerror.New(&quot;4004&quot;, &quot;Row does not exists after creating: reqID, Deptno&quot;, reqID, in.Deptno).PrintfInfo()         }     } \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0432\u0441\u0442\u0430\u0432\u043a\u0443 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u043e\u0433\u043e PK      { \/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438         if in.Emps != nil {             for _, newEmp := range in.Emps {                 \/\/ \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u044b\u0439 PK \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043a\u043b\u044e\u0447 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430                 newEmp.Deptno = null.Int{sql.NullInt64{int64(newDept.Deptno), true}}                  \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b                 if myerr = s.createEmp(ctx, tx, newEmp, nil); myerr != nil {                     return myerr                 }             }         }     } \/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438      \/\/ \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u0437 \u0411\u0414     if out != nil {         out.Deptno = newDept.Deptno \/\/ \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 PK         exists, myerr := s.getDept(ctx, tx, out)         if myerr != nil {             return myerr         }         \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e API         if !exists {             return myerror.New(&quot;4004&quot;, &quot;Row does not exists after updating: reqID, PK&quot;, reqID, in.Deptno).PrintfInfo()         }     }     return nil }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0441\u043b\u043e\u0439 \u0434\u043b\u044f <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/blob\/master\/db\/db_dept.go\" rel=\"nofollow\">Create<\/a> \u043c\u0435\u0442\u043e\u0434\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0448\u0430\u0433\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/li>\n<li>\u0432\u044b\u0437\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0441\u043b\u043e\u044f<\/li>\n<li>rollback \u0438\u043b\u0438 commit \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"go\">func (s *Service) CreateDept(ctx context.Context, in *model.Dept, out *model.Dept) (myerr error) {     var tx *mysql.Tx     reqID := myctx.FromContextRequestID(ctx) \/\/ RequestID \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 context      \/\/ \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e     if tx, myerr = s.db.Beginx(reqID); myerr != nil {         return myerr     }      \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438     if myerr = s.createDept(ctx, tx, in, out); myerr != nil {         _ = s.db.Rollback(reqID, tx)         return myerr     }      \/\/ \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e     return s.db.Commit(reqID, tx) }<\/code><\/pre>\n<p>  <\/p>\n<h4 id=\"423-shablon-update-metodov\">4.2.3 \u0428\u0430\u0431\u043b\u043e\u043d Update \u043c\u0435\u0442\u043e\u0434\u043e\u0432<\/h4>\n<p>  <\/p>\n<p>\u0428\u0430\u0431\u043b\u043e\u043d \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0441\u043b\u043e\u044f \u0434\u043b\u044f <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/blob\/master\/db\/db_dept.go\" rel=\"nofollow\">Update<\/a> \u043c\u0435\u0442\u043e\u0434\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0448\u0430\u0433\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0443\u043b\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 <strong>oldDept<\/strong> \u0438 <strong>newDept<\/strong>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0430\u0440\u044b\u0435 \u0438 \u043d\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u0437 \u0411\u0414.<\/li>\n<li>\u0421\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0438\u0437 \u0411\u0414 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u043c\u0443 \u043a\u043b\u044e\u0447\u0443 PK.<br \/> \n<ul>\n<li>\u0435\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u2014 \u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430. \u041d\u0435\u044f\u0432\u043d\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0435 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442\u0441\u044f.<\/li>\n<\/ul>\n<\/li>\n<li>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0442\u0430\u0440\u044b\u0445 \u0438 \u043d\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432<br \/> \n<ul>\n<li>\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u043e\u0434\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u0411\u0414 \u0438 \u0432\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435. \u0415\u0441\u043b\u0438 \u0432 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0435 \u0432\u0441\u0435 \u043f\u043e\u0434\u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0442\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0411\u0414 \u043d\u0435\u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435.<\/li>\n<li>\u0435\u0441\u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0439 UK, \u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 UK.<\/li>\n<\/ul>\n<\/li>\n<li>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430<br \/> \n<ul>\n<li>\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a. \u0411\u043e\u043b\u044c\u0448\u0435 \u0434\u043b\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u0430\u0445\u043e\u0432\u043a\u0438, \u0435\u0441\u043b\u0438 SQL \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0435 \u0432\u0435\u0440\u043d\u043e \u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442 \u0431\u043e\u043b\u0435\u0435 1 \u0441\u0442\u0440\u043e\u043a\u0438.<\/li>\n<li>\u0435\u0441\u043b\u0438 \u0432 \u0411\u0414 \u0435\u0441\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0435 API, \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0435\u043d\u044f\u044e\u0442 \/ \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f, \u043e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0411\u0414 \u043f\u043e \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u043e\u043c\u0443 P\u041a <strong>Get(reqID, tx, &quot;GetDept&quot;, newDept, in.Deptno)<\/strong>.<\/li>\n<\/ul>\n<\/li>\n<li>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<br \/> \n<ul>\n<li>\u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u0446\u0438\u043a\u043b\u043e\u043c \u043f\u043e \u0432\u0441\u0435\u043c \u043f\u043e\u0434\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043a\u043b\u044e\u0447\u0430 FK \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0434\u043e\u0431\u044a\u0435\u043a\u0442\u0430 <strong>updateEmp(ctx, tx, inEmp, nil)<\/strong>.<\/li>\n<li>\u0435\u0441\u043b\u0438 \u043f\u043e\u0434\u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0435\u0433\u043e<\/li>\n<\/ul>\n<\/li>\n<li>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u043b\u043e\u043a \u2014 \u044d\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414 \u043f\u043e \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u043e\u043c\u0443 PK<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"go\">func (s *Service) updateDept(ctx context.Context, tx *mysql.Tx, in *model.Dept, out *model.Dept) (exists bool, myerr error) {      oldDept := model.GetDept()         \/\/ \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043c \u0438\u0437 pool \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0432 \u0411\u0414     defer model.PutDept(oldDept, true) \/\/ \u0412\u0435\u0440\u043d\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 pool      newDept := model.GetDept()         \/\/ \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043c \u0438\u0437 pool \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0432 \u0411\u0414     defer model.PutDept(newDept, true) \/\/ \u0412\u0435\u0440\u043d\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 pool      { \/\/ \u0421\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0435\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435         oldDept.Deptno = in.Deptno \/\/ \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 PK         if exists, myerr = s.getDept(ctx, tx, oldDept); myerr != nil {             return false, myerr         }         if !exists {             mylog.PrintfDebugMsg(&quot;Row does not exists: reqID, PK&quot;, reqID, in.Deptno)             return false, nil         }     } \/\/ \u0421\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0435\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435      { \/\/ \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \/ \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0442\u0430\u0440\u044b\u0445 \u0438 \u043d\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432         \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 UK         \/\/ \u0434\u043b\u044f Dept PK \u0438 UK \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 - \u044d\u0442\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430         if oldDept.Deptno != in.Deptno {             var foo int             exists, myerr := s.db.Get(reqID, tx, &quot;DeptExists&quot;, &amp;foo, in.Deptno)             if myerr != nil {                 return false, myerr             }             if exists {                 return false, myerror.New(&quot;4004&quot;, &quot;Error update - row with UK already exists: reqID, Deptno&quot;, reqID, in.Deptno).PrintfInfo()             }         }     } \/\/ \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \/ \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0442\u0430\u0440\u044b\u0445 \u0438 \u043d\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432      { \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435         rows, myerr := s.db.Exec(reqID, tx, &quot;UpdateDept&quot;, in)         if myerr != nil {             return false, myerr         }         \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a         if rows != 1 {             return false, myerror.New(&quot;4004&quot;, &quot;Error update: reqID, Deptno, rows&quot;, reqID, in.Deptno, rows).PrintfInfo()         }          \/\/ \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 - \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u043e\u043c\u0443 PK         exists, myerr := s.db.Get(reqID, tx, &quot;GetDept&quot;, newDept, in.Deptno)         if myerr != nil {             return false, myerr         }         if !exists {             return false, myerror.New(&quot;4004&quot;, &quot;Row does not exists after creating: reqID, PK&quot;, reqID, in.Deptno).PrintfInfo()         }     } \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435      { \/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438         if in.Emps != nil {             for _, inEmp := range in.Emps {                 \/\/ \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u044b\u0439 PK \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043a\u043b\u044e\u0447 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430                 inEmp.Deptno = null.Int{sql.NullInt64{int64(in.Deptno), true}}                  \/\/ \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b                 if exists, myerr = s.updateEmp(ctx, tx, inEmp, nil); myerr != nil {                     return false, myerr                 }                 \/\/ \u0415\u0441\u043b\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 - \u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0435\u0433\u043e                 if !exists {                     if myerr = s.createEmp(ctx, tx, inEmp, nil); myerr != nil {                         return false, myerr                     }                 }             }         }     } \/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438      \/\/ \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u0437 \u0411\u0414     if out != nil {         out.Deptno = in.Deptno \/\/ \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 PK         if exists, myerr = s.getDept(ctx, tx, out); myerr != nil {             return false, myerr         }         \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e API         if !exists {             return false, myerror.New(&quot;4004&quot;, &quot;Row does not exists after updating: reqID, PK&quot;, reqID, in.Deptno).PrintfInfo()         }     }     return true, nil }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0441\u043b\u043e\u0439 \u0434\u043b\u044f <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/blob\/master\/db\/db_dept.go\" rel=\"nofollow\">Update<\/a> \u043c\u0435\u0442\u043e\u0434\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0448\u0430\u0433\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/li>\n<li>\u0432\u044b\u0437\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0441\u043b\u043e\u044f<\/li>\n<li>rollback \u0438\u043b\u0438 commit \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/li>\n<li>\u0435\u0441\u043b\u0438 \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u043d\u0435 \u043d\u0430\u0448\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0442\u043e <strong>exists = false<\/strong><\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"go\">func (s *Service) UpdateDept(ctx context.Context, in *model.Dept, out *model.Dept) (exists bool, myerr error) {     var tx *mysql.Tx     reqID := myctx.FromContextRequestID(ctx) \/\/ RequestID \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 context      \/\/ \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e     if tx, myerr = s.db.Beginx(reqID); myerr != nil {         return false, myerr     }      \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438     if exists, myerr = s.updateDept(ctx, tx, in, out); myerr != nil {         _ = s.db.Rollback(reqID, tx)         return false, myerr     }      \/\/ \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0435 \u0431\u044b\u043b \u043d\u0430\u0439\u0434\u0435\u043d \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438, \u0442\u043e \u043e\u0442\u043a\u0430\u0442     if !exists {         _ = s.db.Rollback(reqID, tx)         return false, nil     }      \/\/ \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e     if myerr = s.db.Commit(reqID, tx); myerr != nil {         return false, myerr     }     return exists, nil }<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"43-keshirovanie-dannyh-v-pamyati\">4.3 \u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438<\/h3>\n<p>  <\/p>\n<p>\u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c, \u0435\u0441\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414 \u0438 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0411\u0414 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0438 \u0434\u0435\u0448\u0435\u0432\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u041a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c\u0443 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0443 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438 \u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u044d\u0448\u0435. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043e\u0434\u0438\u043d backend \u0443\u0437\u0435\u043b, \u0442\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0435\u0433\u043a\u043e. \u041d\u043e \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \/ \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0442\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b.<\/p>\n<p>  <\/p>\n<p>\u0412 3 \u0447\u0430\u0441\u0442\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/github.com\/dgraph-io\/ristretto\" rel=\"nofollow\">dgraph-io\/ristretto<\/a>. \u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0411\u0414 PostgreSQL \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c listen\/notify.<\/p>\n<p>  <\/p>\n<h2 id=\"5-sloy-json\">5. \u0421\u043b\u043e\u0439 <strong>JSON<\/strong><\/h2>\n<p>  <\/p>\n<p>\u0421\u043b\u043e\u0439 <strong>JSON<\/strong> \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0420\u0430\u0431\u043e\u0442\u0443 \u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n<li>Marshal \/ Unmarshal JSON<\/li>\n<li>\u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 JSON<\/li>\n<\/ul>\n<p>  <\/p>\n<p><a href=\"https:\/\/github.com\/romapres2010\/httpserver\/tree\/master\/json\" rel=\"nofollow\">JSON<\/a> \u0441\u043b\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/blob\/master\/model\/model_service.go\" rel=\"nofollow\">\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/a>. \u041e\u043d \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0432\u044f\u0437\u0430\u043d \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0411\u0414 (\u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0438\u043b\u0438 \u043d\u0435\u0442). <\/p>\n<p>  <\/p>\n<p>\u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0441\u043b\u043e\u0439 JSON \u043e\u0442\u0432\u044f\u0437\u0430\u043d \u043e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0438 HTTP. \u041e\u043d \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u0438 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438, \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c\u0438 \u0438 \u0442\u0435\u043b\u043e\u043c. \u041e\u043d \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u043e\u043b\u044c \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0431\u0443\u0444\u0435\u0440\u0430\u043c\u0438 []byte, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 JSON.<\/p>\n<p>  <\/p>\n<h3 id=\"51-marshal-json\">5.1. Marshal JSON<\/h3>\n<p>  <\/p>\n<p>\u0414\u043b\u044f encode \u0432 JSON \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u0430 <a href=\"https:\/\/github.com\/mailru\/easyjson\" rel=\"nofollow\">github.com\/mailru\/easyjson<\/a> \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0447\u0435\u0440\u0435\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 encode \u0432 JSON \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 Dept:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440 \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043b\u043e\u0435 <strong>HTTP<\/strong> \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043b\u043e\u0439 <strong>JSON<\/strong> \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <strong>buf []byte<\/strong><\/li>\n<li>\u0435\u0441\u043b\u0438 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0442\u043e \u043c\u0435\u0442\u043e\u0434 <strong>w.Buffer.BuildBytes(buf)<\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0435\u0433\u043e, \u0438\u043d\u0430\u0447\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d \u043d\u043e\u0432\u044b\u0439 \u0431\u0443\u0444\u0435\u0440<\/li>\n<li>\u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0431\u0443\u0444\u0435\u0440\u043d\u044b\u043c \u043f\u0443\u043b\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043f\u0440\u043e \u0441\u043b\u043e\u0439 <strong>HTTP<\/strong> <\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"go\">func deptMarshal(reqID uint64, v *model.Dept, buf []byte) (outBuf []byte, myerr error) {     w := jwriter.Writer{} \/\/ \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c EasyJSON Writer     v.MarshalEasyJSON(&amp;w) \/\/ \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c JSON \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440 EasyJSON Writer      if w.Error != nil {         return nil, myerror.WithCause(&quot;6001&quot;, &quot;Error Marshal: reqID&quot;, w.Error, reqID).PrintfInfo(1)     }      \/\/ \u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0438\u0437 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 EasyJSON Writer \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440     return w.Buffer.BuildBytes(buf), nil     }<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"52-unmarshal-json\">5.2. Unmarshal JSON<\/h3>\n<p>  <\/p>\n<p>Decode \u0438\u0437 JSON \u0435\u0449\u0435 \u043f\u0440\u043e\u0449\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">if err := vIn.UnmarshalJSON(inBuf); err != nil {     return 0, nil, myerror.WithCause(&quot;6001&quot;, &quot;Error Unmarshal: reqID, buf&quot;, err, reqID, string(inBuf)).PrintfInfo() }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u0445\u0438\u0442\u0440\u043e\u0441\u0442\u044c. \u041f\u043e\u0441\u043b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f <strong>mailru\/easyjson<\/strong> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0443\u043a\u0430\u043c\u0438 \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0435 \u0437\u0430 <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/blob\/master\/model\/model_easyjson.go\" rel=\"nofollow\">decode<\/a> \u0432 \u043c\u0435\u0441\u0442\u0430\u0445, \u0433\u0434\u0435 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u0434\u043b\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0441\u0440\u0435\u0437\u043e\u0432. \u0412\u043c\u0435\u0441\u0442\u043e \u044f\u0432\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 <strong>make<\/strong> \u0438 <strong>new<\/strong>, \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c &quot;\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435&quot; \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0443\u043b\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438.<br \/>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c <strong>out.Emps = make([]*Emp, 0, 8)<\/strong> \u043d\u0430 <strong>out.Emps = []*Emp(GetEmpSlice())<\/strong><\/li>\n<li>\u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c <strong>v1 = new(Emp)<\/strong> \u043d\u0430 <strong>v1 = GetEmp()<\/strong><\/li>\n<\/ul>\n<p>  <\/p>\n<h3 id=\"53-rabota-s-interfeysnymi-metodami-modeli-dannyh\">5.3. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/h3>\n<p>  <\/p>\n<h4 id=\"531-scenariy-get\">5.3.1. \u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 Get<\/h4>\n<p>  <\/p>\n<p>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 Get \u043a\u0440\u0430\u0439\u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b: <strong>id<\/strong> \u2014 \u0441\u0443\u0440\u043e\u0433\u0430\u0442\u043d\u044b\u0439 PK, \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, <strong>buf<\/strong> \u2014 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e JSON<\/li>\n<li>\u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b: <strong>outBuf<\/strong> \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0431\u0443\u0444\u0435\u0440 \u0441 JSON (\u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0441 <strong>buf<\/strong>)<\/li>\n<li>\u0441\u043b\u043e\u0439 <strong>JSON<\/strong> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0443\u043b\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438. \u041e\u043d \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b <strong>vOut := model.GetDept()<\/strong> (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 Dept \u2014 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0430 Emp \u2014 \u044d\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u044a\u0435\u043a\u0442) \u043f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0445 \u0432 \u043f\u0443\u043b <strong>defer model.PutDept(vOut, true)<\/strong>. \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u043f\u0443\u043b \u0438 \u0432\u0441\u0435 \u043f\u043e\u0434\u043e\u0431\u044a\u0435\u043a\u0442\u044b.<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"go\">func (s *Service) GetDept(ctx context.Context, id int, buf []byte) (outBuf []byte, myerr error) {      vOut := model.GetDept()         \/\/ \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043c \u0438\u0437 pool \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443     defer model.PutDept(vOut, true) \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0432 pool \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438      vOut.Deptno = id                \/\/ PK \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435      \/\/ \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438     exists, myerr := s.deptService.GetDept(ctx, vOut)     if myerr != nil {         return nil, myerr     }      \/\/ \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c json     if exists {         return deptMarshal(reqID, vOut, buf)     }      return nil, nil \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 - \u043f\u0440\u0438\u0437\u043d\u0430\u043a, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e }<\/code><\/pre>\n<p>  <\/p>\n<h4 id=\"532-scenariy-create\">5.3.2. \u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 Create<\/h4>\n<p>  <\/p>\n<p>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 Create \u043d\u0435\u043c\u043d\u043e\u0433\u0438\u043c \u0441\u043b\u043e\u0436\u043d\u0435\u0435:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u043a \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f <strong>inBuf<\/strong> \u2014 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0431\u0443\u0444\u0435\u0440 \u0441 JSON<\/li>\n<li>\u043a \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f <strong>id<\/strong> \u2014 \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u044b\u0439 PK \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"go\">func (s *Service) CreateDept(ctx context.Context, inBuf []byte, buf []byte) (id int, outBuf []byte, myerr error) {      vIn := model.GetDept()         \/\/ \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043c \u0438\u0437 pool \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443     defer model.PutDept(vIn, true) \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0432 pool \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443      vOut := model.GetDept()         \/\/ \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043c \u0438\u0437 pool \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443     defer model.PutDept(vOut, true) \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0432 pool \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443      \/\/ \u041f\u0430\u0440\u0441\u0438\u043c JSON \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443     if err := vIn.UnmarshalJSON(inBuf); err != nil {         return 0, nil, myerror.WithCause(&quot;6001&quot;, &quot;Error Unmarshal: reqID, buf&quot;, err, reqID, string(inBuf)).PrintfInfo()     }      \/\/ \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438     if myerr = s.deptService.CreateDept(ctx, vIn, vOut); myerr != nil {         return 0, nil, myerr     }      \/\/ \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c json     if outBuf, myerr = deptMarshal(reqID, vOut, buf); myerr != nil {         return 0, nil, myerr     }      return vOut.Deptno, outBuf, myerr }<\/code><\/pre>\n<p>  <\/p>\n<h4 id=\"533-scenariy-update\">5.3.3. \u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 Update<\/h4>\n<p>  <\/p>\n<p>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 Update:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u043a \u0432\u0445\u043e\u0434\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f <strong>id<\/strong> \u2014 \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u044b\u0439 PK \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/li>\n<li>\u043f\u0443\u0441\u0442\u043e\u0439 <strong>outBuf<\/strong> \u0442\u0440\u0430\u043a\u0442\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a NO_DATA_FOUND<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"go\">func (s *Service) UpdateDept(ctx context.Context, id int, inBuf []byte, buf []byte) (outBuf []byte, myerr error) {      vIn := model.GetDept()         \/\/ \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043c \u0438\u0437 pool \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443     defer model.PutDept(vIn, true) \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0432 pool \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443      vOut := model.GetDept()         \/\/ \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043c \u0438\u0437 pool \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443     defer model.PutDept(vOut, true) \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0432 pool \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443      \/\/ \u041f\u0430\u0440\u0441\u0438\u043c JSON \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443     if err := vIn.UnmarshalJSON(inBuf); err != nil {         return nil, myerror.WithCause(&quot;6001&quot;, &quot;Error Unmarshal: reqID, buf&quot;, err, reqID, string(inBuf)).PrintfInfo()     }      \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c ID \u043e\u0431\u044a\u0435\u043a\u0442\u0430     if id != vIn.Deptno {         return nil, myerror.New(&quot;6001&quot;, &quot;Resource ID does not corespond to JSON: resource.id, json.Deptno&quot;, id, vIn.Deptno).PrintfInfo()     }      \/\/ \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438     exists, myerr := s.deptService.UpdateDept(ctx, vIn, vOut)     if myerr != nil {         return nil, myerr     }      \/\/ \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c json     if exists {         return deptMarshal(reqID, vOut, buf)     }      return nil, nil \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 - \u043f\u0440\u0438\u0437\u043d\u0430\u043a, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e }<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"54-keshirovanie-json\">5.4. \u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 JSON<\/h3>\n<p>  <\/p>\n<p>\u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u044d\u0442\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u0430\u0441\u0445\u043e\u0434 \u043f\u0430\u043c\u044f\u0442\u0438<\/li>\n<li>\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c encode \u0432 JSON<\/li>\n<li>\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441 \u0440\u043e\u0441\u0442\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043a\u044d\u0448\u0430.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412 3 \u0447\u0430\u0441\u0442\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 JSON \u0432 <a href=\"https:\/\/pkg.go.dev\/go.etcd.io\/bbolt\" rel=\"nofollow\">go.etcd.io\/bbolt<\/a>. \u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0442\u0430\u043a \u0436\u0435 \u0447\u0435\u0440\u0435\u0437 \u0411\u0414 PostgreSQL \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c listen\/notify.<\/p>\n<p>  <\/p>\n<h2 id=\"6-sloy-http\">6. \u0421\u043b\u043e\u0439 HTTP<\/h2>\n<p>  <\/p>\n<p>\u0421\u043b\u043e\u0439 <strong>HTTP<\/strong> \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/li>\n<li>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c HTTP \u043c\u0435\u0442\u043e\u0434\u0430<\/li>\n<li>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 (basic, MS AD, &#8230;)<\/li>\n<li>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u0438 token (\u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438)<\/li>\n<li>\u0421\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043b\u0430 (body) \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/li>\n<li>\u0421\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 (header) \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/li>\n<li>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u043d\u044b\u043c \u043f\u0443\u043b\u043e\u043c \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u043e\u0432<\/li>\n<li>\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u0430<\/li>\n<li>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 HSTS Strict-Transport-Security<\/li>\n<li>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Content-Type \u0434\u043b\u044f \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 (response)<\/li>\n<li>\u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e HTTP \u043e\u0442\u0432\u0435\u0442\u0430<\/li>\n<li>\u0417\u0430\u043f\u0438\u0441\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 (header) \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430<\/li>\n<li>\u0417\u0430\u043f\u0438\u0441\u044c \u0442\u0435\u043b\u0430 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430<\/li>\n<li>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043e\u043a<\/li>\n<li>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 defer recovery \u0434\u043b\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 panic<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u041f\u043e\u0434\u0445\u043e\u0434\u044b \u043a \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f HTTP \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0431\u044b\u043b\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u043c\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 <strong><a href=\"https:\/\/habr.com\/ru\/post\/489740\/\">\u0423\u043f\u0440\u043e\u0449\u0430\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 HTTP \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043d\u0430 Golang<\/a><\/strong>.<\/p>\n<p>  <\/p>\n<p>\u0418\u0434\u0435\u044f, \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u0432 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u043d\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c defer \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u0430\u043d\u0438\u043a\u0438. \u041d\u0430 UML \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0435 \u2014 \u044d\u0442\u043e \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f RecoverWrap.func1, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u043a\u0440\u0430\u0441\u043d\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c.<\/li>\n<li>\u0432\u0435\u0441\u044c \u0442\u0438\u043f\u043e\u0432\u043e\u0439 \u043a\u043e\u0434 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a <strong><a href=\"https:\/\/github.com\/romapres2010\/httpserver\/blob\/master\/httpserver\/httpservice\/httpservice.go#L185:19\" rel=\"nofollow\">process<\/a><\/strong>. \u042d\u0442\u043e\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0448 HTTP handler. \u041d\u0430 UML \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0435 <strong>process<\/strong> \u2014 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u0441\u0438\u043d\u0438\u043c \u0446\u0432\u0435\u0442\u043e\u043c.<\/li>\n<li>\u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u043e\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u0432\u044b\u043d\u0435\u0441\u0435\u043d \u0432 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u043d\u0430\u0448\u0435\u043c HTTP handler. \u041d\u0430 UML \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0435 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f EchoHandler.func1 \u2014 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u0437\u0435\u043b\u0435\u043d\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u043e\u0434\u0438\u043d \u0442\u0430\u043a\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a <strong>process<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 REST API.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u043e\u0442 \u0440\u0430\u043d\u0435\u0435 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u043a\u043e\u0434 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (\u043d\u0430 \u0441\u0445\u0435\u043c\u0435 \u0437\u0435\u043b\u0435\u043d\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c).<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/6dc\/24a\/733\/6dc24a733891dc197d74603f4a04bb9b.png\" alt=\"http_handler\"><\/p>\n<p>  <\/p>\n<h3 id=\"61-rabota-s-bufernym-pulom\">6.1. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0431\u0443\u0444\u0435\u0440\u043d\u044b\u043c \u043f\u0443\u043b\u043e\u043c<\/h3>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f JSON, <strong>[]byte<\/strong> \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 <strong>http.ResponseWriter<\/strong> \u0438 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f. \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u043e\u043d \u0443\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u043e\u043c \u043c\u0443\u0441\u043e\u0440\u0430 GC. \u0415\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a\u0430\u043a \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430 GC \u0432 \u044d\u0442\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0441\u0440\u0430\u0437\u0443 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043f\u0438\u0441\u0430\u0442\u044c JSON \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0432 <strong>http.ResponseWriter<\/strong><\/li>\n<li>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0443\u0444\u0435\u0440\u043d\u044b\u0439 \u043f\u0443\u043b \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e JSON \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 <strong>http.ResponseWriter<\/strong><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/blob\/master\/bytespool\/bytespool.go\" rel=\"nofollow\">\u0431\u0443\u0444\u0435\u0440\u043d\u044b\u043c \u043f\u0443\u043b\u043e\u043c<\/a> \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u043f\u0443\u043b\u0430, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e <a href=\"https:\/\/golang.org\/src\/sync\/pool.go\" rel=\"nofollow\">sync.Pool<\/a>:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/li>\n<li>\u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u0437 \u043f\u0443\u043b\u0430<\/li>\n<li>\u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u043f\u0443\u043b<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0443\u0444\u0435\u0440\u043d\u043e\u0433\u043e \u043f\u0443\u043b\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">[HTTP_POOL] UseBufPool = true           \/\/ \u043f\u0440\u0438\u0437\u043d\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0443\u0444\u0435\u0440\u043d\u043e\u0433\u043e \u043f\u0443\u043b\u0430 BufPooledSize = 512         \/\/ \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430, \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0438\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0432 \u043f\u0443\u043b\u0435   BufPooledMaxSize = 32768    \/\/ \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0432 \u043f\u0443\u043b\u0435<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u0438\u0437 \u043f\u0443\u043b\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0442\u0438\u043f\u043e\u0432\u043e\u043c <strong><a href=\"https:\/\/github.com\/romapres2010\/httpserver\/blob\/master\/httpserver\/httpservice\/httpservice.go#L258:1\" rel=\"nofollow\">process<\/a><\/strong> \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">var buf []byte if s.cfg.UseBufPool &amp;&amp; s.bytesPool != nil {     buf = s.bytesPool.GetBuf() }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0442\u043e \u043e\u043d \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d, \u0438 \u043f\u0440\u0438 encode \u0432 JSON \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u043d\u043e\u0432\u044b\u0439 \u0431\u0443\u0444\u0435\u0440.<br \/>  \u042d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0431\u0443\u0444\u0435\u0440 \u0441 JSON \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0438 <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/blob\/master\/httpserver\/httpservice\/httpservice.go#L276:1\" rel=\"nofollow\">\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0431\u0443\u0444\u0435\u0440\u043d\u044b\u0439 \u043f\u0443\u043b<\/a>.<br \/>  \u041f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0432 \u0431\u0443\u0444\u0435\u0440\u043d\u043e\u043c \u043f\u0443\u043b\u0435 \u043d\u0430\u0431\u0435\u0440\u0443\u0442\u0441\u044f <strong>[]byte<\/strong> \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">if responseBuf != nil &amp;&amp; s.cfg.UseBufPool &amp;&amp; s.bytesPool != nil {     \/\/ \u0415\u0441\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432 pool     if cap(responseBuf) &gt;= s.cfg.BufPooledSize &amp;&amp; cap(responseBuf) &lt;= s.cfg.BufPooledMaxSize {         defer s.bytesPool.PutBuf(responseBuf)     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u043d\u044f\u0442\u044c \u0432\u0435\u0440\u043d\u0443\u043b\u0441\u044f \u043b\u0438 \u043d\u0430\u043c \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0438\u043b\u0438 \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u043d\u043e\u0432\u044b\u0439, \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439. \u041c\u0435\u0442\u043e\u0434 <strong>Pointer()<\/strong> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 <strong>[]byte<\/strong>.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">if reflect.ValueOf(buf).Pointer() != reflect.ValueOf(responseBuf).Pointer() {     \/\/ ... }<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"62-obrabotchik-get\">6.2. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a GET<\/h3>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u044f \u0442\u0438\u043f\u043e\u0432\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u0430 \u0432 <strong><a href=\"https:\/\/github.com\/romapres2010\/httpserver\/blob\/master\/httpserver\/httpservice\/httpservice.go#L258:1\" rel=\"nofollow\">process<\/a><\/strong>, \u0442\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0438\u0437 URL \u0437\u0430\u043f\u0440\u043e\u0441\u0430 ID \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u2014 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e PK \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/li>\n<li>\u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0441\u043b\u043e\u044f JSON \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430 <strong>jsonService.GetDept(ctx, id, buf)<\/strong>, \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 <strong>buf<\/strong> \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0431\u0443\u0444\u0435\u0440 \u0438\u0437 \u043f\u0443\u043b\u0430 \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430.<\/li>\n<li>\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u0442\u0432\u0435\u0442\u0430. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0449\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043b\u043e\u0433\u0430\u0445, \u0432\u0435\u0437\u0434\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043d\u043e\u043c\u0435\u0440\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 <strong>header[&quot;RequestID&quot;]<\/strong><\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"go\">func (s *Service) GetDeptHandler(w http.ResponseWriter, r *http.Request) {     \/\/ \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0438\u043f\u043e\u0432\u043e\u0439 process, \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c     _ = s.process(&quot;GET&quot;, w, r, func(ctx context.Context, requestBuf []byte, buf []byte) ([]byte, Header, int, error) {         reqID := myctx.FromContextRequestID(ctx) \/\/ RequestID \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 context          \/\/ \u0421\u0447\u0438\u0442\u0430\u0435\u043c PK \u0438\u0437 URL \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043d\u0430 \u0447\u0438\u0441\u043b\u043e         vars := mux.Vars(r)         idStr := vars[&quot;id&quot;]         id, err := strconv.Atoi(idStr)         if err != nil {             return nil, nil, http.StatusBadRequest, myerror.WithCause(&quot;8001&quot;, &quot;Failed to process parameter 'id' invalid number: reqID, id&quot;, err, reqID, idStr).PrintfInfo()         }          \/\/ \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c JSON \u0441\u0435\u0440\u0432\u0438\u0441, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0435\u043c\u0443 \u0431\u0443\u0444\u0435\u0440 \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f         responseBuf, err := s.jsonService.GetDept(ctx, id, buf)         if err != nil {             return nil, nil, http.StatusInternalServerError, err         }          \/\/ \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b         if responseBuf == nil {             return nil, nil, http.StatusNotFound, nil         }          \/\/ \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442         header := Header{}         header[&quot;Content-Type&quot;] = &quot;application\/json; charset=utf-8&quot;         header[&quot;Errcode&quot;] = &quot;0&quot;         header[&quot;RequestID&quot;] = fmt.Sprintf(&quot;%v&quot;, reqID)          return responseBuf, header, http.StatusOK, nil     }) }<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"63-obrabotchik-post\">6.3. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a POST<\/h3>\n<p>  <\/p>\n<p>POST \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0435\u0449\u0435 \u043f\u0440\u043e\u0449\u0435:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f ID \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u2014 PK \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"go\">func (s *Service) CreateDeptHandler(w http.ResponseWriter, r *http.Request) {     \/\/ \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0438\u043f\u043e\u0432\u043e\u0439 process, \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c     _ = s.process(&quot;POST&quot;, w, r, func(ctx context.Context, requestBuf []byte, buf []byte) ([]byte, Header, int, error) {         reqID := myctx.FromContextRequestID(ctx) \/\/ RequestID \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 context          mylog.PrintfDebugMsg(&quot;START: reqID&quot;, reqID)          \/\/ \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c JSON \u0441\u0435\u0440\u0432\u0438\u0441         id, responseBuf, err := s.jsonService.CreateDept(ctx, requestBuf, buf)         if err != nil {             return nil, nil, http.StatusInternalServerError, err         }          \/\/ \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442         header := Header{}         header[&quot;Content-Type&quot;] = &quot;application\/json; charset=utf-8&quot;         header[&quot;Errcode&quot;] = &quot;0&quot;         header[&quot;Id&quot;] = fmt.Sprintf(&quot;%v&quot;, id)         header[&quot;RequestID&quot;] = fmt.Sprintf(&quot;%v&quot;, reqID)          return responseBuf, header, http.StatusOK, nil     })     }<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"64-obrabotchik-put\">6.4. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a PUT<\/h3>\n<p>  <\/p>\n<p>PUT \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0435\u043c\u043d\u043e\u0433\u0438\u043c \u0441\u043b\u043e\u0436\u043d\u0435\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">func (s *Service) UpdateDeptHandler(w http.ResponseWriter, r *http.Request) {     \/\/ \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0438\u043f\u043e\u0432\u043e\u0439 process, \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c     _ = s.process(&quot;PUT&quot;, w, r, func(ctx context.Context, requestBuf []byte, buf []byte) ([]byte, Header, int, error) {         reqID := myctx.FromContextRequestID(ctx) \/\/ RequestID \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 context          mylog.PrintfDebugMsg(&quot;START: reqID&quot;, reqID)          \/\/ \u0421\u0447\u0438\u0442\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043d\u0430 \u0447\u0438\u0441\u043b\u043e         vars := mux.Vars(r)         idStr := vars[&quot;id&quot;]         id, err := strconv.Atoi(idStr)         if err != nil {             return nil, nil, http.StatusBadRequest, myerror.WithCause(&quot;8001&quot;, &quot;Failed to process parameter 'id' invalid number: reqID, id&quot;, err, reqID, idStr).PrintfInfo()         }          \/\/ \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c JSON \u0441\u0435\u0440\u0432\u0438\u0441         responseBuf, err := s.jsonService.UpdateDept(ctx, id, requestBuf, buf)         if err != nil {             return nil, nil, http.StatusInternalServerError, err         }          \/\/ \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b         if responseBuf == nil {             return nil, nil, http.StatusNotFound, nil         }          \/\/ \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442         header := Header{}         header[&quot;Content-Type&quot;] = &quot;application\/json; charset=utf-8&quot;         header[&quot;Errcode&quot;] = &quot;0&quot;         header[&quot;RequestID&quot;] = fmt.Sprintf(&quot;%v&quot;, reqID)          return responseBuf, header, http.StatusOK, nil     }) } <\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"65-registraciya-obrabotchikov\">6.5. \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432<\/h3>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043d\u043e\u0432\u044b\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u0432 <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/blob\/master\/httpserver\/httpservice\/httpservice.go\" rel=\"nofollow\">httpserver\/httpservice<\/a> \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0445\u044d\u0448 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 <strong>Handlers<\/strong>.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">\/\/ Handler represent HTTP handler type Handler struct {     Path        string     HundlerFunc func(http.ResponseWriter, *http.Request)     Method      string }  \/\/ Handlers represent HTTP handlers map type Handlers map[string]Handler<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0445\u044d\u0448 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <strong>httpservice.New<\/strong>. \u0415\u0441\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0430\u043d\u0438\u043a\u0438, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <strong>service.recoverWrap()<\/strong>.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">service.Handlers = map[string]Handler{     \/\/ \u0422\u0438\u043f\u043e\u0432\u044b\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438     &quot;EchoHandler&quot;:         Handler{&quot;\/echo&quot;, service.recoverWrap(service.EchoHandler), &quot;POST&quot;},     &quot;SinginHandler&quot;:       Handler{&quot;\/signin&quot;, service.recoverWrap(service.SinginHandler), &quot;POST&quot;},     &quot;JWTRefreshHandler&quot;:   Handler{&quot;\/refresh&quot;, service.recoverWrap(service.JWTRefreshHandler), &quot;POST&quot;},     &quot;HTTPLogHandler&quot;:      Handler{&quot;\/httplog&quot;, service.recoverWrap(service.HTTPLogHandler), &quot;POST&quot;},     &quot;HTTPErrorLogHandler&quot;: Handler{&quot;\/httperrlog&quot;, service.recoverWrap(service.HTTPErrorLogHandler), &quot;POST&quot;},     &quot;LogLevelHandler&quot;:     Handler{&quot;\/loglevel&quot;, service.recoverWrap(service.LogLevelHandler), &quot;POST&quot;},      \/\/ JSON \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438     &quot;CreateDeptHandler&quot;: Handler{&quot;\/depts&quot;, service.recoverWrap(service.CreateDeptHandler), &quot;POST&quot;},     &quot;GetDeptHandler&quot;:    Handler{&quot;\/depts\/{id:[0-9]+}&quot;, service.recoverWrap(service.GetDeptHandler), &quot;GET&quot;},     &quot;UpdateDeptHandler&quot;: Handler{&quot;\/depts\/{id:[0-9]+}&quot;, service.recoverWrap(service.UpdateDeptHandler), &quot;PUT&quot;}, }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"7-testirovanie-proizvoditelnosti\">7. \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/h2>\n<p>  <\/p>\n<h3 id=\"71-testovyy-stend\">7.1. \u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434<\/h3>\n<p>  <\/p>\n<p>\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434 \u0431\u044b\u043b \u0441\u043e\u0431\u0440\u0430\u043d \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 Oracle \u043d\u0430 3-\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 VM.DenseIO2.8 \u2014 8 Core Intel (16 virtual core), 120 Memory (GB), Oracle Linux 7.7<\/li>\n<li>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 NVMe \u0434\u0438\u0441\u043a\u0438 \u2014 6.4 TB NVMe SSD Storage (1 drives) min 250k IOPS (4k block)<\/li>\n<li>\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0435\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438 \u2014 8.2 Network Bandwidth (Gbps)<\/li>\n<li>\u0411\u0414 \u2014 PostgreSQL 12. \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0411\u0414 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043b\u0430\u0441\u044c.<\/li>\n<li>\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0435\u043b\u043e\u0441\u044c \u0447\u0435\u0440\u0435\u0437 ApacheBench:<br \/> \n<ul>\n<li>concurrency level \u043e\u0442 4 \u0434\u043e 16384<\/li>\n<li>\u043e\u0442 10 000 \u0434\u043e 1 000 000 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/li>\n<li>\u0432 \u0444\u043e\u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u043e\u0441\u044c \u043e\u0442 2 \u0434\u043e 8 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 ApacheBench (\u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 ApacheBench \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 1 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5b9\/840\/4cb\/5b98404cbbb595fc4a79e83d1c613ea3.png\" alt=\"\u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434\"><\/p>\n<p>  <\/p>\n<h3 id=\"72-rezultaty-testirovaniya-get-s-raznymi-vidami-keshirovaniya\">7.2. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f GET \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0432\u0438\u0434\u0430\u043c\u0438 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h3>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/raw.githubusercontent.com\/romapres2010\/httpserver\/master\/doc\/test.json\" rel=\"nofollow\">\u0420\u0430\u0437\u043c\u0435\u0440 JSON<\/a> \u2014 1800 \u0431\u0430\u0439\u0442. \u041e\u0434\u0438\u043d \u043c\u0430\u0441\u0442\u0435\u0440 \u043e\u0431\u044a\u0435\u043a\u0442 Dept \u0438 10 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 Emp.<\/li>\n<li>\u0420\u0430\u0437\u043c\u0435\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b Dept \u2014 33 000 000, \u0442\u0430\u0431\u043b\u0438\u0446\u044b Emp \u2014 330 000 000 \u0441\u0442\u0440\u043e\u043a.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>GET \u0431\u0435\u0437 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043f\u0440\u044f\u043c\u044b\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a PostgreSQL<\/li>\n<li>GET \u0441 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c JSON \u0438\u0437 BBolt (\u0440\u0430\u0437\u043c\u0435\u0440 74 \u0413\u0431\u0430\u0439\u0442)<\/li>\n<li>GET \u0441 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 (\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 map)<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/tree\/master\/cmd\/httpserver\/bench_restapi\/VM.DenseIO2.8%20-%20VM.DenseIO2.8%20(33%20000%20000)\" rel=\"nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>.<br \/>  \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043f\u043e <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/raw\/master\/img\/get_db_memory_json.png\" rel=\"nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a><\/p>\n<p>  <\/p>\n<p>\u0413\u0440\u0430\u0444\u0438\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 Requests per second \u043e\u0442 Concurrency.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c19\/9a3\/571\/c199a35717d719c1f3bbd729cc4583d4.png\" alt=\"get_db_memory_json1\"><\/p>\n<p>  <\/p>\n<p>\u0413\u0440\u0430\u0444\u0438\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 Time per req. [ms] \u043e\u0442 Concurrency (\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0448\u043a\u0430\u043b\u0430).<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d51\/593\/d22\/d51593d225698827addeb4df4bc732a6.png\" alt=\"get_db_memory_json1\"><\/p>\n<p>  <\/p>\n<p>\u0413\u0440\u0430\u0444\u0438\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 99% percentile [ms] \u043e\u0442 Concurrency.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/788\/791\/d6b\/788791d6bfee4cea28ff0a3c78a3b780.png\" alt=\"get_db_memory_json1\"><\/p>\n<p>  <\/p>\n<p>\u0413\u0440\u0430\u0444\u0438\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 99% percentile [ms] \u043e\u0442 Concurrency (\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0448\u043a\u0430\u043b\u0430).<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e0e\/11a\/3c5\/e0e11a3c57b5492f102156574f4b94ca.png\" alt=\"get_db_memory_json1\"><\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 backend \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0440\u0438 100 000 [#\/sec] \u0438 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 BBolt (Concurrency 128). \u0421\u0440\u0435\u0434\u043d\u044f\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0432\u0432\u043e\u0434\u0430 \/ \u0432\u044b\u0432\u043e\u0434\u0430 \u043d\u0430 NVMe \u0434\u0438\u0441\u043a 0,02 [ms] (500 000 IOPS).<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/54e\/48b\/9fd\/54e48b9fd96200a80277701a80207e9a.png\" alt=\"get_db_memory_json1\"><\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/500554\/\"> https:\/\/habr.com\/ru\/post\/500554\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/500554\/\">\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043d\u0438\u0436\u0435 \u0448\u0430\u0431\u043b\u043e\u043d \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430 Golang \u0431\u044b\u043b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0437\u043d\u0430\u043d\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u0430, \u043a\u0440\u043e\u043c\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u2014 \u044d\u0442\u043e \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043d\u0430 Go. <\/p>\n<p>  <\/p>\n<p><strong><a href=\"https:\/\/habr.com\/ru\/post\/492062\/\">\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/a><\/strong> \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0431\u044b\u043b\u0430 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 HTTP \u0441\u0435\u0440\u0432\u0435\u0440\u0443:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 HTTP \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b<\/li>\n<li>\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 TLS HTTP \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/li>\n<li>\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0440\u043e\u0443\u0442\u0435\u0440\u0430 \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f HTTP \u0438 prof-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432<\/li>\n<li>\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f HTTP \u0442\u0440\u0430\u0444\u0438\u043a\u0430, \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043e\u043a \u0432 HTTP<\/li>\n<li>HTTP Basic \u0438 MS AD \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f, JSON Web Token<\/li>\n<li>\u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0432 \u043a\u0430\u043d\u0430\u043b \u043e\u0448\u0438\u0431\u043e\u043a<\/li>\n<li>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/li>\n<li>\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0433\u043e \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/li>\n<li>\u0441\u0431\u043e\u0440\u043a\u0430 \u043a\u043e\u0434\u0430 \u0441 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435\u043c \u0432\u0435\u0440\u0441\u0438\u0438, \u0434\u0430\u0442\u044b \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 commit<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e REST API.<br \/>  \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 <a href=\"https:\/\/github.com\/romapres2010\/httpserver\" rel=\"nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/a> \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u0435\u0436\u043d\u0435\u0439.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5d3\/ec6\/db2\/5d3ec6db2b43d2b01e06665fa558d027.png\" alt=\"\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 REST API\"><\/p>\n<p>  <\/p>\n<p>\u0412 \u0445\u043e\u0434\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043d\u0430 <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/raw\/master\/img\/test_environment.png\" rel=\"nofollow\">\u0441\u0442\u0435\u043d\u0434\u0435<\/a> \u0431\u044b\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 <a href=\"https:\/\/github.com\/romapres2010\/httpserver\/raw\/master\/img\/get_db_memory_json.png\" rel=\"nofollow\">\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b<\/a>.<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u0437 PostgreSQL \u2014 \u0434\u043e 16 000 [get\/sec], \u0441oncurrency 1024, \u043c\u0435\u0434\u0438\u0430\u043d\u0430 60 [ms]. \u041a\u0430\u0436\u0434\u044b Get \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u043e\u0431\u0449\u0438\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 360 000 000 \u0441\u0442\u0440\u043e\u043a. \u0420\u0430\u0437\u043c\u0435\u0440 JSON 1800 \u0431\u0430\u0439\u0442.<\/li>\n<li>\u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u0443 \u0446\u0438\u0444\u0440\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0434\u043e 100 000 \u2014 120 000 [get\/sec], \u0441oncurrency 1024, \u043c\u0435\u0434\u0438\u0430\u043d\u0430 2 [ms]. Transfer rate \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 200-250 [MB\/sec]<\/li>\n<li>\u043d\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0443 \u0432 PostgreSQL \u2014 \u043e\u043a\u043e\u043b\u043e 10 000 [insert\/sec].<\/li>\n<\/ul>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-303632","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/303632","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=303632"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/303632\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=303632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=303632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=303632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}