{"id":497050,"date":"2026-10-02T08:18:08","date_gmt":"2026-10-02T08:18:08","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=497050"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=497050","title":{"rendered":"\u041f\u0440\u043e\u0434\u043e\u0432\u044b\u0439 REPL: Yaegi \u043f\u043e\u0432\u0435\u0440\u0445 composition root"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u042f \u043f\u0440\u0438\u0448\u0451\u043b \u0432 Go \u0438\u0437 Ruby, \u0438 \u043f\u0435\u0440\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 Rails \u0435\u0441\u0442\u044c \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438: \u043a\u043e\u043d\u0441\u043e\u043b\u0438, \u0433\u0434\u0435 \u043b\u044e\u0431\u0443\u044e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u043d\u0430 \u043f\u0440\u043e\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0443\u043a\u0430\u043c\u0438. <code>bundle exec rails c<\/code>, <code>Order.find(42)<\/code>, \u0438 \u043f\u0435\u0440\u0435\u0434 \u0442\u043e\u0431\u043e\u0439 \u043d\u0435 \u0441\u0442\u0440\u043e\u043a\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435, \u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438. \u0412 \u043c\u043e\u0438\u0445 Go-\u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u043d\u0435 \u0431\u044b\u043b\u043e, \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0441\u044f <code>psql<\/code>, \u0438 \u0442\u043e \u0435\u0441\u043b\u0438 \u043e\u043d \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 \u043e\u0431\u0440\u0430\u0437. \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043c\u043e\u0436\u043d\u043e, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0435\u043b\u044c\u0437\u044f. \u0410 \u0432\u043e\u043f\u0440\u043e\u0441 \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u043e\u0439: \u043f\u043e\u0447\u0435\u043c\u0443 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0444\u0438\u0447\u0430 \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u043b\u0430\u0441\u044c, \u0445\u043e\u0442\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0444\u043b\u0430\u0433 \u0441\u0442\u043e\u0438\u0442.<\/p>\n<p><strong>\u0414\u0430\u043b\u0435\u0435<\/strong>: \u0432\u044b\u0431\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 gore \u0438 Yaegi, \u043f\u043e\u0447\u0435\u043c\u0443 \u00ab\u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443\u00bb \u044d\u0442\u043e \u043b\u043e\u0432\u0443\u0448\u043a\u0430, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0430\u043a\u0435\u0442\u044b \u0432 REPL \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f <code>undefined<\/code> \u043f\u0440\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u044e \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0441\u043d\u0435\u0441\u0442\u0438 \u0411\u0414 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435. \u041a\u043e\u0434, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0442\u044c\u044f, \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043b\u0435\u0436\u0438\u0442 \u0432 <a href=\"https:\/\/github.com\/vladimirtcats\/cosy-console\" rel=\"noopener nofollow\">cosy-console<\/a>, \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0438 \u043d\u0438\u0436\u0435 \u044d\u0442\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u043e\u0442\u0442\u0443\u0434\u0430.<\/p>\n<h3>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430<\/h3>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0430 \u0431\u0435\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a. \u041f\u0440\u0438\u043b\u0435\u0442\u0430\u0435\u0442 \u0442\u0438\u043a\u0435\u0442 \u00ab\u0443 \u0437\u0430\u043a\u0430\u0437\u0430 42 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0441\u0442\u0430\u0442\u0443\u0441 \u0441\u0442\u0430\u0442\u0443\u0441\u00bb. \u0414\u0430\u043b\u044c\u0448\u0435:<\/p>\n<pre><code>1. \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0411\u04142. \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0442\u0430\u0442\u0443\u0441, \u0430 \u0432 \u043a\u0430\u043a\u043e\u0439 \u0435\u0433\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u044f3. psql $POSTGRES_URL4. SELECT ... JOIN ... WHERE order_id = 425. \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0446\u0438\u0444\u0440\u044b \u0431\u0435\u0437 \u0431\u0438\u0437\u043d\u0435\u0441-\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430: \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 status = 7?6. \u043f\u043e\u0439\u0442\u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u0434, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c7. \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044e\u0437\u043a\u0435\u0439\u0441: \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439   HTTP-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0438\u043b\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u0430 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0442\u0435\u043d\u0434\u0435,   \u0447\u0442\u043e \u0441\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u043e<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 Rails \u0438\u0445 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u0434\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430:<\/p>\n<pre><code class=\"bash\">$ bundle exec rails c<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<pre><code class=\"ruby\">order = Order.find(42)order.status_label           # \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0447\u0442\u043e \u0437\u0430 \u0441\u0442\u0430\u0442\u0443\u0441PaymentsService.retry(order) # \u0437\u0430\u043f\u0443\u0441\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0425\u043e\u0447\u0435\u0442\u0441\u044f \u0442\u043e\u0433\u043e \u0436\u0435 \u0432 Go. \u0412\u043e\u043f\u0440\u043e\u0441: \u0447\u0435\u043c \u044d\u0442\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c.<\/p>\n<h3>\u0410\u043a\u0442 1: \u0432\u044b\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430<\/h3>\n<p>\u0413\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u00abgo repl\u00bb \u0434\u0430\u0451\u0442 \u0434\u0432\u0443\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432: <a href=\"https:\/\/github.com\/x-motemen\/gore\" rel=\"noopener nofollow\">gore<\/a> \u0438 <a href=\"https:\/\/github.com\/traefik\/yaegi\" rel=\"noopener nofollow\">Yaegi<\/a>. \u0421 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0432\u0437\u0433\u043b\u044f\u0434\u0430 \u043e\u0431\u0430 \u00abREPL \u0434\u043b\u044f Go\u00bb, \u043d\u043e \u043e\u043d\u0438 \u0440\u0435\u0448\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0438 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0440\u0435\u0448\u0430\u044e\u0449\u0430\u044f.<\/p>\n<h4>gore: \u043f\u0440\u043e \u044f\u0437\u044b\u043a, \u0430 \u043d\u0435 \u043f\u0440\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/h4>\n<p>gore \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Go-REPL: \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u0436\u0434\u0451\u0442 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0438\u0445 \u0447\u0435\u0440\u0435\u0437 <code>go run<\/code>. \u041e\u0442\u0441\u044e\u0434\u0430 \u0434\u0432\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043d\u0430\u0448\u0443 \u0437\u0430\u0434\u0430\u0447\u0443:<\/p>\n<pre><code>\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e 1: \u043a\u0430\u0436\u0434\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e (\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e, \u0438 \u044d\u0442\u043e            \u043f\u0440\u0438\u0437\u043d\u0430\u044e\u0442 \u0441\u0430\u043c\u0438 \u0430\u0432\u0442\u043e\u0440\u044b)\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e 2: \u043d\u0443\u0436\u0435\u043d Go toolchain, \u0430 \u043d\u0430 \u043f\u0440\u043e\u0434\u0435 \u0435\u0433\u043e \u043d\u0435\u0442 \u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0434\u0430\u0436\u0435 \u043d\u0435 \u044d\u0442\u043e: \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0432 gore \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0430\u0432\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c:<\/p>\n<pre><code class=\"go\">:import cosy-console\/internal\/domain\/orders<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0410 \u0434\u0430\u043b\u044c\u0448\u0435 \u0442\u0443\u043f\u0438\u043a: \u044e\u0437\u043a\u0435\u0439\u0441 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0448\u044c, \u0435\u043c\u0443 \u043d\u0443\u0436\u0435\u043d <code>*gorm.DB<\/code>, \u043f\u0443\u043b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u043a\u043e\u043d\u0444\u0438\u0433 \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0412\u0441\u0451 \u044d\u0442\u043e \u0432 \u0432\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 composition root, \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0438 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c, \u043d\u043e gore \u043f\u0440\u043e \u043d\u0435\u0433\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442. \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u043e \u043f\u0440\u043e\u0434\u0430 \u043d\u0430\u0434\u043e \u0435\u0449\u0451 \u0434\u043e\u0442\u044f\u043d\u0443\u0442\u044c.<\/p>\n<h4>Yaegi: \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/h4>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e: <strong>\u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f<\/strong>. \u0423 Yaegi \u0435\u0441\u0442\u044c API:<\/p>\n<pre><code class=\"go\">i := interp.New(interp.Options{...})i.Use(stdlib.Symbols) \/\/ \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044bi.Eval(`1 + 1`)       \/\/ \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u0434i.REPL()              \/\/ \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0434\u043b\u044f \u043d\u0430\u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u043e <strong>\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u044c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430<\/strong>. \u0412 REPL \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0434\u0430\u0442\u044c <code>*gorm.DB<\/code>, \u044e\u0437\u043a\u0435\u0439\u0441, \u043a\u043e\u043d\u0444\u0438\u0433, \u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<pre><code>gore:                       Yaegi:REPL --go run--&gt; \u043a\u043e\u0434        \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f                              |\u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e    composition root (db, usecases, http-clients)                              |                              v                            Yaegi-\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 --&gt; REPL \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442                                                    \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h4>\u0412\u0430\u0436\u043d\u043e\u0435 \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e Yaegi, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c<\/h4>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0440\u0435\u043b\u0438\u0437 Yaegi \u044d\u0442\u043e v0.16.1, \u0430\u043f\u0440\u0435\u043b\u044c 2024. Issues \u0432 \u0442\u0440\u0435\u043a\u0435\u0440\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f, \u0430 \u0440\u0435\u043b\u0438\u0437\u043e\u0432 \u0434\u0430\u0432\u043d\u043e \u043d\u0435\u0442. \u0414\u043b\u044f \u043d\u0430\u0441 \u044d\u0442\u043e \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e, \u0442\u0430\u043a \u043a\u0430\u043a Yaegi \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043e\u043d \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0443, \u0438 \u0435\u0441\u043b\u0438 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f, \u043c\u044b \u0435\u0433\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u043c. \u0412\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f: \u043d\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430, \u0430 \u043e\u0434\u0438\u043d \u0432\u044b\u0437\u043e\u0432, <code>App.Orders.Usecases.Order.Get(Ctx, id)<\/code>, \u0438 \u0441\u0430\u043c \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c.<\/p>\n<p>REPL \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e \u043d\u0435 \u0438\u0434\u0451\u0442. \u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0443\u043f\u0430\u0441\u0442\u044c, \u0438 \u043f\u043e\u0441\u0442\u0440\u0430\u0434\u0430\u0435\u0442 \u0441\u0435\u0441\u0441\u0438\u044f, \u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 API. \u0421 \u044d\u0442\u0438\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c Yaegi \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u043f\u0440\u0438\u0433\u043e\u0434\u0435\u043d.<\/p>\n<h3>\u0410\u043a\u0442 2: \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0436\u0438\u0432\u0451\u0442 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435, \u0430 \u043d\u0435 \u0432 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0435<\/h3>\n<p>\u0412\u0442\u043e\u0440\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e\u0435, \u0438 \u0437\u0434\u0435\u0441\u044c \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 \u0447\u0430\u0441\u0442\u043e\u0435 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u0435.<\/p>\n<h4>\u0421\u0440\u0430\u0437\u0443 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0438\u0434\u0435\u044e \u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0432 \u0430\u0434\u043c\u0438\u043d\u043a\u0435<\/h4>\n<p>\u0427\u0430\u0441\u0442\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c REPL HTTP-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u043c \u0438\u043b\u0438 \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a. \u0427\u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u043d\u0435 \u0442\u0430\u043a:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0412\u0430\u0440\u0438\u0430\u043d\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u043d\u0435 \u0442\u0430\u043a<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">REPL \u0432\u043d\u0443\u0442\u0440\u0438 http-\u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430: \u043e\u0431\u0449\u0438\u0439 \u043f\u0443\u043b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u043e\u0431\u0449\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c, \u0438 \u0432\u0441\u0451, \u0447\u0442\u043e \u0443\u0440\u043e\u043d\u0438\u0442 \u043a\u043e\u043d\u0441\u043e\u043b\u044c, \u043c\u043e\u0436\u0435\u0442 \u0443\u0440\u043e\u043d\u0438\u0442\u044c API<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">HTTP-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \/console<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u044d\u0442\u043e remote code execution (RCE) \u043f\u043e HTTP; \u043b\u044e\u0431\u0443\u044e \u0437\u0430\u0449\u0438\u0442\u0443 \u043e\u0431\u043e\u0439\u0434\u0451\u0442 \u0442\u043e\u0442, \u043a\u0442\u043e \u043d\u0430\u0439\u0434\u0451\u0442 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">REPL \u043a\u0430\u043a \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0441 auth<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0432\u0441\u0451 \u0435\u0449\u0451 RCE, \u043f\u0440\u043e\u0441\u0442\u043e \u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u043c<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u0430\u043a \u0436\u0435 \u0443\u0434\u043e\u0431\u043d\u043e, \u043a\u0430\u043a \u0432 Rails. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c <code>rails c<\/code> <strong>\u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u043c\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0443<\/strong>: \u043e\u043d \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0442\u043e \u0436\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 (\u043c\u043e\u0434\u0435\u043b\u0438, \u043a\u043e\u043d\u0444\u0438\u0433, \u0411\u0414 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435). \u041f\u0430\u043c\u044f\u0442\u044c \u0443 \u043d\u0435\u0433\u043e \u0441\u0432\u043e\u044f, \u0430 \u043a\u043e\u043d\u0444\u0438\u0433 \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435 \u0436\u0435, \u0447\u0442\u043e \u0443 \u043f\u0440\u043e\u0434\u0430: \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0432 \u0431\u0430\u0437\u0435 \u043e\u0431\u0449\u0438\u0435, \u043d\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 API \u043e\u0442 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442.<\/p>\n<h4>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 + \u043e\u0431\u0449\u0438\u0439 composition root<\/h4>\n<p>\u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u044d\u0442\u0443 \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0434\u0438\u043d \u0432 \u043e\u0434\u0438\u043d:<\/p>\n<pre><code>                       config + logger                              |                    composition root (Container)                              |            +-----------------+------------------+            v                 v                  v        cmd\/api           cmd\/worker        cmd\/console   &lt;- \u043d\u043e\u0432\u044b\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a            |                 |                  |          HTTP server      \u0432\u043e\u0440\u043a\u0435\u0440\u044b           Yaegi REPL            |                 |                  |            +-------- \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u044e\u0437\u043a\u0435\u0439\u0441\u044b --+                              |                    PostgreSQL \/ Redis \/ Kafka            (\u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435, \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0442 \u0436\u0435 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d \u043a\u043e\u043d\u0444\u0438\u0433)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><code>cmd\/console<\/code> \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 <strong>\u0442\u043e\u0442 \u0436\u0435<\/strong> composition root, \u0447\u0442\u043e \u0438 API, \u043f\u043e\u044d\u0442\u043e\u043c\u0443:<\/p>\n<ul>\n<li>\n<p>\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0411\u0414 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e;<\/p>\n<\/li>\n<li>\n<p>\u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0442\u043e \u0436\u0435, \u0447\u0442\u043e \u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438: \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0433\u0440\u0430\u0444 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. HTTP-\u0441\u043b\u043e\u044f \u0432 \u044d\u0442\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442, \u0440\u043e\u0443\u0442\u0435\u0440 \u0438 \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u044b \u0436\u0438\u0432\u0443\u0442 \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u0438 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u043e\u043d\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 Docker \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0432\u0435 \u0441\u0442\u0440\u043e\u043a\u0438: \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0432 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u0440\u0430\u0437. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u0432:<\/p>\n<pre><code>RUN go build -o bin\/console .\/cmd\/console...COPY --from=builder \/app\/bin\/console \/app\/console<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0411\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u043b\u0435\u0436\u0438\u0442 \u0432 \u043e\u0431\u0440\u0430\u0437\u0435 \u0440\u044f\u0434\u043e\u043c \u0441 API. \u0412\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0435\u0433\u043e \u0438\u0437\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u0414\u043e\u0441\u0442\u0443\u043f \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u043a \u043d\u0435\u043c\u0443 \u0437\u0430\u043a\u0440\u044b\u0442.<\/p>\n<p>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"bash\">docker compose exec api \/app\/console<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h4>\u0427\u0442\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 REPL: \u0442\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e<\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0442\u043e\u043d\u043a\u043e\u0435 \u043c\u0435\u0441\u0442\u043e: \u043a\u0430\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u0430 \u0432\u0438\u0434\u043d\u044b \u0432 \u0441\u0435\u0441\u0441\u0438\u0438. \u041c\u044b \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u043b\u0438 \u0442\u0440\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0448\u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439.<\/p>\n<p><strong>\u041f\u043e\u043f\u044b\u0442\u043a\u0430 1: \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0451 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/strong><\/p>\n<pre><code class=\"go\">i.Use(interp.Exports{\"console\/console\": {    \"DB\":      reflect.ValueOf(db),    \"Orders\":  reflect.ValueOf(ordersUseCase),    \"Catalog\": reflect.ValueOf(catalogUseCase),    ...        \/\/ 30 \u0441\u0442\u0440\u043e\u043a \u0441\u0435\u0433\u043e\u0434\u043d\u044f, 60 \u043f\u043e\u0441\u043b\u0435 \u043f\u0430\u0440\u044b \u0441\u043f\u0440\u0438\u043d\u0442\u043e\u0432}})<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0441\u0442\u0451\u0442 \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u0434\u043e\u043c\u0435\u043d\u043e\u043c, \u0438\u043c\u0435\u043d\u0430 \u0436\u0438\u0432\u0443\u0442 \u0432 \u0434\u0432\u0443\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 (\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 + \u044d\u043a\u0441\u043f\u043e\u0440\u0442), \u0430 \u043f\u0440\u043e \u0437\u0430\u0431\u044b\u0442\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0443\u0437\u043d\u0430\u0451\u0448\u044c \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u0430.<\/p>\n<p><strong>\u041f\u043e\u043f\u044b\u0442\u043a\u0430 2: \u0430\u0432\u0442\u043e\u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0435\u0439 \u043f\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443.<\/strong><\/p>\n<pre><code class=\"go\">\/\/ \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c reflect'\u043e\u043c \u043f\u043e \u043f\u043e\u043b\u044f\u043c Container \u0438 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0435v := reflect.ValueOf(app).Elem()for i := 0; i &lt; v.NumField(); i++ { ... }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041c\u0430\u0433\u0438\u044f, \u0438 \u043e\u043d\u0430 \u043e\u043f\u0430\u0441\u043d\u0430. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430: \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043d\u043e\u0435 \u043f\u043e\u043b\u0435, \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u044f \u0438\u043c\u0451\u043d, \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0444\u043e\u0440\u043c \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044f \u0441\u043f\u043e\u0442\u044b\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0438 \u044d\u0442\u043e \u0445\u0443\u0436\u0435: \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0448\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u0448\u044c \u043f\u043e\u043b\u0435, \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0448\u044c \u044e\u0437\u043a\u0435\u0439\u0441 \u043c\u0435\u0436\u0434\u0443 \u0434\u043e\u043c\u0435\u043d\u0430\u043c\u0438, \u0438 \u0432\u0441\u0451 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f, \u0432\u0441\u0435 \u0442\u0435\u0441\u0442\u044b \u0437\u0435\u043b\u0451\u043d\u044b\u0435: \u043f\u0440\u043e \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043e\u043d\u0438 \u043d\u0435 \u0437\u043d\u0430\u044e\u0442. \u0410 \u0432 \u0441\u0435\u0441\u0441\u0438\u0438 \u0442\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c \u0438\u043c\u0435\u043d\u0430: \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u0435 <code>App.Orders.Usecases.Order.Get(...)<\/code> \u0442\u0435\u043f\u0435\u0440\u044c <code>undefined<\/code>. \u0423\u0437\u043d\u0430\u0451\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0435 \u0430\u0432\u0442\u043e\u0440 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u0430 \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u043d\u0430 \u043f\u0440\u043e\u0434\u0435.<\/p>\n<p>\u0414\u043b\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0447\u0438\u043d\u044f\u0442 \u043f\u0440\u043e\u0434, \u00ab\u043c\u043e\u043b\u0447\u0430\u00bb \u044d\u0442\u043e \u0445\u0443\u0434\u0448\u0435\u0435 \u0441\u043b\u043e\u0432\u043e.<\/p>\n<p><strong>\u041f\u043e\u043f\u044b\u0442\u043a\u0430 3: \u0432\u0435\u0441\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043e\u0434\u043d\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c.<\/strong><\/p>\n<pre><code class=\"go\">func exports(ctx context.Context, container *app.Container) interp.Exports {    return interp.Exports{        \"console\/console\": {            \"App\": reflect.ValueOf(container),            \"Ctx\": reflect.ValueOf(ctx),        },    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><code>App<\/code> \u044d\u0442\u043e \u0432\u0435\u0441\u044c composition root \u043a\u0430\u043a \u0435\u0441\u0442\u044c, <code>Ctx<\/code> \u044d\u0442\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u0435\u0441\u0441\u0438\u0438 \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0433\u043e \u0442\u0440\u0435\u0431\u0443\u044e\u0442. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 <code>App<\/code>:<\/p>\n<pre><code>App (*app.Container) |-- Orders |    |-- Usecases.Order.Get(ctx, id)  -&gt; (models.Order, error) |                      .Cancel(ctx, id) |    \\-- Repos.OrderRepo.Get(ctx, id) |                       .Update(ctx, id, orders.UpdateAttrs) |-- Catalog |    |-- Usecases.Item.List(ctx, catalog.ItemFilter) |    \\-- Repos.ItemRepo.Get(ctx, id) \\-- Shared      |-- DB   *gorm.DB      \\-- Tx   \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439: InTransaction(ctx, fn)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u044d\u0442\u043e <code>uuid.UUID<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 <code>id<\/code> \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043d\u0438\u0436\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 uuid, \u0430 \u043d\u0435 \u0447\u0438\u0441\u043b\u043e. \u0414\u043e\u0441\u0442\u0443\u043f \u0438\u0434\u0451\u0442 \u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e \u043f\u043e \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435:<\/p>\n<pre><code>&gt; App.Orders.Usecases.Order.Get(Ctx, id)&gt; App.Catalog.Repos.ItemRepo.Get(Ctx, itemID)&gt; App.Shared.Tx.InTransaction(Ctx, func(...) error { ... })<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c <code>reflect<\/code> \u0432 \u043a\u043e\u0434\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u044d\u0442\u043e API Yaegi. <strong>\u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u043c\u0430\u0433\u0438\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439: \u0447\u0442\u043e \u043b\u0435\u0436\u0438\u0442 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435, \u0442\u043e \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e.<\/strong> \u0414\u043e\u0431\u0430\u0432\u0438\u043b \u044e\u0437\u043a\u0435\u0439\u0441 \u0432 composition root, \u043e\u043d \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. HTTP-\u0445\u0435\u043d\u0434\u043b\u0435\u0440\u044b \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 <strong>\u043d\u0435 \u0432\u0445\u043e\u0434\u044f\u0442<\/strong>. \u041a\u043e\u043d\u0441\u043e\u043b\u044c \u043f\u0440\u043e \u043d\u0438\u0445 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430: \u0435\u0439 \u043d\u0443\u0436\u043d\u044b \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u0430 \u043d\u0435 \u0440\u043e\u0443\u0442\u0435\u0440.<\/p>\n<h3>\u0410\u043a\u0442 3: \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u0438\u043b\u0438 \u043f\u043e\u0447\u0435\u043c\u0443 undefined type \u043f\u0440\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u0434\u0435<\/h3>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Yaegi. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u0432:<\/p>\n<p><strong>\u0421\u0438\u043c\u0432\u043e\u043b\u044b<\/strong> \u044d\u0442\u043e \u043c\u0430\u043f\u0430 \u00ab\u0438\u043c\u044f -&gt; reflect.Value\u00bb \u0432\u043d\u0443\u0442\u0440\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430. \u0427\u0435\u0440\u0435\u0437 \u043d\u0435\u0451 Yaegi \u0432\u0438\u0434\u0438\u0442 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0438\u0440.<\/p>\n<p><strong>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f<\/strong> (<code>i.Use<\/code>) \u044d\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0430\u043a\u0435\u0442\u0430 \u0432 \u044d\u0442\u0443 \u043c\u0430\u043f\u0443 \u043f\u043e\u0434 \u043a\u043b\u044e\u0447\u043e\u043c-\u043f\u0443\u0442\u0451\u043c. \u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u043b\u043e: \u0438\u043c\u044f \u0432 \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0430.<\/p>\n<p><strong>\u0411\u0438\u043d\u0434\u0438\u043d\u0433<\/strong> (<code>i.ImportUsed<\/code>) \u044d\u0442\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043c\u0451\u043d \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 \u0441\u043a\u043e\u0443\u043f\u0435 \u0441\u0435\u0441\u0441\u0438\u0438, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0432 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u0432\u0441\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u044b.<\/p>\n<p><strong>extract<\/strong> \u044d\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432: \u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0438 \u043f\u0438\u0448\u0435\u0442 Go-\u0444\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 Symbols \u043f\u0440\u0438 <code>init()<\/code>.<\/p>\n<h4>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: REPL \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442<\/h4>\n<p><code>App<\/code> \u0432 \u0441\u0435\u0441\u0441\u0438\u0438 \u0435\u0441\u0442\u044c, \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f, \u043d\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0436\u0435 \u0432\u044b\u0437\u043e\u0432 \u0441\u043f\u043e\u0442\u044b\u043a\u0430\u0435\u0442\u0441\u044f \u043e\u0431 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442:<\/p>\n<pre><code>&gt; App.Orders.Usecases.Order.Get(Ctx, uuid.MustParse(\"...b2\"))1:28: undefined: uuid<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0430\u043a\u0430\u0437 \u043f\u043e id, \u043d\u0443\u0436\u0435\u043d \u0442\u0438\u043f <code>uuid.UUID<\/code>, \u0430 <code>uuid<\/code> \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u0430\u043a\u0435\u0442. \u0422\u043e \u0436\u0435 \u0441\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<pre><code class=\"go\">func (r *OrderRepo) Update(    ctx context.Context, id uuid.UUID, attrs orders.UpdateAttrs,) (models.Order, error)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <code>orders.UpdateAttrs{Status: &amp;status}<\/code> \u043d\u0430\u0434\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0438 <code>orders<\/code> \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0442\u043e\u0436\u0435 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442:<\/p>\n<pre><code>&gt; status := \"x\"&gt; App.Orders.Repos.OrderRepo.Update(Ctx, id, orders.UpdateAttrs{Status: &amp;status})1:28: undefined type<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>Yaegi \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u00ab\u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u00bb \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442: \u0443 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u043d\u0435\u0442 \u0435\u0433\u043e \u0442\u0438\u043f\u043e\u0432 \u0432 \u0441\u0432\u043e\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 <code>yaegi extract<\/code>, \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.<\/p>\n<h4>\u0427\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 extract (\u0438 \u0447\u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c)<\/h4>\n<pre><code class=\"bash\">go run github.com\/traefik\/yaegi\/cmd\/yaegi extract -name symbols cosy-console\/internal\/domain\/orders<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0444\u0430\u0439\u043b:<\/p>\n<pre><code class=\"go\">\/\/ Code generated by 'yaegi extract cosy-console\/internal\/domain\/orders'. DO NOT EDIT.func init() {    Symbols[\"cosy-console\/internal\/domain\/orders\/orders\"] = map[string]reflect.Value{        \"ErrNotFound\":    reflect.ValueOf(&amp;orders.ErrNotFound).Elem(),        \"UpdateAttrs\":    reflect.ValueOf((*orders.UpdateAttrs)(nil)),        \"CreationParams\": reflect.ValueOf((*orders.CreationParams)(nil)),        ...    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0441\u0430\u043c \u0437\u0430 \u0441\u0435\u0431\u044f: \u0444\u0430\u0439\u043b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d, \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0440\u0443\u043a\u0430\u043c\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430: \u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c extract \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u043e\u0434\u0440\u044f\u0434, \u0432\u043a\u043b\u044e\u0447\u0430\u044f <code>gorm.io\/gorm<\/code>:<\/p>\n<pre><code>github_com-google-uuid.go               &lt;- 70 \u0441\u0442\u0440\u043e\u043agorm_io-gorm.go                         &lt;- 900 \u0441\u0442\u0440\u043e\u043a: gorm.Open, gorm.DB, clause...cosy-console-internal-domain-orders.go  &lt;- 30 \u0441\u0442\u0440\u043e\u043acosy-console-internal-domain-catalog.go &lt;- 30 \u0441\u0442\u0440\u043e\u043a...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u0422\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u043d\u0430\u0434\u043e.<\/strong> \u0422\u0430\u0431\u043b\u0438\u0446\u0430 gorm-\u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u00ab\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c REPL \u0441\u0430\u043c \u0434\u0435\u043b\u0430\u0435\u0442 <code>import \"gorm.io\/gorm\"<\/code> \u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f\u00bb. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u043e composition root\u2019\u043e\u043c, \u0441 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d-\u043a\u043e\u043d\u0444\u0438\u0433\u043e\u043c. \u0412 REPL \u043e\u043d\u043e \u043f\u0440\u0438\u0435\u0437\u0436\u0430\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u043a\u0430\u043a <code>App.Shared.DB<\/code>. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u0432\u0442\u043e\u0440\u044b\u0435, \u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u0437\u0430\u0447\u0435\u043c. gorm-\u0444\u0430\u0439\u043b \u043c\u044b \u0443\u0434\u0430\u043b\u0438\u043b\u0438, \u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0442\u0430\u043a: <strong>\u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043d\u0443\u0436\u043d\u044b \u0432\u0445\u043e\u0434\u043d\u044b\u043c \u0442\u0438\u043f\u0430\u043c, \u0430 \u043d\u0435 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435.<\/strong><\/p>\n<h4>\u041a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c: \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/h4>\n<p>\u041d\u0430\u0434\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0443\u0436\u043d\u044b. \u0418\u043d\u0442\u0443\u0438\u0446\u0438\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u00ab\u0432\u0441\u0435 \u0434\u043e\u043c\u0435\u043d\u044b \u0438 \u0432\u0441\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u00bb, \u0438 \u043e\u0448\u0438\u0431\u0430\u0435\u0442\u0441\u044f. \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u0430:<\/p>\n<pre><code>\u043a\u0430\u043a\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043c\u0435\u0442\u044c \u041a\u041e\u041d\u0421\u0422\u0420\u0423\u0418\u0420\u041e\u0412\u0410\u0422\u042c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c REPL,\u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430?<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0422\u0438\u043f\u044b \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043f\u043e \u043c\u0435\u0441\u0442\u0443 \u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435:<\/p>\n<pre><code>                 +-- \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u0435\u0442\u043e\u0434\u0430 --&gt; \u0412\u0425\u041e\u0414: \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0442\u0440\u043e\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c\u0435\u0442\u043e\u0434 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 +                        -&gt; \u043f\u0430\u043a\u0435\u0442 \u043d\u0443\u0436\u0435\u043d \u0432 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u0445                 +-- \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 ------&gt; \u0412\u042b\u0425\u041e\u0414: \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u0435\u0442                                          -&gt; \u043f\u0430\u043a\u0435\u0442 \u041d\u0415 \u043d\u0443\u0436\u0435\u043d<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0432\u0441\u0451 \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0430\u043c\u0430 Yaegi: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0432\u0435\u0440\u043d\u0443\u0432\u0448\u0435\u0435\u0441\u044f \u0438\u0437 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430, \u043d\u0435\u0441\u0451\u0442 \u0441\u0432\u043e\u0439 \u0442\u0438\u043f \u0432 \u0441\u0435\u0431\u0435, \u0438 \u043f\u043e\u043b\u044f \u0443 \u043d\u0435\u0433\u043e \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u043e\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code>&gt; o, err := App.Orders.Repos.OrderRepo.Get(Ctx, id)&gt; o.Status \/\/ \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0445\u043e\u0442\u044f \u043f\u0430\u043a\u0435\u0442 models \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043c\u044b \u043d\u0435 \u0443\u0433\u0430\u0434\u044b\u0432\u0430\u043b\u0438, \u0430 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043b\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c. \u041e\u043d \u0431\u0435\u0440\u0451\u0442 <code>Container<\/code>, \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0432\u0441\u0435\u043c \u0435\u0433\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0442\u0438\u043f\u044b \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0430 \u0435\u0441\u043b\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u0441\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0435\u0451 \u043f\u043e\u043b\u044f\u043c \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0442\u0438\u043f\u044b \u043e\u0442\u0442\u0443\u0434\u0430 \u0436\u0435. \u041a\u043e\u0434 \u0447\u0438\u0442\u0430\u0435\u0442 \u043f\u0430\u043a\u0435\u0442 <code>golang.org\/x\/tools\/go\/packages<\/code>: \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0435\u0433\u043e \u043d\u0435\u0442, \u043e\u043d \u0436\u0438\u0432\u0451\u0442 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435. \u041e\u0442\u0432\u0435\u0442 \u0432\u044b\u0448\u0435\u043b \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u043c:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041f\u0430\u043a\u0435\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0417\u0430\u0447\u0435\u043c \u0432 REPL<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">cosy-console\/internal\/domain\/orders + models<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>UpdateAttrs<\/code>, <code>CreationParams<\/code>; \u043c\u043e\u0434\u0435\u043b\u044c \u044d\u0442\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <code>Create(ctx, order)<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">cosy-console\/internal\/domain\/catalog<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0444\u0438\u043b\u044c\u0442\u0440\u044b \u043f\u043e\u0438\u0441\u043a\u0430, \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f-\u043e\u043f\u0446\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">github.com\/google\/uuid<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>uuid.UUID<\/code> \u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430\u0445: <code>uuid.Parse(...)<\/code>, <code>uuid.Nil<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">cosy-console\/pkg\/pagination<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043e\u043f\u0446\u0438\u0438 <code>WithPage(1)<\/code><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0418\u0442\u043e\u0433\u043e \u043f\u044f\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432\u043c\u0435\u0441\u0442\u043e \u00ab\u0432\u0441\u0435\u0433\u043e\u00bb: <code>orders<\/code> \u0438 \u0435\u0433\u043e <code>models<\/code>, <code>catalog<\/code>, <code>uuid<\/code>, <code>pagination<\/code>. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u00ab\u0447\u0435\u0433\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442\u00bb \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442: \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 REPL, \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0438\u0441\u044c \u0441\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0438 \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 <code>undefined<\/code>, \u043f\u0430\u043a\u0435\u0442 \u043d\u0430\u0434\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u043f\u0438\u0441\u043e\u043a. \u041b\u0438\u0448\u043d\u0435\u0435 \u0438\u0449\u0435\u0442\u0441\u044f \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b: \u043f\u0430\u043a\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0438 \u0440\u0430\u0437\u0443 \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430, \u0438\u0437 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0443\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>\u041d\u044e\u0430\u043d\u0441 \u043f\u043e uuid: extract \u0434\u0430\u0451\u0442 \u0432\u0435\u0441\u044c \u043f\u0430\u043a\u0435\u0442, \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u043c (<code>ClockSequence<\/code>, <code>SetRand<\/code>, <code>NodeID<\/code>), \u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043d\u0443\u0436\u0435\u043d \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440. \u041c\u044b \u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440: <code>Parse<\/code>, <code>MustParse<\/code>, <code>Must<\/code>, <code>New<\/code>, <code>Nil<\/code>, <code>UUID<\/code>.<\/p>\n<h4>yaegi extract<\/h4>\n<p><code>extract<\/code> \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0441\u0430\u043c\u043e\u0433\u043e Yaegi. \u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u00ab\u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u00bb \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442: \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u0442\u0438\u043f\u043e\u0432 \u0438\u0437 \u0432\u0430\u0448\u0435\u0433\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435. extract \u044d\u0442\u043e \u043c\u043e\u0441\u0442: \u043e\u043d \u0447\u0438\u0442\u0430\u0435\u0442 \u043f\u0430\u043a\u0435\u0442 \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043c\u0430\u043f\u0443 <code>\u0438\u043c\u044f -&gt; reflect.Value<\/code> \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0435\u0433\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439. \u0420\u0443\u043a\u0430\u043c\u0438 \u0442\u0430\u043a\u0443\u044e \u043c\u0430\u043f\u0443 \u0442\u043e\u0436\u0435 \u043f\u0438\u0448\u0443\u0442, \u043d\u0438\u0436\u0435 \u043c\u044b \u0442\u0430\u043a \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c <code>App<\/code>, <code>Ctx<\/code> \u0438 \u0443\u0440\u0435\u0437\u0430\u043d\u043d\u044b\u0439 <code>uuid<\/code>, \u043d\u043e \u0434\u043b\u044f \u0434\u043e\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u044d\u0442\u043e \u0441\u043e\u0442\u043d\u0438 \u0441\u0442\u0440\u043e\u043a. \u0427\u0442\u043e \u043f\u043e\u043f\u0430\u043b\u043e \u0432 \u043c\u0430\u043f\u0443, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0437 REPL.<\/p>\n<p><strong>\u041a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c.<\/strong> extract \u0436\u0438\u0432\u0451\u0442 \u0432 \u0442\u043e\u043c \u0436\u0435 Go-\u043c\u043e\u0434\u0443\u043b\u0435, \u0447\u0442\u043e \u0438 <a href=\"https:\/\/pkg.go.dev\/github.com\/traefik\/yaegi\/cmd\/yaegi\" rel=\"noopener nofollow\">Yaegi<\/a>. \u0424\u043b\u0430\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043c\u0435\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: <code>-name<\/code> \u0437\u0430\u0434\u0430\u0451\u0442 \u0438\u043c\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u044f (\u0443 \u043d\u0430\u0441 <code>symbols<\/code>), \u0430 <code>-include<\/code> \u0438 <code>-exclude<\/code> \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u044e\u0442 \u043f\u043e regexp, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0443\u0441\u043e\u043a \u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<p><strong>\u0427\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f.<\/strong> \u0424\u0430\u0439\u043b \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438, \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043d\u0430 \u043f\u0430\u043a\u0435\u0442; \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0438\u0437 import path. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0435 \u0438\u0437 <code>internal\/console\/symbols\/<\/code>, \u0438 \u0444\u0430\u0439\u043b\u044b \u043b\u043e\u0436\u0430\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u043a\u0443\u0434\u0430 \u043d\u0430\u0434\u043e:<\/p>\n<pre><code>$ cd internal\/console\/symbols &amp;&amp; go run ... extract -name symbols \\      cosy-console\/internal\/domain\/orders cosy-console\/internal\/domain\/orders\/modelscosy-console-internal-domain-orders.go        &lt;- extract \u0434\u043e\u043c\u0435\u043d\u0430cosy-console-internal-domain-orders-models.go &lt;- extract \u0435\u0433\u043e models<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0442\u043e\u0442 \u0436\u0435 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043f\u043e\u0434 <code>init()<\/code>, <a href=\"#%D1%87%D1%82%D0%BE-%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B8%D1%80%D1%83%D0%B5%D1%82-extract-%D0%B8-%D1%87%D1%82%D0%BE-%D1%81-%D1%8D%D1%82%D0%B8%D0%BC-%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C\" rel=\"noopener nofollow\">\u0447\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u0432\u044b\u0448\u0435<\/a>.<\/p>\n<p><strong>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u043e.<\/strong> \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0441\u0430\u043c\u0438 \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e\u0442: \u043f\u0430\u043a\u0435\u0442 \u043c\u043e\u0433 \u043d\u0435 \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043b\u0438 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u0438\u043c\u0451\u043d. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0440\u0430\u0437\u043e\u0432\u044b\u043c \u043f\u0440\u043e\u0433\u043e\u043d\u043e\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043a\u043e\u043d\u0441\u043e\u043b\u0438, \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u0438\u0437 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432: <code>\/app\/console -e 'orders.OrderFilter{Status: \"paid\"}.Status'<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0430 \u043d\u0435 <code>undefined<\/code>.<\/p>\n<p><strong>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439.<\/strong> \u0421\u0438\u043c\u0432\u043e\u043b\u044b \u044d\u0442\u043e \u0441\u043b\u0435\u043f\u043e\u043a \u043a\u043e\u0434\u0430, \u0438 \u043e\u043d \u043e\u0442\u0441\u0442\u0430\u0451\u0442 \u043e\u0442 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440: \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u043e\u043b\u0435 \u0432 <code>UpdateAttrs<\/code>, \u0430 \u0432 REPL \u0435\u0433\u043e \u043d\u0435\u0442, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0448\u044c. \u0417\u043d\u0430\u0447\u0438\u0442, \u0440\u0435\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u0442\u043e\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0430 \u043d\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0448\u0430\u0433\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u043c\u043d\u0438\u0442 \u043e\u0434\u0438\u043d \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0430 \u0441\u043e\u0431\u0440\u0430\u043d\u0430 \u0432 make-\u0442\u0430\u0440\u0433\u0435\u0442:<\/p>\n<pre><code># make console-symbols DOMAIN=orders         (\u043e\u0434\u0438\u043d \u0434\u043e\u043c\u0435\u043d)# make console-symbols DOMAIN=orders,catalog (\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e)# make console-symbols                       (\u0432\u0441\u0435 \u0434\u043e\u043c\u0435\u043d\u044b \u0440\u0430\u0437\u043e\u043c)DOMAINS ?= orders catalogconsole-symbols:@set -e; for domain in $$(echo $(if $(DOMAIN),$(DOMAIN),$(DOMAINS)) | tr ',' ' '); do \\echo \"==&gt; $$domain: extracting domain + models\"; \\( cd internal\/console\/symbols &amp;&amp; \\go run github.com\/traefik\/yaegi\/cmd\/yaegi extract -name symbols \\cosy-console\/internal\/domain\/$$domain cosy-console\/internal\/domain\/$$domain\/models &amp;&amp; \\mv -f cosy-console-internal-domain-$$domain.go $$domain.go &amp;&amp; \\mv -f cosy-console-internal-domain-$$domain-models.go $${domain}_models.go ); \\echo \"==&gt; $$domain: written $$domain.go + $${domain}_models.go\"; \\done<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0422\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0437\u0430\u0448\u0438\u0442\u044b\u0445 \u0432 \u0442\u0430\u0440\u0433\u0435\u0442.<\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435: extract \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441 <strong>\u0434\u0432\u0443\u043c\u044f<\/strong> \u043f\u0443\u0442\u044f\u043c\u0438: \u0441\u0430\u043c \u0434\u043e\u043c\u0435\u043d \u0438 \u0435\u0433\u043e <code>models<\/code>, \u0442\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442. extract \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 <code>...<\/code>-\u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b, \u0430 Go-\u043f\u0430\u043a\u0435\u0442 \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u043e\u0434\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438 \u043c\u0430\u043b\u043e: params \u0438\u0437\u0432\u043b\u0435\u043a\u043b\u0438\u0441\u044c \u0431\u044b, \u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0435\u0442. \u041c\u043e\u0434\u0435\u043b\u0438 \u043d\u0443\u0436\u043d\u044b \u043d\u0435 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f, \u0430 \u0434\u043b\u044f <strong>\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/strong>: \u0443 <code>Create(ctx, order models.Order)<\/code> \u043c\u043e\u0434\u0435\u043b\u044c \u044d\u0442\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u0438 \u0431\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 <code>models.Order{...}<\/code> \u0432 \u0441\u0435\u0441\u0441\u0438\u0438 \u0434\u0430\u0451\u0442 <code>undefined type<\/code>.<\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0435: extract \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f <strong>\u0432\u043d\u0443\u0442\u0440\u0438<\/strong> <code>internal\/console\/symbols\/<\/code>: \u043e\u043d \u043f\u0438\u0448\u0435\u0442 \u0444\u0430\u0439\u043b\u044b \u0432 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u0438 \u0442\u0430\u043a \u043e\u043d\u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0441\u0440\u0430\u0437\u0443 \u043a\u0443\u0434\u0430 \u043d\u0430\u0434\u043e, \u043c\u0438\u043d\u0443\u044f \u043a\u043e\u0440\u0435\u043d\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u0414\u0432\u0430 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 <code>&lt;domain&gt;.go<\/code> \u0438 <code>&lt;domain&gt;_models.go<\/code>: \u043f\u043e \u0444\u0430\u0439\u043b\u0443 \u043d\u0430 \u043f\u0430\u043a\u0435\u0442, \u0441 \u0447\u0435\u0441\u0442\u043d\u044b\u043c <code>DO NOT EDIT<\/code> \u0438 \u0440\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 extract\u2019\u0430.<\/p>\n<p>\u0422\u0440\u0435\u0442\u044c\u0435: <code>mv -f<\/code>. \u0424\u0430\u0439\u043b\u0430 \u043d\u0435\u0442, \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0441\u0442\u0441\u044f; \u0444\u0430\u0439\u043b \u0435\u0441\u0442\u044c, \u043e\u043d \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e: \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438 <code>UpdateAttrs<\/code>, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 <code>make console-symbols DOMAIN=orders<\/code>, \u043a\u043e\u043c\u043c\u0438\u0442; \u0438\u043c\u0435\u043d\u0430 \u0432 \u0441\u0435\u0441\u0441\u0438\u0438 \u0434\u043e\u043c\u0435\u043d \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u0438\u0442 \u0441\u0430\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u0445 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 <code>Exports()<\/code>, \u0430 \u043d\u0435 \u0444\u0430\u0439\u043b.<\/p>\n<h4>\u041f\u043e\u0447\u0435\u043c\u0443 \u0432\u0441\u0451 \u0432\u043d\u0443\u0442\u0440\u0438 App \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0431\u0435\u0437 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432<\/h4>\n<p>\u0421\u0438\u043c\u0432\u043e\u043b\u044b \u043d\u0443\u0436\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441 \u043d\u0443\u043b\u044f. \u0412\u0441\u0451, \u0447\u0442\u043e composition root \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043b, \u043f\u0440\u0438\u0435\u0437\u0436\u0430\u0435\u0442 \u0432 \u0441\u0435\u0441\u0441\u0438\u044e \u0432\u043d\u0443\u0442\u0440\u0438 <code>App<\/code>, \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0434\u043e. \u0423 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0434\u0432\u0430 \u043a\u0430\u043d\u0430\u043b\u0430 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438:<\/p>\n<pre><code>\u043a\u0430\u043d\u0430\u043b 1: symbols           \u0422\u0418\u041f\u042b \u0418 \u0424\u0423\u041d\u041a\u0426\u0418\u0418 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u043f\u0430\u043a\u0435\u0442\u0430                           \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u041a\u041e\u041d\u0421\u0422\u0420\u0423\u0418\u0420\u0423\u0415\u0422 \u0441\u0430\u043c:                           orders.UpdateAttrs{...}, uuid.Parse(...)\u043a\u0430\u043d\u0430\u043b 2: App               \u0413\u0420\u0410\u0424 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c                           \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0412\u042b\u0417\u042b\u0412\u0410\u0415\u0422:                           App.Orders.Repos.OrderRepo.Get(...)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u0438\u043c\u0432\u043e\u043b\u044b \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u043a\u0430\u043a <strong>\u0441\u043e\u0437\u0434\u0430\u0442\u044c<\/strong> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 REPL?\u00bb. <code>App<\/code> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u043a\u0430\u043a <strong>\u0434\u043e\u0442\u044f\u043d\u0443\u0442\u044c\u0441\u044f<\/strong> \u0434\u043e \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e\u00bb. \u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 composition root \u0437\u0430\u0434\u043e\u043b\u0433\u043e \u0434\u043e REPL, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0441\u0435\u0441\u0441\u0438\u0438 \u043e\u043d\u0438 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u043d\u0443\u0442\u0440\u0438 <code>App<\/code>.<\/p>\n<p>\u041c\u0435\u0445\u0430\u043d\u0438\u043a\u0430 Yaegi: \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0432 <code>App.Orders.Repos.OrderRepo.Get(...)<\/code>, \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043d\u0435 \u0438\u0449\u0435\u0442 \u043f\u0430\u043a\u0435\u0442 \u043f\u043e \u0438\u043c\u0435\u043d\u0438, \u043e\u043d \u0438\u0434\u0451\u0442 \u043f\u043e \u043f\u043e\u043b\u044f\u043c <code>App<\/code> \u0447\u0435\u0440\u0435\u0437 reflection, \u0438 \u043c\u0435\u0442\u043e\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e \u0442\u0438\u043f\u0443 \u0441\u0430\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0441\u0451\u0442 \u0442\u0438\u043f \u0441 \u0441\u043e\u0431\u043e\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0438 \u044e\u0437\u043a\u0435\u0439\u0441\u044b, \u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, \u0438 <code>App.Shared.DB<\/code>: \u0432\u0441\u0451 \u044d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u0434\u043e \u0441\u0442\u0430\u0440\u0442\u0430 REPL.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0438\u0445 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c, <code>order_repo.New(db)<\/code> \u0432 REPL \u0434\u0430\u0451\u0442 <strong>\u0432\u0442\u043e\u0440\u044b\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b<\/strong> \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432 \u0432 \u043e\u0431\u0445\u043e\u0434 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430: \u0434\u0440\u0443\u0433\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f, \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0443\u043b, \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043a \u0442\u043e\u043c\u0443, \u0447\u0435\u043c \u0436\u0438\u0432\u0451\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0418 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u043f\u043e\u0442\u044f\u043d\u0435\u0442 <code>*gorm.DB<\/code> \u0432 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u0441\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u043c \u00ab\u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0441\u0432\u043e\u0451 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u043b\u0438 \u043f\u0430\u0440\u043e\u0439 \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432 \u0432\u044b\u0448\u0435.<\/p>\n<h4>\u0418\u043c\u043f\u043e\u0440\u0442\u044b \u0431\u0435\u0437 \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0432: ImportUsed<\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b. \u041d\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043b\u043e: \u043f\u043e\u0441\u043b\u0435 <code>i.Use(...)<\/code> \u0438\u043c\u0435\u043d\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 \u0441\u0435\u0441\u0441\u0438\u0438 \u0432\u0441\u0451 \u0435\u0449\u0451 \u043d\u0435 \u0432\u0438\u0434\u043d\u044b, \u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0430\u0441\u044c \u0431\u044b \u0441 \u0434\u0435\u0441\u044f\u0442\u043a\u0430 \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0432:<\/p>\n<pre><code>&gt; import \"fmt\"&gt; import \"time\"&gt; import orders \"cosy-console\/internal\/domain\/orders\"&gt; ...10 \u0441\u0442\u0440\u043e\u043a, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>Yaegi \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u043e \u043e\u0434\u043d\u0438\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u043c:<\/p>\n<pre><code class=\"go\">i.ImportUsed()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><code>ImportUsed<\/code> \u0431\u0435\u0440\u0451\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 <code>Use<\/code> \u043f\u0430\u043a\u0435\u0442 \u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u0438\u043c\u044f \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043a\u043e\u0443\u043f\u0435, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0432 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u0432\u0441\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u044b \u0441\u0440\u0430\u0437\u0443:<\/p>\n<pre><code>Use(...)      = \u00ab\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440, \u0437\u0430\u043f\u043e\u043c\u043d\u0438 \u044d\u0442\u0438 \u043f\u0430\u043a\u0435\u0442\u044b\u00bb     (\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f)ImportUsed()  = \u00ab\u0438 \u043f\u043e\u043a\u0430\u0436\u0438 \u0438\u0445 \u0438\u043c\u0435\u043d\u0430 \u0431\u0435\u0437 import'\u043e\u0432\u00bb       (\u0431\u0438\u043d\u0434\u0438\u043d\u0433 \u0438\u043c\u0451\u043d)&gt; fmt.Sprintf(\"%d\", 7)   &lt;- fmt \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d&gt; orders.UpdateAttrs{}   &lt;- \u0438 orders \u0442\u043e\u0436\u0435<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h4>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0437\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/h4>\n<p><code>ImportUsed<\/code> \u0437\u0430\u043a\u0440\u044b\u043b \u0432\u0441\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b, \u043d\u043e \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u043c \u043a\u043e\u0434\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c, <code>import . \"console\"<\/code>. \u041f\u043e\u0447\u0435\u043c\u0443:<\/p>\n<p><strong>\u0428\u0430\u0433 1: \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u043a\u0435\u0442\u044b.<\/strong> \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u0442\u0434\u0430\u0442\u044c \u0432 \u0441\u0435\u0441\u0441\u0438\u044e \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 Yaegi \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u0442: \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u00ab\u0438\u043c\u044f -&gt; \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u00bb \u043e\u0431\u044f\u0437\u0430\u043d \u043b\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043a\u043b\u044e\u0447\u043e\u043c-\u043f\u0443\u0442\u0451\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 <code>App<\/code> \u0438 <code>Ctx<\/code> \u0437\u0430\u0432\u0451\u0440\u043d\u0443\u0442\u044b \u0432 \u00ab\u043f\u0441\u0435\u0432\u0434\u043e\u043f\u0430\u043a\u0435\u0442\u00bb, \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043f\u043e\u0434 \u0432\u044b\u0434\u0443\u043c\u0430\u043d\u043d\u044b\u043c \u043f\u0443\u0442\u0451\u043c <code>console\/console<\/code>. \u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0441 \u0442\u0430\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043d\u0435\u0442, \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u043e\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043f\u0430\u043a\u0435\u0442 <code>console<\/code> \u0441 \u0434\u0432\u0443\u043c\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0432\u043d\u0443\u0442\u0440\u0438.<\/p>\n<p><strong>\u0428\u0430\u0433 2: \u0431\u0435\u0437 \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u0438\u043c\u0435\u043d\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b.<\/strong> \u041f\u0441\u0435\u0432\u0434\u043e\u043f\u0430\u043a\u0435\u0442 \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043f\u0430\u043a\u0435\u0442: \u0435\u0433\u043e \u0438\u043c\u0435\u043d\u0430 \u0432 \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0430. \u0415\u0441\u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0438\u043c\u043f\u043e\u0440\u0442:<\/p>\n<pre><code>&gt; import \"console\"&gt; console.App.Orders...         &lt;- \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0434\u043e \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u0428\u0430\u0433 3: \u0442\u043e\u0447\u043a\u0430 \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441.<\/strong> \u0412 Go \u0435\u0441\u0442\u044c dot-import, <code>import . \"pkg\"<\/code> \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442 \u0438\u043c\u0435\u043d\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 \u043f\u0440\u044f\u043c\u043e \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043a\u043e\u0443\u043f\u0435, \u0431\u0435\u0437 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430:<\/p>\n<pre><code class=\"go\">import . \"console\"\/\/ App \u0438 Ctx \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e:\/\/ &gt; App.Orders...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 <code>ImportUsed<\/code> \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043b \u044d\u0442\u043e \u0441\u0430\u043c? \u041e\u043d \u0443\u043c\u0435\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0438\u043c\u043f\u043e\u0440\u0442, \u0430 \u0438\u043c\u044f \u0434\u043b\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0431\u0435\u0440\u0451\u0442 \u0438\u0437 \u043a\u043b\u044e\u0447\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438: \u0432\u0441\u0451, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u043b\u044d\u0448\u0430. \u041a\u043b\u044e\u0447 \u0443 \u043d\u0430\u0441 <code>console\/console<\/code>, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u043b\u044d\u0448 \u043e\u0442\u0440\u0435\u0437\u0430\u0435\u0442 <code>console<\/code>, \u0438 \u0432 \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u043a\u0435\u0442 \u0441 \u044d\u0442\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c, \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u0442\u043e\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0443\u0445\u043e\u0434\u0438\u043c:<\/p>\n<pre><code>&gt; console.App.Orders.Usecases.Order.Get(Ctx, id)   &lt;- \u043f\u043e\u0441\u043b\u0435 ImportUsed \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0430\u043a&gt; App.Orders.Usecases.Order.Get(Ctx, id)           &lt;- undefined: App<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>Dot-import \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u0438 <code>ImportUsed<\/code> \u0435\u0451 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0430\u043c\u0430 \u043a\u043e\u043d\u0441\u043e\u043b\u044c, \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 <code>Eval<\/code>:<\/p>\n<pre><code class=\"go\">i.ImportUsed()if _, err := i.Eval(`import . \"console\"`); err != nil { ... }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u0435\u043d<\/strong>. \u0414\u043e\u043a-\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 <code>ImportUsed<\/code> \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043f\u0440\u044f\u043c\u043e: \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0434\u0432\u0430\u0436\u0434\u044b \u0438 \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e <code>Eval<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u0435\u0442\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u0438\u043c\u0451\u043d. \u0412 stdlib \u043d\u0430 \u0438\u043c\u044f <code>rand<\/code> \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u044e\u0442 \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0430 \u043f\u0430\u043a\u0435\u0442\u0430, <code>math\/rand<\/code> \u0438 <code>crypto\/rand<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 <code>ImportUsed<\/code> \u0434\u0430\u0451\u0442 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0441\u0432\u043e\u0451: <code>math_rand<\/code> \u0438 <code>crypto_rand<\/code>. \u0412 \u0441\u0435\u0441\u0441\u0438\u0438 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code>&gt; math_rand.Intn(1)0&gt; rand.Intn(1)1:28: undefined: rand<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u043f\u0430\u043a\u0435\u0442\u0430\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043d\u0435 \u0441\u043f\u0430\u0441\u0430\u0435\u0442, \u0438\u0445 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u043c\u044b \u0440\u0430\u0437\u0432\u043e\u0434\u0438\u043c \u0441\u0430\u043c\u0438 \u0432 <code>Exports()<\/code>, <a href=\"#%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B-%D1%81-importused-%D0%B8%D0%BC%D1%8F-%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%B0--%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%B9-%D1%81%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82-%D0%BA%D0%BB%D1%8E%D1%87%D0%B0\" rel=\"noopener nofollow\">\u0434\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440<\/a>.<\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043c\u044f, \u0430 \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0435\u0442: \u0441\u0442\u0430\u0440\u043e\u0435 \u0438\u043c\u044f <code>ImportUsed<\/code> \u0438\u0437 \u0441\u043a\u043e\u0443\u043f\u0430 \u0443\u0434\u0430\u043b\u044f\u0435\u0442. \u041f\u043e\u043a\u0430 \u0432 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u043c \u043a\u043e\u0434\u0435 \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 <code>Eval<\/code>, \u043d\u0430\u0431\u043e\u0440 \u0438\u043c\u0451\u043d \u043e\u0442 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b\u0438 \u043e\u0431\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430. \u041d\u043e \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0442\u0440\u043e\u043a \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043e\u0434\u0430 \u0443\u0441\u043f\u0435\u0432\u0430\u0435\u0442 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u043e \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f, \u0438 \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u0435\u0448\u0435\u0432\u043b\u0435, \u0447\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0437\u0430\u043d\u043e\u0432\u043e.<\/p>\n<p><strong>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/strong> <code>ImportUsed<\/code> \u0431\u0438\u043d\u0434\u0438\u0442 \u043f\u0430\u043a\u0435\u0442\u044b, <code>import .<\/code> \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0438 \u0441\u0435\u0441\u0441\u0438\u044f \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0441 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0432\u0432\u043e\u0434\u0430.<\/p>\n<h4>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 ImportUsed: \u0438\u043c\u044f \u043f\u0430\u043a\u0435\u0442\u0430 = \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u043a\u043b\u044e\u0447\u0430<\/h4>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0435\u0437\u0434\u0430 \u043d\u0430 <code>ImportUsed<\/code> \u0442\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u0430\u0441\u044c:<\/p>\n<pre><code>&gt; orders.UpdateAttrs{}         &lt;- \u0420\u0410\u0411\u041e\u0422\u0410\u0415\u0422&gt; pagination.Settings{Page: 1} &lt;- \u0420\u0410\u0411\u041e\u0422\u0410\u0415\u0422&gt; uuid.Parse(\"...\")            &lt;- \u0420\u0410\u0411\u041e\u0422\u0410\u0415\u0422&gt; models.Order{}               &lt;- undefined type&gt; models.Item{}                &lt;- undefined type<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0430\u043a\u0435\u0442\u044b \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e, extract \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043f\u043e \u0432\u0441\u0435\u043c, \u043f\u043e\u0447\u0435\u043c\u0443 \u0436\u0435 \u0434\u043e\u043c\u0435\u043d\u044b \u0432\u0438\u0434\u043d\u044b, \u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0435\u0442? \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043e\u0442\u0432\u0435\u0442 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0435 <code>ImportUsed<\/code>:<\/p>\n<pre><code class=\"go\">for k := range interp.binPkg {    name := path.Base(k)        \/\/ \u0438\u043c\u044f \u0432 \u0441\u043a\u043e\u0443\u043f\u0435 = \u041f\u041e\u0421\u041b\u0415\u0414\u041d\u0418\u0419 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u043a\u043b\u044e\u0447\u0430    ...}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043a\u043b\u044e\u0447\u0438. <strong>extract \u0441\u0442\u0440\u043e\u0438\u0442 \u043a\u043b\u044e\u0447 \u043a\u0430\u043a \u043f\u0443\u0442\u044c + \u0438\u043c\u044f \u043f\u0430\u043a\u0435\u0442\u0430<\/strong>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 \u0434\u043e\u043c\u0435\u043d\u043e\u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c. \u0410 \u0432\u043e\u0442 \u043f\u0430\u043a\u0435\u0442 <code>models<\/code> \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432 <strong>\u043e\u0431\u043e\u0438\u0445<\/strong> \u0434\u043e\u043c\u0435\u043d\u0430\u0445:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041a\u043b\u044e\u0447<\/p>\n<\/th>\n<th>\n<p align=\"left\"><code>path.Base<\/code><\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0418\u0442\u043e\u0433<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">github.com\/google\/uuid\/uuid<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>uuid<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u043e\u0432\u043f\u0430\u043b\u043e \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">cosy-console\/pkg\/pagination\/pagination<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>pagination<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u043e\u0432\u043f\u0430\u043b\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">cosy-console\/internal\/domain\/orders\/orders<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>orders<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u043e\u0432\u043f\u0430\u043b\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">cosy-console\/internal\/domain\/orders\/models\/models<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>models<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">cosy-console\/internal\/domain\/catalog\/models\/models<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>models<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0442\u043e \u0436\u0435 \u0438\u043c\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0414\u0432\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u044e\u0442 \u043d\u0430 \u043e\u0434\u043d\u043e \u0438\u043c\u044f <code>models<\/code>. \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, Yaegi \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443: \u0434\u043e\u043a-\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 <code>ImportUsed<\/code> \u043e\u0431\u0435\u0449\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0434\u0443\u0445\u0435 <code>math_rand<\/code>\/<code>crypto_rand<\/code>. \u0427\u0438\u0442\u0430\u0435\u043c \u043a\u043e\u0434 \u0438 \u0432\u0438\u0434\u0438\u043c, \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430 \u043d\u0430\u0448\u0438\u0445 \u043f\u0443\u0442\u044f\u0445 \u044d\u0442\u043e \u043d\u0435 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442:<\/p>\n<pre><code class=\"go\">\/\/ Handle collision by renaming old and new entries.name2 := key2name(fixKey(sym.typ.path))sc.sym[name2] = symif name2 != name {    delete(sc.sym, name)   \/\/ \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0438\u043c\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><code>fixKey<\/code> \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435\u043c <strong>\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439<\/strong> \u0441\u043b\u044d\u0448 \u043f\u0443\u0442\u0438. \u0412 stdlib \u043f\u0443\u0442\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435, \u0438 \u0432\u0441\u0451 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f: <code>math\/rand<\/code> \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f <code>math_rand<\/code>, \u0442\u0430\u043a\u043e\u0435 \u0438\u043c\u044f \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0431\u0440\u0430\u0442\u044c. \u0423 \u043d\u0430\u0441 \u043f\u0443\u0442\u044c \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u0439, <code>cosy-console\/internal\/domain\/orders\/models<\/code> \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f <code>cosy-console\/internal\/domain\/orders_models<\/code>, \u0430 \u044d\u0442\u043e \u043d\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u043d\u0430\u0431\u0440\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0441\u0435\u0441\u0441\u0438\u0438 \u043d\u0435\u043b\u044c\u0437\u044f. \u041f\u0440\u043e\u0441\u0442\u043e\u0435 <code>models<\/code> \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0443\u0436\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u043e.<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043b\u0438 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0435: \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b <strong>\u043e\u0431\u0430<\/strong> \u043f\u0430\u043a\u0435\u0442\u0430, \u043d\u0435\u0442 \u043d\u0438 <code>models<\/code>, \u043d\u0438 <code>orders_models<\/code>, \u043d\u0438 \u0447\u0435\u0433\u043e-\u043b\u0438\u0431\u043e \u0435\u0449\u0451. \u041a\u0442\u043e \u0438\u0437 \u043d\u0438\u0445 \u0437\u0430\u043d\u044f\u043b \u0431\u044b \u0438\u043c\u044f, \u0435\u0441\u043b\u0438 \u0431\u044b \u0435\u0433\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u043b\u0438, \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e map, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439.<\/p>\n<h4>\u0424\u0438\u043a\u0441\u0438\u043c: \u043f\u043e\u0434\u043c\u0435\u043d\u0430 \u043a\u043b\u044e\u0447\u0435\u0439 \u043f\u043e\u0441\u043b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438<\/h4>\n<p>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0430\u0434\u043e \u043d\u0435 \u043f\u043e\u0434 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0443\u0442\u044f\u043c\u0438, \u0430 \u043f\u043e\u0434 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u0432\u0438\u0434\u0430 <code>console\/&lt;\u0438\u043c\u044f&gt;\/&lt;\u0438\u043c\u044f&gt;<\/code>, \u0433\u0434\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u0438 \u0435\u0441\u0442\u044c \u0438\u043c\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0441\u0435\u0441\u0441\u0438\u044f. \u0421\u0430\u043c extract \u0442\u0430\u043a \u043d\u0435 \u0443\u043c\u0435\u0435\u0442: \u043a\u043b\u044e\u0447 \u043e\u043d \u0441\u0442\u0440\u043e\u0438\u0442 \u0436\u0451\u0441\u0442\u043a\u043e, \u043a\u0430\u043a <code>&lt;import path&gt;\/&lt;\u0438\u043c\u044f \u043f\u0430\u043a\u0435\u0442\u0430&gt;<\/code>, \u0438 \u043d\u0438 \u043e\u0434\u0438\u043d \u0435\u0433\u043e \u0444\u043b\u0430\u0433 \u043d\u0430 \u044d\u0442\u043e \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442. \u0417\u043d\u0430\u0447\u0438\u0442, \u043a\u043b\u044e\u0447\u0438 \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c \u0448\u0430\u0433\u043e\u043c \u043f\u043e\u0441\u043b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438. \u0412\u043e\u0442 \u043a\u0430\u043a\u0438\u043c\u0438 \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0442\u0430\u0442\u044c:<\/p>\n<pre><code>\u043a\u043b\u044e\u0447 \u043e\u0442 extract                                      \u043f\u043e\u0434 \u043a\u0430\u043a\u0438\u043c \u043a\u043b\u044e\u0447\u043e\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043ccosy-console\/internal\/domain\/orders\/orders           console\/orders\/orderscosy-console\/internal\/domain\/orders\/models\/models    console\/orders_models\/orders_modelscosy-console\/internal\/domain\/catalog\/models\/models   console\/catalog_models\/catalog_models<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u0435\u0433\u043c\u0435\u043d\u0442 <code>console\/<\/code> \u0432 \u044d\u0442\u0438\u0445 \u043a\u043b\u044e\u0447\u0430\u0445 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442: \u043a\u043b\u044e\u0447 \u043e\u0431\u044f\u0437\u0430\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043a\u0430\u043a \u043f\u0443\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0434 \u0438\u043c\u0435\u043d\u0435\u043c \u043d\u0443\u0436\u0435\u043d \u0445\u043e\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442. Yaegi \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442, \u0442\u0430\u043a \u0447\u0442\u043e \u0432 \u0441\u0435\u0441\u0441\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 <code>orders<\/code>, \u0430 \u043d\u0435 <code>console.orders<\/code>. \u0421 \u043f\u0441\u0435\u0432\u0434\u043e\u043f\u0430\u043a\u0435\u0442\u043e\u043c <code>console\/console<\/code>, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0435\u0437\u0436\u0430\u044e\u0442 <code>App<\/code> \u0438 <code>Ctx<\/code>, \u044d\u0442\u0438 \u043a\u043b\u044e\u0447\u0438 \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u044b: \u0442\u0430\u043c <code>console<\/code> \u0431\u044b\u043b\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u0430, \u0437\u0434\u0435\u0441\u044c \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0447\u0430\u043b\u043e \u043f\u043e\u0434\u043c\u0435\u043d\u0451\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430.<\/p>\n<p>\u0417\u0430\u043e\u0434\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430 (<code>orders_models<\/code>, <code>catalog_models<\/code>) \u0432 REPL \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u043e\u0434\u043d\u043e \u043c\u043d\u043e\u0433\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0435 <code>models<\/code>.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e. \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0435\u043c \u0432\u043e\u0432\u0441\u0435: \u043f\u0440\u0430\u0432\u043a\u0438 \u0438\u0441\u0447\u0435\u0437\u043d\u0443\u0442 \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0436\u0435 \u0440\u0435\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438, \u0438 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u044f \u0432\u0435\u0440\u043d\u0451\u0442\u0441\u044f. \u041f\u0435\u0440\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u0435\u0440\u0436\u0430\u043b\u0430 \u0440\u0443\u043a\u043e\u043f\u0438\u0441\u043d\u0443\u044e \u043c\u0430\u043f\u0443 \u00ab\u0438\u043c\u044f \u0432 \u0441\u0435\u0441\u0441\u0438\u0438 -&gt; extract-\u043a\u043b\u044e\u0447\u00bb \u0434\u043b\u044f \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0449\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u043d\u043e \u044d\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0432\u0441\u0451 \u0442\u043e\u0442 \u0436\u0435 \u0440\u0443\u0447\u043d\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a: \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0434\u043e\u043c\u0435\u043d \u0441 models, \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c \u0441\u0442\u0440\u043e\u043a\u0443. \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0443\u0431\u0440\u0430\u043b\u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u0432\u0441\u0435: \u0438\u043c\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0437 \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430. \u0427\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u0432\u0438\u0434\u043d\u043e, \u043a\u0430\u043a \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u043d\u0430\u0445\u043e\u0434\u044f\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430, \u043f\u043e\u043a\u0430\u0436\u0443 \u043e\u0431\u0435 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f:<\/p>\n<pre><code class=\"go\">\/\/ internal\/console\/symbols\/orders.go\/\/ Code generated by 'yaegi extract cosy-console\/internal\/domain\/orders'. DO NOT EDIT.package symbolsfunc init() {    Symbols[\"cosy-console\/internal\/domain\/orders\/orders\"] = map[string]reflect.Value{        \"UpdateAttrs\": reflect.ValueOf((*orders.UpdateAttrs)(nil)),        ...    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0418 \u0432 \u0442\u043e\u043c \u0436\u0435 \u043f\u0430\u043a\u0435\u0442\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>Exports<\/code>:<\/p>\n<pre><code class=\"go\">\/\/ internal\/console\/symbols\/symbols.gopackage symbols\/\/ Symbols \u044d\u0442\u043e \u043e\u0431\u0449\u0430\u044f \u043c\u0430\u043f\u0430 \u043f\u0430\u043a\u0435\u0442\u0430. \u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0430 \u043f\u0443\u0441\u0442\u043e\u0439, \u0430 \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0435\u0451 init()\/\/ \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0434 \u0441\u0432\u043e\u0438\u043c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c import path.var Symbols = interp.Exports{}\/\/ Exports \u043e\u0442\u0434\u0430\u0451\u0442 \u0432\u0441\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0434 \u043f\u043e\u0434\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u043c\u0438 \u043a\u043b\u044e\u0447\u0430\u043c\u0438.\/\/ \u0418\u043c\u044f \u0432 \u0441\u0435\u0441\u0441\u0438\u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0437 \u043a\u043b\u044e\u0447\u0430: \u0443 \u043f\u0430\u043a\u0435\u0442\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u044d\u0442\u043e \u0438\u043c\u044f\/\/ \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430, \u0443 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 &lt;\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c&gt;_&lt;\u0438\u043c\u044f&gt;.func Exports() (interp.Exports, error) {    paths := importPaths() \/\/ \u043f\u0443\u0442\u0438 \u0432\u0441\u0435\u0445 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432    exports := interp.Exports{}    owners := map[string]string{}    for key, syms := range Symbols {        name := path.Base(key) \/\/ \"orders\", \"models\", ...        \/\/ \u0432\u043b\u043e\u0436\u0435\u043d \u0432 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u043e\u043c\u0435\u043d -&gt; \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f        if parent, ok := parentPackage(importPath(key), paths); ok {            name = path.Base(parent) + \"_\" + name \/\/ \"orders_models\"        }        \/\/ \u0438\u043c\u044f \u043d\u0435 \u0432\u044b\u0432\u0435\u043b\u043e\u0441\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e: \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u0431\u043e\u0438\u0445 \u0432\u0438\u043d\u043e\u0432\u043d\u0438\u043a\u043e\u0432        if prev, dup := owners[name]; dup {            return nil, fmt.Errorf(                \"session name %q claimed by both %s and %s\", name, prev, key)        }        owners[name] = key        exports[\"console\/\"+name+\"\/\"+name] = syms    }    return exports, nil}\/\/ importPath \u043e\u0442\u0440\u0435\u0437\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442: extract \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u0430\u043a\u0435\u0442 \u043a\u0430\u043a\/\/ path.Join(importPath, packageName).func importPath(key string) string {    return strings.TrimSuffix(key, \"\/\"+path.Base(key))}func importPaths() []string { \/* \u043f\u0443\u0442\u0438 \u0438\u0437 \u0432\u0441\u0435\u0445 \u043a\u043b\u044e\u0447\u0435\u0439 Symbols *\/ }\/\/ parentPackage \u0438\u0449\u0435\u0442 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0439 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439\/\/ \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043a\u0430\u043a \u043f\u043e\u0434\u043a\u0430\u0442\u0430\u043b\u043e\u0433: ...\/orders\/models \u0432\u043b\u043e\u0436\u0435\u043d \u0432 ...\/orders.func parentPackage(pkgPath string, paths []string) (string, bool) { \/* ... *\/ }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0427\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u043b\u0435\u0436\u0438\u0442 \u0432 <code>exports<\/code> \u0438 \u0443\u0445\u043e\u0434\u0438\u0442 \u0432 <code>i.Use<\/code>:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u043a\u043b\u044e\u0447 \u0432 <code>Symbols<\/code> (\u043e\u0442 extract)<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0432\u044b\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0435 \u0438\u043c\u044f<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u043a\u043b\u044e\u0447 \u0432 <code>Exports()<\/code><\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0438\u043c\u044f \u0432 \u0441\u0435\u0441\u0441\u0438\u0438<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">cosy-console\/internal\/domain\/orders\/orders<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>orders<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>console\/orders\/orders<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>orders<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">cosy-console\/internal\/domain\/orders\/models\/models<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>orders_models<\/code> (\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c <code>orders<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>console\/orders_models\/orders_models<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>orders_models<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">cosy-console\/internal\/domain\/catalog\/catalog<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>catalog<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>console\/catalog\/catalog<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>catalog<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">cosy-console\/internal\/domain\/catalog\/models\/models<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>catalog_models<\/code> (\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c <code>catalog<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>console\/catalog_models\/catalog_models<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>catalog_models<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">cosy-console\/pkg\/pagination\/pagination<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>pagination<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>console\/pagination\/pagination<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>pagination<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">github.com\/google\/uuid\/uuid<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>uuid<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>console\/uuid\/uuid<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>uuid<\/code><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>\u0413\u0434\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043b\u0438\u044f\u043d\u0438\u0435.<\/strong> \u041d\u0438\u0433\u0434\u0435 \u044f\u0432\u043d\u043e: \u043e\u0431\u0435 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u043f\u0438\u0448\u0443\u0442 \u0438 \u0447\u0438\u0442\u0430\u044e\u0442 \u043e\u0434\u043d\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043f\u0430\u043a\u0435\u0442\u0430. <code>symbols.go<\/code> \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442 <code>Symbols<\/code> \u043f\u0443\u0441\u0442\u043e\u0439, <code>init()<\/code> \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u043a\u043b\u0430\u0434\u0451\u0442 \u0442\u0443\u0434\u0430 \u0441\u0432\u043e\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u043e\u0434 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0443\u0442\u0451\u043c, \u0438 \u043a \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0432\u044b\u0437\u043e\u0432\u0430 <code>Exports<\/code> \u0432 \u043c\u0430\u043f\u0435 \u043b\u0435\u0436\u0430\u0442 \u0432\u0441\u0435 \u0434\u043e\u043c\u0435\u043d\u044b \u0440\u0430\u0437\u043e\u043c. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u00ab\u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435\u00bb \u043d\u0435\u0442, \u0435\u0433\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0430\u043c \u044f\u0437\u044b\u043a: \u0444\u0430\u0439\u043b\u044b \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0432\u0438\u0434\u044f\u0442 \u043e\u0434\u043d\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043d\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442 <code>symbols.go<\/code> \u0438 \u043d\u0435 \u0437\u043d\u0430\u044e\u0442 \u0434\u0440\u0443\u0433 \u043e \u0434\u0440\u0443\u0433\u0435. \u0420\u043e\u0432\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043b\u043e\u043c\u0430\u0435\u0442: \u0438\u043c\u0435\u043d\u0430 \u0432 \u0441\u0435\u0441\u0441\u0438\u0438 \u0432\u044b\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0438\u0437 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e extract \u0443\u0436\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b, \u0430 \u043d\u0435 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0442\u043e-\u0442\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c.<\/p>\n<p><strong>\u0414\u0443\u0431\u043b\u0438\u043a\u0430\u0442 \u0438\u043c\u0435\u043d\u0438 \u044d\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430.<\/strong> \u0412 \u0441\u0442\u043e\u043a\u043e\u0432\u043e\u043c <code>ImportUsed<\/code> \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u044e \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e map, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439. \u0417\u0434\u0435\u0441\u044c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u043c\u0451\u043d \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u043d\u043e: \u0434\u0432\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u0430 \u0431\u0435\u0437 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0439 (\u0434\u0432\u0430 \u0433\u043e\u043b\u044b\u0445 <code>models<\/code>). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f <code>owners<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u0441\u043e <strong>\u0432\u0441\u0435\u043c\u0438<\/strong> \u0432\u0438\u043d\u043e\u0432\u043d\u0438\u043a\u0430\u043c\u0438: \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u043a\u0430\u043a\u0438\u0435 \u043a\u043b\u044e\u0447\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c, \u0430 \u043d\u0435 \u043c\u043e\u043b\u0447\u0430 \u0432\u044b\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b \u0440\u0443\u043a\u0430\u043c\u0438 \u0438\u043b\u0438 \u043d\u0430\u0434\u0435\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<h3>\u0410\u043a\u0442 4: \u0433\u0440\u0430\u0431\u043b\u0438 \u0441\u0430\u043c\u043e\u0433\u043e REPL<\/h3>\n<p><strong>\u041c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/strong> \u042d\u0442\u043e \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0438 \u043f\u043e\u0442\u043e\u043c\u0443 \u0441\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e: \u0441\u0442\u043e\u043a\u043e\u0432\u044b\u0439 REPL \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0443\u0435\u0442 \u043d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u0436\u0434\u0451\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f. \u041f\u043e\u043a\u0430 \u0441\u043a\u043e\u0431\u043a\u0430 \u043d\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0430, \u0432\u0432\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u0441\u0442\u0440\u043e\u043a, \u0445\u043e\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0446\u0435\u043b\u0438\u043a\u043e\u043c:<\/p>\n<pre><code>&gt; err := App.Shared.Tx.InTransaction(Ctx, func(ctx context.Context) error {&gt; order, err := App.Orders.Repos.OrderRepo.Get(ctx, id)&gt; if err != nil {&gt; return err&gt; }&gt; fmt.Println(order.Status)&gt; return nil&gt; })<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e REPL \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0432\u043e\u0434 \u043d\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d, \u0438 \u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435. \u0422\u0430\u043a \u0434\u0435\u043b\u0430\u0435\u0442 <code>psql<\/code>: \u043f\u043e\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0435 \u0437\u0430\u043a\u0440\u044b\u0442 \u0442\u043e\u0447\u043a\u043e\u0439 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439, \u043e\u043d \u0436\u0434\u0451\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c:<\/p>\n<pre><code class=\"sql\">shop=# SELECT id,shop-#        name          &lt;- \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u0441\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u043d\u0430 \u00ab-#\u00bb: \u0432\u0432\u043e\u0434 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044fshop-# FROM orders;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0423 Yaegi \u044d\u0442\u043e\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435\u0442, \u0438 \u044d\u0442\u043e \u043d\u0435 \u0434\u0438\u0437\u0430\u0439\u043d, \u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435. \u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u0443 \u043d\u0435\u0433\u043e \u043e\u0434\u043d\u043e \u043d\u0430 \u0432\u0441\u0435 \u0441\u043b\u0443\u0447\u0430\u0438:<\/p>\n<pre><code>&gt; err := App.Shared.Tx.InTransaction(Ctx, func(ctx context.Context) error {&gt; order, err := App.Orders.Repos.OrderRepo.Get(ctx, id)   &lt;- \u0442\u043e \u0436\u0435 \u00ab&gt; \u00bb, \u0445\u043e\u0442\u044f&gt; return err                                              \u0432\u0432\u043e\u0434 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f&gt; })<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e Enter REPL \u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043d\u043e\u0435. \u041f\u0430\u0440\u0441\u0435\u0440 \u0441\u043f\u043e\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u043a\u043e\u043d\u0446\u0435 \u0432\u0432\u043e\u0434\u0430, \u0437\u043d\u0430\u0447\u0438\u0442, \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u0434\u043e\u043f\u0438\u0441\u0430\u043d\u043e: \u0441\u0442\u0440\u043e\u043a\u0430 \u043c\u043e\u043b\u0447\u0430 \u0443\u0445\u043e\u0434\u0438\u0442 \u0432 \u0431\u0443\u0444\u0435\u0440, \u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 Enter \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0443\u0436\u0435 \u0441 \u043d\u0435\u0439. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u00ab\u0436\u0434\u0443 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f\u00bb \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0442, \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0443\u0434\u0430\u0432\u0448\u0430\u044f\u0441\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0432 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0438 \u043d\u0435\u0447\u0435\u0433\u043e. REPL \u0432 Yaegi \u044d\u0442\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442. \u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0432\u0432\u043e\u0434\u0430 \u0441 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0441-\u0446\u0438\u043a\u043b, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432 \u043a\u043e\u0434\u0435 \u043d\u0435\u0442. \u041e\u0442\u0441\u044e\u0434\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u043e: <strong>\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0432\u044b\u0432\u043e\u0434, \u0430 \u043d\u0435 \u043d\u0430 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435<\/strong>. \u041f\u043e\u0441\u043b\u0435 Enter \u0442\u0438\u0445\u043e, \u0437\u043d\u0430\u0447\u0438\u0442, \u0441\u0442\u0440\u043e\u043a\u0430 \u0443\u0448\u043b\u0430 \u0432 \u0431\u0443\u0444\u0435\u0440, \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435. \u041f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0430, \u0437\u043d\u0430\u0447\u0438\u0442, \u0432\u0432\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f.<\/p>\n<p>\u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0447\u043a\u0438: \u0440\u0430\u0437\u043e\u0440\u0432\u0430\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043d\u0435\u043b\u044c\u0437\u044f.<\/p>\n<pre><code>&gt; s := fmt.&gt; Sprintf(\"%d\", 7)&gt; s3:1: expected selector or type assertion, found '}'    &lt;- \u0432 \u0432\u0432\u043e\u0434\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u0442 '}'1:28: undefined: Sprintf1:28: undefined: s<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u041f\u0440\u0430\u0432\u0438\u043b\u043e<\/strong>: \u043d\u0435 \u0440\u0430\u0437\u0440\u044b\u0432\u0430\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0447\u043a\u0438, \u043f\u0438\u0448\u0438\u0442\u0435 <code>fmt.Sprintf(...)<\/code> \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0435 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u0445.<\/p>\n<p><strong>\u0423 Ctrl+C \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0434\u0438\u043d \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a.<\/strong> \u0421\u0442\u043e\u043a\u043e\u0432\u044b\u0439 REPL \u0441\u0430\u043c \u043b\u043e\u0432\u0438\u0442 SIGINT \u0438 \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0438 \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e: \u043f\u0440\u043e\u043c\u043f\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f, \u0441\u0435\u0441\u0441\u0438\u044f \u0436\u0438\u0432\u0451\u0442. \u041d\u0430\u0448 \u043f\u0435\u0440\u0432\u044b\u0439 <code>main()<\/code> \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u043c\u0443 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0443 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430: <code>signal.NotifyContext(ctx, os.Interrupt, syscall.SIGTERM)<\/code>. \u041f\u0435\u0440\u0432\u043e\u0435 \u0436\u0435 Ctrl+C \u043b\u043e\u0432\u0438\u043b\u0438 <strong>\u043e\u0431\u0430<\/strong> \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430: REPL \u043e\u0442\u043c\u0435\u043d\u044f\u043b \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0430 NotifyContext \u043e\u0442\u043c\u0435\u043d\u044f\u043b \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0432 \u0441\u0435\u0441\u0441\u0438\u044e \u043a\u0430\u043a <code>Ctx<\/code>.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u044d\u0442\u043e \u0441\u0435\u0441\u0441\u0438\u044f-\u0437\u043e\u043c\u0431\u0438: \u043f\u0440\u043e\u043c\u043f\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0436\u0438\u0432\u0443\u0442, \u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>App.*.*(Ctx, ...)<\/code> \u0443\u043c\u0438\u0440\u0430\u0435\u0442 \u0441 <code>context canceled<\/code>, \u0438 \u0442\u0430\u043a \u0434\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439: <code>Ctx.Err()<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>&lt;nil&gt;<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>context canceled<\/code>.<\/p>\n<p>\u0418 \u043e\u0434\u043d\u0430 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0430 \u043f\u0440\u043e \u0441\u0430\u043c\u043e Ctrl+C: \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430, \u0430 \u0443\u0436\u0435 \u043d\u0430\u0447\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u0432\u044b\u0437\u043e\u0432 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043e \u043a\u043e\u043d\u0446\u0430. \u041f\u0440\u043e\u043c\u043f\u0442 \u0432\u0435\u0440\u043d\u0451\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443, \u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0431\u0430\u0437\u0435 \u043f\u0440\u0435\u0440\u0432\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e <code>statement_timeout<\/code> \u0438\u043b\u0438 \u043e\u0442\u043c\u0435\u043d\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u044d\u0442\u043e\u0442 \u0432\u044b\u0437\u043e\u0432 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438.<\/p>\n<p>\u0421\u0434\u0435\u043b\u0430\u043b\u0438 \u0444\u0438\u043a\u0441, \u0442\u0435\u043f\u0435\u0440\u044c SIGINT \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0443 REPL, \u0438\u043c \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0437\u0430 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u043c \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0430 <code>main()<\/code> \u0441\u043b\u0443\u0448\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e SIGTERM. \u0418\u0437 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b <code>Run<\/code> \u044d\u0442\u043e \u043d\u0435 \u0432\u0438\u0434\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0438 \u0435\u0433\u043e \u0441\u0442\u043e\u0438\u0442 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0435: \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u0435\u0441\u0441\u0438\u044e, \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043c\u0438\u0440\u0430\u0442\u044c \u043e\u0442 SIGINT.<\/p>\n<p><code><strong>err := f()<\/strong><\/code><strong> \u043c\u043e\u043b\u0447\u0430 \u0431\u0435\u0440\u0451\u0442 \u043f\u0435\u0440\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/strong> <code>Update<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, <code>(models.Order, error)<\/code>. \u0412 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u043a\u043e\u0434\u0435 <code>err := Update(...)<\/code> \u043d\u0435 \u0441\u043e\u0431\u0435\u0440\u0451\u0442\u0441\u044f, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u043a\u0430\u0436\u0435\u0442 <code>assignment mismatch: 1 variable but ... returns 2 values<\/code>. Yaegi \u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0438 \u043a\u043b\u0430\u0434\u0451\u0442 \u0432 <code>err<\/code> \u043f\u0435\u0440\u0432\u043e\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0451\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0442\u043e \u0435\u0441\u0442\u044c \u0437\u0430\u043a\u0430\u0437:<\/p>\n<pre><code>&gt; err := App.Orders.Repos.OrderRepo.Update(Ctx, id, attrs)   &lt;- \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0442\u0430\u043a&gt; err{0 00000000-... {false 0} ...}                      &lt;- \u0430 \u044d\u0442\u043e Order, \u043d\u0435 error<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u0430\u043c\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u0430. \u0412 <code>err<\/code> \u043b\u0435\u0436\u0438\u0442 \u0437\u0430\u043a\u0430\u0437, \u0430 \u0443\u043f\u0430\u043b \u0432\u044b\u0437\u043e\u0432 \u0438\u043b\u0438 \u043d\u0435\u0442, \u043f\u043e \u043d\u0435\u043c\u0443 \u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u044c: \u0443 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0442\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0443\u043b\u0435\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430. \u041f\u0438\u0448\u0438\u0442\u0435 \u043e\u0431\u0430 \u0438\u043c\u0435\u043d\u0438, <code>res, err := ...<\/code>.<\/p>\n<h3>\u0420\u0430\u0431\u043e\u0447\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435: \u0442\u0440\u0438 \u0447\u0430\u0441\u0442\u0438 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 (\u043f\u0430\u043a\u0435\u0442 \u043a\u043e\u043d\u0441\u043e\u043b\u0438, \u0441\u0438\u043c\u0432\u043e\u043b\u044b, entry point) \u0438 \u0434\u0432\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 Dockerfile. \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 (<code>runEval<\/code>, <code>Options<\/code>, <code>importPaths<\/code>, <code>parentPackage<\/code>) \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0437\u0430 \u043a\u0430\u0434\u0440\u043e\u043c, \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043e\u043d\u043e \u0435\u0441\u0442\u044c \u0432 <a href=\"https:\/\/github.com\/vladimirtcats\/cosy-console\" rel=\"noopener nofollow\">cosy-console<\/a>.<\/p>\n<h4>1. \u041f\u0430\u043a\u0435\u0442 console: \u0441\u0431\u043e\u0440\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u0438 \u0434\u0432\u0430 \u0438\u043c\u0435\u043d\u0438<\/h4>\n<pre><code class=\"go\">\/\/ internal\/console\/console.gofunc Run(ctx context.Context, container *app.Container, opts Options) error {    i, err := newInterpreter(ctx, container, opts)    if err != nil {        return err    }    if opts.Eval != \"\" {  \/\/ \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u0439 \u0440\u0435\u0436\u0438\u043c: -e '\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435'        return runEval(ctx, i, opts.Eval, opts.Stdout)    }    return runREPL(ctx, i)}\/\/ newInterpreter \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440: stdlib, \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f,\/\/ \u043f\u0441\u0435\u0432\u0434\u043e\u043f\u0430\u043a\u0435\u0442 \u0441 App \u0438 Ctx, \u0437\u0430\u0442\u0435\u043c \u0431\u0438\u043d\u0434\u0438\u043d\u0433 \u0438\u043c\u0451\u043d.func newInterpreter(    ctx context.Context, container *app.Container, opts Options,) (*interp.Interpreter, error) {    i := interp.New(interp.Options{        Stdin:  opts.Stdin,   \/\/ nil = \u043f\u043e\u0442\u043e\u043a\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430; \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432        Stdout: opts.Stdout,        Stderr: opts.Stderr,    })    if err := i.Use(stdlib.Symbols); err != nil {        return nil, fmt.Errorf(\"use stdlib symbols: %w\", err)    }    symbolsExports, err := symbols.Exports()    if err != nil {        return nil, fmt.Errorf(\"build console symbols: %w\", err)    }    if err := i.Use(symbolsExports); err != nil {        return nil, fmt.Errorf(\"use app symbols: %w\", err)    }    if err := i.Use(exports(ctx, container)); err != nil {        return nil, fmt.Errorf(\"use console exports: %w\", err)    }    \/\/ \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442 \u0438\u043c\u0435\u043d\u0430 \u0432\u0441\u0435\u0445 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442    \/\/ CLI-REPL \u0441\u0430\u043c\u043e\u0433\u043e yaegi. \u0421\u0442\u0440\u043e\u0433\u043e \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e Eval: ImportUsed \u043c\u043e\u0436\u0435\u0442    \/\/ \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b.    i.ImportUsed()    \/\/ \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430, \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u0430\u044f \u0437\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f: App \u0438 Ctx \u043b\u0435\u0436\u0430\u0442 \u0432    \/\/ \u043f\u0441\u0435\u0432\u0434\u043e\u043f\u0430\u043a\u0435\u0442\u0435, dot-import \u043a\u043b\u0430\u0434\u0451\u0442 \u043e\u0431\u0430 \u0438\u043c\u0435\u043d\u0438 \u0432 \u0441\u043a\u043e\u0443\u043f \u0441\u0435\u0441\u0441\u0438\u0438.    if _, err := i.Eval(`import . \"console\"`); err != nil {        return nil, fmt.Errorf(\"import console: %w\", err)    }    return i, nil}\/\/ \u041e\u0448\u0438\u0431\u043a\u0443 i.REPL() \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e: \u044d\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e\/\/ \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, REPL \u0435\u0451 \u0443\u0436\u0435 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u043b \u0432 stderr, \u0438 \u0447\u0438\u0441\u0442\u044b\u0439 \u0432\u044b\u0445\u043e\u0434 \u043f\u043e Ctrl+D\/\/ \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441.func runREPL(ctx context.Context, i *interp.Interpreter) error {    done := make(chan struct{})    go func() {        defer close(done)        _, _ = i.REPL()    }()    select {    case &lt;-done:        return nil    case &lt;-ctx.Done():        return ctx.Err()    }}func exports(ctx context.Context, container *app.Container) interp.Exports {    return interp.Exports{        \"console\/console\": {            \"App\": reflect.ValueOf(container),            \"Ctx\": reflect.ValueOf(ctx),        },    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h4>2. \u0421\u0438\u043c\u0432\u043e\u043b\u044b: \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u043f\u043e \u0444\u0430\u0439\u043b\u0443 \u043d\u0430 \u043f\u0430\u043a\u0435\u0442<\/h4>\n<pre><code>internal\/console\/symbols\/  orders.go           &lt;- extract \u0434\u043e\u043c\u0435\u043d\u0430 (params, \u0444\u0438\u043b\u044c\u0442\u0440\u044b, errors)  orders_models.go    &lt;- extract \u0435\u0433\u043e models (\u043c\u043e\u0434\u0435\u043b\u0438-\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043c\u0435\u0442\u043e\u0434\u043e\u0432)  catalog.go           &lt;- \u0442\u043e \u0436\u0435 \u0434\u043b\u044f catalog  catalog_models.go  pagination.go  uuid.go                 &lt;- \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0433\u043e extract  symbols.go          &lt;- var Symbols + Exports(): \u0438\u043c\u0435\u043d\u0430 \u0441\u0435\u0441\u0441\u0438\u0438 \u0438\u0437 \u043a\u043b\u044e\u0447\u0435\u0439<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0440\u0435\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0431\u0440\u0430\u043d\u0430 \u0432 <code>make console-symbols DOMAIN=&lt;\u0434\u043e\u043c\u0435\u043d&gt;<\/code>, \u0441\u043c. <a href=\"#yaegi-extract\" rel=\"noopener nofollow\">\u0440\u0430\u0437\u0431\u043e\u0440 extract<\/a>: extract \u043f\u0438\u0448\u0435\u0442 \u0444\u0430\u0439\u043b\u044b \u0441\u0440\u0430\u0437\u0443 \u0441\u044e\u0434\u0430, \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043d\u0430 \u043f\u0430\u043a\u0435\u0442. \u041a\u043b\u044e\u0447\u0438 \u0432 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 \u043d\u0435 \u043f\u0440\u0430\u0432\u044f\u0442\u0441\u044f: \u0438\u043c\u0435\u043d\u0430 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 <code>Exports()<\/code>.<\/p>\n<h4>3. Entry point: \u0444\u043b\u0430\u0433\u0438, \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u0438 read-only \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/h4>\n<pre><code class=\"go\">\/\/ cmd\/console\/main.gofunc main() {    write := flag.Bool(\"write\", false,        \"allow writes; by default the session is read-only\")    eval := flag.String(\"e\", \"\", \"evaluate a single statement and exit\")    flag.Parse()    cfg, err := config.New()    if err != nil {        log.Fatalf(\"could not start console, %v\", err)    }    l, err := logger.New(&amp;cfg)    if err != nil {        log.Fatalf(\"could not create logger, %v\", err)    }    \/\/ SIGINT \u043d\u0435 \u0441\u043b\u0443\u0448\u0430\u0435\u043c: \u043e\u043d \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 REPL (\u043e\u0442\u043c\u0435\u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f).    \/\/ \u0421\u043b\u0443\u0448\u0430\u043b\u0438 \u0431\u044b, \u0438 \u043f\u0435\u0440\u0432\u043e\u0435 Ctrl+C \u043e\u0442\u043c\u0435\u043d\u044f\u043b\u043e \u0431\u044b \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 Ctx.    ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGTERM)    defer cancel()    var opts []app.Option    if !*write {        opts = append(opts, app.WithReadOnlyDB()) \/\/ \u0437\u0430\u0449\u0438\u0442\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e    }    container := app.NewContainer(&amp;cfg, l, opts...)    if err := console.Run(ctx, container, console.Options{Eval: *eval}); err != nil {        if errors.Is(err, context.Canceled) {            return \/\/ SIGTERM: \u0447\u0438\u0441\u0442\u044b\u0439 \u0432\u044b\u0445\u043e\u0434        }        log.Fatalf(\"console exited with error: %v\", err)    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h4>\u041a\u0430\u043a \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f read-only \u0438 \u043a\u0430\u043a \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043e\u043d \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0441\u044f<\/h4>\n<p>\u0412\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0439 read-only \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 INSERT, UPDATE, DELETE, DDL \u0438 SELECT INTO. \u042d\u0442\u043e \u043d\u0435 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0451\u043d\u043d\u043e\u0441\u0442\u044c \u00ab\u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0439\u0442\u0435 console \u0441 <code>-write<\/code>\u00bb, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043b\u0435\u0433\u043a\u043e \u0437\u0430\u0431\u044b\u0442\u044c, \u0430 \u043e\u0442\u043a\u0430\u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u0430: \u0437\u0430\u043f\u0438\u0441\u044c \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0451\u0442, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0435\u0451 \u043f\u043e\u043f\u0440\u043e\u0441\u044f\u0442. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u043d \u043d\u0435 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0430 \u0432 \u043a\u043e\u0434\u0435, \u043f\u043e\u0441\u043b\u0435 \u0435\u0451 \u0440\u0430\u0437\u0431\u043e\u0440\u0430. \u041f\u0440\u0438\u0451\u043c \u0442\u043e\u0442 \u0436\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0442\u0430\u0439\u043c\u0437\u043e\u043d\u0443 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u043e <a href=\"\/writing\/postgres-timezones-three-clocks\" rel=\"noopener nofollow\">\u0442\u0440\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/a>:<\/p>\n<pre><code class=\"go\">pgxConfig, err := pgx.ParseConfig(dsn)if err != nil {    log.Fatalf(\"failed to parse postgres config: %v\", err)}pgxConfig.RuntimeParams[\"TimeZone\"] = \"UTC\"if options.readOnly {    pgxConfig.RuntimeParams[\"default_transaction_read_only\"] = \"on\"}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0435\u0441\u0441\u0438\u0438, \u0430 \u043d\u0435 \u043d\u0430\u0448\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430: \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0443\u0435\u0437\u0436\u0430\u0435\u0442 \u0432 \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u0443\u043b\u0430, \u0438 \u043e\u0442\u043a\u0430\u0437 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430:<\/p>\n<pre><code>&gt; res, err := App.Orders.Repos.OrderRepo.Update(Ctx, id, attrs)&gt; errERROR: cannot execute UPDATE in a read-only transaction (SQLSTATE 25006)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u041d\u043e \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u044c, \u0430 \u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u0430.<\/strong> <code>default_transaction_read_only<\/code> \u0437\u0430\u0434\u0430\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u0438\u0442\u044c: <code>SET TRANSACTION READ WRITE<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 <code>App.Shared.DB.Begin()<\/code> \u0441\u043d\u043e\u0432\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044c. \u041e\u0442 \u043f\u0440\u043e\u043c\u0430\u0445\u0430 \u044d\u0442\u043e \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e, \u043e\u0442 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u043d\u0435 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u0432\u043e\u0432\u0441\u0435. \u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0443\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0441\u0442\u0430\u0432\u044f\u0442 \u043f\u0440\u0430\u0432\u0430 \u0440\u043e\u043b\u0438 (\u0433\u0440\u0430\u043d\u0442\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 SELECT) \u0438\u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0440\u0435\u043f\u043b\u0438\u043a\u0435, \u0430 \u043d\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0441\u0435\u0441\u0441\u0438\u0438.<\/p>\n<p>\u0415\u0441\u0442\u044c \u0438 \u0432\u0442\u043e\u0440\u0430\u044f \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0430: \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 PgBouncer \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u043b\u043e\u0441\u044c, \u043d\u0435\u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0435 \u0435\u043c\u0443 startup-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0432 <code>ignore_startup_parameters<\/code>, \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043d\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u044f\u0435\u0442\u0441\u044f, \u0430 \u043c\u043e\u043b\u0447\u0430 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f: \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0442\u043e\u043b\u044c\u043a\u043e <strong>\u0431\u0435\u0437 \u0437\u0430\u0449\u0438\u0442\u044b<\/strong>. \u0421\u0432\u0435\u0436\u0438\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 PgBouncer \u0432 \u043f\u0430\u0440\u0435 \u0441 PostgreSQL 14 \u0438 \u043d\u043e\u0432\u0435\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442 \u0435\u0433\u043e \u0441\u0430\u043c\u0438. \u041d\u043e \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0443\u043b\u0435\u0440\u0430 \u043c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c fail-fast:<\/p>\n<pre><code class=\"go\">func validateReadOnly(sqlDB *sql.DB) {    var value string    if err := sqlDB.QueryRow(\"SHOW default_transaction_read_only\").Scan(&amp;value); err != nil {        log.Fatalf(\"failed to read default_transaction_read_only: %v\", err)    }    if !strings.EqualFold(strings.TrimSpace(value), \"on\") {        log.Fatalf(\"default_transaction_read_only is %q, expected on: \"+            \"the read-only startup parameter was overridden or stripped \"+            \"(check the connection string and pooler config)\", value)    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u042d\u0442\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u043c\u044b \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0435\u0433\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0432\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433. \u041f\u0430\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u0441 \u0432\u043d\u044f\u0442\u043d\u044b\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u0442\u0438\u0445\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0430\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u0430.<\/p>\n<p>\u041f\u043e\u043b\u043d\u0430\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0437\u0430\u0449\u0438\u0442\u044b:<\/p>\n<pre><code>make console \/ \/app\/console        (\u0431\u0435\u0437 \u0444\u043b\u0430\u0433\u0430)        |        vflag -write = false ---&gt; app.WithReadOnlyDB() ---&gt; postgres.WithReadOnly()        |        vRuntimeParams[\"default_transaction_read_only\"] = \"on\"  &lt;- \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440        |        vvalidateReadOnly: SHOW ---&gt; \u043d\u0435 \"on\" ---&gt; log.Fatalf    &lt;- \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435        |        vREPL ---&gt; UPDATE ... ---&gt; \u0441\u0435\u0440\u0432\u0435\u0440: SQLSTATE 25006       &lt;- \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u042d\u0442\u0430 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0437\u0443. \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 Kafka, Redis \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u0432\u043d\u0435\u0448\u043d\u0438\u043c API, \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0438 \u0442\u0443\u0434\u0430, \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e. \u0421\u0430\u043c\u043e\u0435 \u0434\u0435\u0448\u0451\u0432\u043e\u0435 \u044d\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u0438\u0448\u0443\u0449\u0435\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u0442\u0435\u043c \u0436\u0435 <code>app.Option<\/code>, \u0447\u0442\u043e \u0438 \u0434\u043b\u044f \u0431\u0430\u0437\u044b. \u0415\u0441\u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442 \u043d\u0443\u0436\u0435\u043d, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430: \u0432 Redis \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u044e\u0449\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0432 Kafka \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0442\u043e\u043f\u0438\u043a\u0438 \u0431\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 Write.<\/p>\n<p>\u0414\u0435\u0444\u043e\u043b\u0442 \u0432\u044b\u0431\u0440\u0430\u043d \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e. \u0417\u0430\u0431\u044b\u0442\u044c <code>-write<\/code> \u0441\u0442\u043e\u0438\u0442 \u0441\u0435\u043a\u0443\u043d\u0434\u044b: \u043f\u0435\u0440\u0432\u044b\u0439 \u0436\u0435 UPDATE \u0443\u043f\u0430\u0434\u0451\u0442. \u0417\u0430\u0431\u044b\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0444\u043b\u0430\u0433, <code>-read-only<\/code>, \u0441\u0442\u043e\u0438\u043b\u043e \u0431\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0438\u0434\u0451\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0430 \u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u044f\u0432\u043d\u043e.<\/p>\n<h3>\u041a\u0430\u043a \u044d\u0442\u043e \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c<\/h3>\n<p>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0432\u0435\u0434\u0451\u0442 \u0441\u0435\u0431\u044f \u0441\u0442\u0440\u0430\u043d\u043d\u043e:<\/p>\n<ol>\n<li>\n<p><code><strong>undefined type<\/strong><\/code><strong> \u043f\u0440\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u043e\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430.<\/strong> \u041f\u0430\u043a\u0435\u0442 \u043d\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0438\u043b\u0438 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e\u0434 \u043a\u043b\u044e\u0447\u043e\u043c, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435 \u0440\u0430\u0432\u0435\u043d \u0438\u043c\u0435\u043d\u0438 \u043f\u0430\u043a\u0435\u0442\u0430. \u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043a\u043b\u044e\u0447\u0438 \u0432 <code>symbols\/<\/code> \u0438 \u043f\u0435\u0440\u0435\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0439\u0442\u0435 extract: <code>make console-symbols DOMAIN=&lt;\u0434\u043e\u043c\u0435\u043d&gt;<\/code>, \u0444\u0430\u0439\u043b\u044b \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 (\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0432 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443\u043c\u0435 extract).<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0430\u043a\u0435\u0442 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d, \u043d\u043e \u0438\u043c\u0435\u043d\u0438 \u0432 \u0441\u0435\u0441\u0441\u0438\u0438 \u043d\u0435\u0442.<\/strong> \u0421\u043e\u0432\u043f\u0430\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u043a\u043b\u044e\u0447\u0435\u0439, \u0438 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043e\u0431\u0430 \u0438\u043c\u0435\u043d\u0438; \u043b\u0435\u0447\u0438\u0442 \u044d\u0442\u043e <code>Exports()<\/code> (\u0441\u043c. \u0440\u0430\u0437\u0434\u0435\u043b \u043f\u0440\u043e <code>ImportUsed<\/code>). \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0447\u0443\u0436\u043e\u043c \u043d\u0430\u0431\u043e\u0440\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432: \u0432\u043e\u0437\u044c\u043c\u0438\u0442\u0435 <code>rand<\/code> \u0438\u0437 stdlib, \u0438 \u0435\u0441\u043b\u0438 \u043e\u043d \u0442\u043e\u0436\u0435 <code>undefined<\/code>, \u0432\u044b \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u043d\u0430 \u0442\u0443 \u0436\u0435 \u043c\u0438\u043d\u0443 <code>crypto\/rand<\/code> \u043f\u0440\u043e\u0442\u0438\u0432 <code>math\/rand<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0443\u043c\u0438\u0440\u0430\u0435\u0442 \u0441 <\/strong><code><strong>context canceled<\/strong><\/code><strong>.<\/strong> \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 <code>Run<\/code>, \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f SIGINT (<code>NotifyContext(..., os.Interrupt)<\/code> \u0432 main). \u0414\u0438\u0430\u0433\u043d\u043e\u0437 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439: <code>Ctx.Err()<\/code>. SIGINT \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 REPL, main \u0441\u043b\u0443\u0448\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e SIGTERM.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0438\u043c\u0432\u043e\u043b\u044b \u043f\u0440\u043e\u0442\u0443\u0445\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430.<\/strong> \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u043b\u0435 \u0432 <code>UpdateAttrs<\/code>, \u0430 \u0444\u0430\u0439\u043b \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043d\u0435 \u043f\u0435\u0440\u0435\u0433\u0435\u043d\u0435\u0440\u0438\u043b\u0438. \u042d\u0442\u043e \u043d\u0435 \u043c\u043e\u043b\u0447\u0438\u0442: <code>undefined<\/code> \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u043d\u0430 \u0442\u043e\u043c \u0442\u0438\u043f\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0435\u043d\u044f\u043b\u0441\u044f.<\/p>\n<\/li>\n<\/ol>\n<h3>\u0412\u044b\u0432\u043e\u0434\u044b<\/h3>\n<ul>\n<li>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0441 \u0442\u0435\u043c \u0436\u0435 composition root: \u043a\u043e\u043d\u0444\u0438\u0433 \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u0449\u0438\u0435 \u0441 API, \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0432\u043e\u0439. \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u0442, \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u043e\u043d \u043d\u0435 \u043d\u0443\u0436\u0435\u043d.<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0441\u0435\u0441\u0441\u0438\u044e \u0443\u0445\u043e\u0434\u044f\u0442 \u0434\u0432\u0430 \u0438\u043c\u0435\u043d\u0438, <code>App<\/code> \u0438 <code>Ctx<\/code>. \u0427\u0442\u043e \u043b\u0435\u0436\u0438\u0442 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435, \u0442\u043e \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e, \u0431\u0435\u0437 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438 \u043f\u043e \u043f\u043e\u043b\u044f\u043c.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0438\u043c\u0432\u043e\u043b\u044b \u043d\u0443\u0436\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e <strong>\u0432\u0445\u043e\u0434\u043d\u044b\u043c<\/strong> \u0442\u0438\u043f\u0430\u043c, \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438. \u0421\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0442 <code>Container<\/code>, \u0430 \u043d\u0435 \u0443\u0433\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>SIGINT \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 REPL, <code>main()<\/code> \u0441\u043b\u0443\u0448\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e SIGTERM. \u0418\u043d\u0430\u0447\u0435 \u043f\u0435\u0440\u0432\u043e\u0435 Ctrl+C \u0443\u0431\u0438\u0432\u0430\u0435\u0442 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 <code>Ctx<\/code>, \u0438 \u0441\u0435\u0441\u0441\u0438\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0437\u043e\u043c\u0431\u0438.<\/p>\n<\/li>\n<li>\n<p>Read-only \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u0442\u043e\u0438\u0442 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0430 <code>SHOW<\/code> \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u043e\u043d \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0441\u044f: \u043f\u0443\u043b\u0435\u0440 \u0443\u043c\u0435\u0435\u0442 \u0441\u0440\u0435\u0437\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0438 \u0442\u043e\u0433\u0434\u0430 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043f\u043e\u0434\u043d\u044f\u043b\u0430\u0441\u044c \u0431\u044b \u0431\u0435\u0437 \u0437\u0430\u0449\u0438\u0442\u044b. \u042d\u0442\u043e \u043f\u0440\u0435\u0434\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u044c \u043e\u0442 \u043f\u0440\u043e\u043c\u0430\u0445\u0430, \u0430 \u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u0430; \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0441\u0442\u0430\u0432\u044f\u0442 \u043f\u0440\u0430\u0432\u0430 \u0440\u043e\u043b\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f \u043d\u0430 \u043f\u0440\u043e\u0434\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"bash\">$ \/app\/console&gt; id := uuid.MustParse(\"00000000-0000-0000-0000-0000000000b2\")&gt; o, err := App.Orders.Repos.OrderRepo.Get(Ctx, id)&gt; o.Statuspaid&gt; o.TotalCents1290&gt; res, err := App.Orders.Usecases.Order.Cancel(Ctx, id)   &lt;- \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430 \u043d\u0435 SELECT&gt; errERROR: cannot execute UPDATE in a read-only transaction (SQLSTATE 25006)                                       &lt;- \u0438 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0420\u043e\u0432\u043d\u043e \u0442\u043e, \u0437\u0430 \u0447\u0435\u043c \u043c\u044b \u0448\u043b\u0438 \u0438\u0437 Rails.<\/p>\n<h3>\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b<\/h3>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/vladimirtcats\/cosy-console\" rel=\"noopener nofollow\">cosy-console: \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/traefik\/yaegi\" rel=\"noopener nofollow\">Yaegi: \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 Go \u043d\u0430 Go<\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/traefik\/yaegi\/tree\/master\/extract\" rel=\"noopener nofollow\">yaegi extract: \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432<\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/x-motemen\/gore\" rel=\"noopener nofollow\">gore: \u0435\u0449\u0451 \u043e\u0434\u0438\u043d REPL \u0434\u043b\u044f Go<\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/pkg.go.dev\/github.com\/traefik\/yaegi\/interp#Interpreter.ImportUsed\" rel=\"noopener nofollow\">ImportUsed: \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u0438 \u0437\u0430\u043f\u0440\u0435\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e Eval<\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/pkg.go.dev\/golang.org\/x\/tools\/go\/packages\" rel=\"noopener nofollow\">golang.org\/x\/tools\/go\/packages: \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438 \u0440\u0430\u0437\u0431\u043e\u0440 \u043f\u0430\u043a\u0435\u0442\u043e\u0432<\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.pgbouncer.org\/config.html#ignore_startup_parameters\" rel=\"noopener nofollow\">startup-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435 PgBouncer<\/a>;<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u043e\u0439 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u043a\u0430\u043d\u0430\u043b: <a href=\"https:\/\/t.me\/tsymbaldev\" rel=\"noopener nofollow\">@tsymbaldev<\/a>.<\/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\/articles\/1089480\/\">https:\/\/habr.com\/ru\/articles\/1089480\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u042f \u043f\u0440\u0438\u0448\u0451\u043b \u0432 Go \u0438\u0437 Ruby, \u0438 \u043f\u0435\u0440\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 Rails \u0435\u0441\u0442\u044c \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438: \u043a\u043e\u043d\u0441\u043e\u043b\u0438, \u0433\u0434\u0435 \u043b\u044e\u0431\u0443\u044e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u043d\u0430 \u043f\u0440\u043e\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0443\u043a\u0430\u043c\u0438. bundle exec rails c, Order.find(42), \u0438 \u043f\u0435\u0440\u0435\u0434 \u0442\u043e\u0431\u043e\u0439 \u043d\u0435 \u0441\u0442\u0440\u043e\u043a\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435, \u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438. \u0412 \u043c\u043e\u0438\u0445 Go-\u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u043d\u0435 \u0431\u044b\u043b\u043e, \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0441\u044f psql, \u0438 \u0442\u043e \u0435\u0441\u043b\u0438 \u043e\u043d \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 \u043e\u0431\u0440\u0430\u0437. \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043c\u043e\u0436\u043d\u043e, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0435\u043b\u044c\u0437\u044f. \u0410 \u0432\u043e\u043f\u0440\u043e\u0441 \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u043e\u0439: \u043f\u043e\u0447\u0435\u043c\u0443 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0444\u0438\u0447\u0430 \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u043b\u0430\u0441\u044c, \u0445\u043e\u0442\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0444\u043b\u0430\u0433 \u0441\u0442\u043e\u0438\u0442.\u0414\u0430\u043b\u0435\u0435: \u0432\u044b\u0431\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 gore \u0438 Yaegi, \u043f\u043e\u0447\u0435\u043c\u0443 \u00ab\u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443\u00bb \u044d\u0442\u043e \u043b\u043e\u0432\u0443\u0448\u043a\u0430, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0430\u043a\u0435\u0442\u044b \u0432 REPL \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f undefined \u043f\u0440\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u044e \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0441\u043d\u0435\u0441\u0442\u0438 \u0411\u0414 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435. \u041a\u043e\u0434, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0442\u044c\u044f, \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043b\u0435\u0436\u0438\u0442 \u0432 cosy-console, \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0438 \u043d\u0438\u0436\u0435 \u044d\u0442\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u043e\u0442\u0442\u0443\u0434\u0430.\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0430 \u0431\u0435\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a. \u041f\u0440\u0438\u043b\u0435\u0442\u0430\u0435\u0442 \u0442\u0438\u043a\u0435\u0442 \u00ab\u0443 \u0437\u0430\u043a\u0430\u0437\u0430 42 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0441\u0442\u0430\u0442\u0443\u0441 \u0441\u0442\u0430\u0442\u0443\u0441\u00bb. \u0414\u0430\u043b\u044c\u0448\u0435:1. \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0411\u04142. \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0442\u0430\u0442\u0443\u0441, \u0430 \u0432 \u043a\u0430\u043a\u043e\u0439 \u0435\u0433\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u044f3. psql $POSTGRES_URL4. SELECT &#8230; JOIN &#8230; WHERE order_id = 425. \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0446\u0438\u0444\u0440\u044b \u0431\u0435\u0437 \u0431\u0438\u0437\u043d\u0435\u0441-\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430: \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 status = 7?6. \u043f\u043e\u0439\u0442\u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u0434, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c7. \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044e\u0437\u043a\u0435\u0439\u0441: \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439   HTTP-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0438\u043b\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u0430 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0442\u0435\u043d\u0434\u0435,   \u0447\u0442\u043e \u0441\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0412 Rails \u0438\u0445 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u0434\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430:$ bundle exec rails corder = Order.find(42)order.status_label           # \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0447\u0442\u043e \u0437\u0430 \u0441\u0442\u0430\u0442\u0443\u0441PaymentsService.retry(order) # \u0437\u0430\u043f\u0443\u0441\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438\u0425\u043e\u0447\u0435\u0442\u0441\u044f \u0442\u043e\u0433\u043e \u0436\u0435 \u0432 Go. \u0412\u043e\u043f\u0440\u043e\u0441: \u0447\u0435\u043c \u044d\u0442\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c.\u0410\u043a\u0442 1: \u0432\u044b\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0413\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u00abgo repl\u00bb \u0434\u0430\u0451\u0442 \u0434\u0432\u0443\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432: gore \u0438 Yaegi. \u0421 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0432\u0437\u0433\u043b\u044f\u0434\u0430 \u043e\u0431\u0430 \u00abREPL \u0434\u043b\u044f Go\u00bb, \u043d\u043e \u043e\u043d\u0438 \u0440\u0435\u0448\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0438 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0440\u0435\u0448\u0430\u044e\u0449\u0430\u044f.gore: \u043f\u0440\u043e \u044f\u0437\u044b\u043a, \u0430 \u043d\u0435 \u043f\u0440\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435gore \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Go-REPL: \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u0436\u0434\u0451\u0442 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0438\u0445 \u0447\u0435\u0440\u0435\u0437 go run. \u041e\u0442\u0441\u044e\u0434\u0430 \u0434\u0432\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043d\u0430\u0448\u0443 \u0437\u0430\u0434\u0430\u0447\u0443:\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e 1: \u043a\u0430\u0436\u0434\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e (\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e, \u0438 \u044d\u0442\u043e            \u043f\u0440\u0438\u0437\u043d\u0430\u044e\u0442 \u0441\u0430\u043c\u0438 \u0430\u0432\u0442\u043e\u0440\u044b)\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e 2: \u043d\u0443\u0436\u0435\u043d Go toolchain, \u0430 \u043d\u0430 \u043f\u0440\u043e\u0434\u0435 \u0435\u0433\u043e \u043d\u0435\u0442 \u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c\u041d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0434\u0430\u0436\u0435 \u043d\u0435 \u044d\u0442\u043e: \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0432 gore \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0430\u0432\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c::import cosy-console\/internal\/domain\/orders\u0410 \u0434\u0430\u043b\u044c\u0448\u0435 \u0442\u0443\u043f\u0438\u043a: \u044e\u0437\u043a\u0435\u0439\u0441 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0448\u044c, \u0435\u043c\u0443 \u043d\u0443\u0436\u0435\u043d *gorm.DB, \u043f\u0443\u043b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u043a\u043e\u043d\u0444\u0438\u0433 \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0412\u0441\u0451 \u044d\u0442\u043e \u0432 \u0432\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 composition root, \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0438 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c, \u043d\u043e gore \u043f\u0440\u043e \u043d\u0435\u0433\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442. \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u043e \u043f\u0440\u043e\u0434\u0430 \u043d\u0430\u0434\u043e \u0435\u0449\u0451 \u0434\u043e\u0442\u044f\u043d\u0443\u0442\u044c.Yaegi: \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e: \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u0423 Yaegi \u0435\u0441\u0442\u044c API:i := interp.New(interp.Options{&#8230;})i.Use(stdlib.Symbols) \/\/ \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044bi.Eval(`1 + 1`)       \/\/ \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u0434i.REPL()              \/\/ \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0434\u043b\u044f \u043d\u0430\u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u044c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430. \u0412 REPL \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0434\u0430\u0442\u044c *gorm.DB, \u044e\u0437\u043a\u0435\u0439\u0441, \u043a\u043e\u043d\u0444\u0438\u0433, \u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.gore:                       Yaegi:REPL &#8212;go run&#8212;&gt; \u043a\u043e\u0434        \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f                              |\u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e    composition root (db, usecases, http-clients)                              |                              v                            Yaegi-\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 &#8212;&gt; REPL \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442                                                    \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b\u0412\u0430\u0436\u043d\u043e\u0435 \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e Yaegi, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0440\u0435\u043b\u0438\u0437 Yaegi \u044d\u0442\u043e v0.16.1, \u0430\u043f\u0440\u0435\u043b\u044c 2024. Issues \u0432 \u0442\u0440\u0435\u043a\u0435\u0440\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f, \u0430 \u0440\u0435\u043b\u0438\u0437\u043e\u0432 \u0434\u0430\u0432\u043d\u043e \u043d\u0435\u0442. \u0414\u043b\u044f \u043d\u0430\u0441 \u044d\u0442\u043e \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e, \u0442\u0430\u043a \u043a\u0430\u043a Yaegi \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043e\u043d \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0443, \u0438 \u0435\u0441\u043b\u0438 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f, \u043c\u044b \u0435\u0433\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u043c. \u0412\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f: \u043d\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430, \u0430 \u043e\u0434\u0438\u043d \u0432\u044b\u0437\u043e\u0432, App.Orders.Usecases.Order.Get(Ctx, id), \u0438 \u0441\u0430\u043c \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c.REPL \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e \u043d\u0435 \u0438\u0434\u0451\u0442. \u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0443\u043f\u0430\u0441\u0442\u044c, \u0438 \u043f\u043e\u0441\u0442\u0440\u0430\u0434\u0430\u0435\u0442 \u0441\u0435\u0441\u0441\u0438\u044f, \u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 API. \u0421 \u044d\u0442\u0438\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c Yaegi \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u043f\u0440\u0438\u0433\u043e\u0434\u0435\u043d.\u0410\u043a\u0442 2: \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0436\u0438\u0432\u0451\u0442 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435, \u0430 \u043d\u0435 \u0432 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0435\u0412\u0442\u043e\u0440\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e\u0435, \u0438 \u0437\u0434\u0435\u0441\u044c \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 \u0447\u0430\u0441\u0442\u043e\u0435 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u0435.\u0421\u0440\u0430\u0437\u0443 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0438\u0434\u0435\u044e \u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0432 \u0430\u0434\u043c\u0438\u043d\u043a\u0435\u0427\u0430\u0441\u0442\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c REPL HTTP-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u043c \u0438\u043b\u0438 \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a. \u0427\u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u043d\u0435 \u0442\u0430\u043a:\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u0427\u0442\u043e \u043d\u0435 \u0442\u0430\u043aREPL \u0432\u043d\u0443\u0442\u0440\u0438 http-\u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430: \u043e\u0431\u0449\u0438\u0439 \u043f\u0443\u043b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u043e\u0431\u0449\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c, \u0438 \u0432\u0441\u0451, \u0447\u0442\u043e \u0443\u0440\u043e\u043d\u0438\u0442 \u043a\u043e\u043d\u0441\u043e\u043b\u044c, \u043c\u043e\u0436\u0435\u0442 \u0443\u0440\u043e\u043d\u0438\u0442\u044c APIHTTP-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \/console\u044d\u0442\u043e remote code execution (RCE) \u043f\u043e HTTP; \u043b\u044e\u0431\u0443\u044e \u0437\u0430\u0449\u0438\u0442\u0443 \u043e\u0431\u043e\u0439\u0434\u0451\u0442 \u0442\u043e\u0442, \u043a\u0442\u043e \u043d\u0430\u0439\u0434\u0451\u0442 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442REPL \u043a\u0430\u043a \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0441 auth\u0432\u0441\u0451 \u0435\u0449\u0451 RCE, \u043f\u0440\u043e\u0441\u0442\u043e \u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u043c\u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u0430\u043a \u0436\u0435 \u0443\u0434\u043e\u0431\u043d\u043e, \u043a\u0430\u043a \u0432 Rails. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c rails c \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u043c\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0443: \u043e\u043d \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0442\u043e \u0436\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 (\u043c\u043e\u0434\u0435\u043b\u0438, \u043a\u043e\u043d\u0444\u0438\u0433, \u0411\u0414 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435). \u041f\u0430\u043c\u044f\u0442\u044c \u0443 \u043d\u0435\u0433\u043e \u0441\u0432\u043e\u044f, \u0430 \u043a\u043e\u043d\u0444\u0438\u0433 \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435 \u0436\u0435, \u0447\u0442\u043e \u0443 \u043f\u0440\u043e\u0434\u0430: \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0432 \u0431\u0430\u0437\u0435 \u043e\u0431\u0449\u0438\u0435, \u043d\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 API \u043e\u0442 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442.\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 + \u043e\u0431\u0449\u0438\u0439 composition root\u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u044d\u0442\u0443 \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0434\u0438\u043d \u0432 \u043e\u0434\u0438\u043d:                       config + logger                              |                    composition root (Container)                              |            +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+            v                 v                  v        cmd\/api           cmd\/worker        cmd\/console   &lt;- \u043d\u043e\u0432\u044b\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a            |                 |                  |          HTTP server      \u0432\u043e\u0440\u043a\u0435\u0440\u044b           Yaegi REPL            |                 |                  |            +&#8212;&#8212;&#8212; \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u044e\u0437\u043a\u0435\u0439\u0441\u044b &#8212;+                              |                    PostgreSQL \/ Redis \/ Kafka            (\u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435, \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0442 \u0436\u0435 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d \u043a\u043e\u043d\u0444\u0438\u0433)cmd\/console \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0442\u043e\u0442 \u0436\u0435 composition root, \u0447\u0442\u043e \u0438 API, \u043f\u043e\u044d\u0442\u043e\u043c\u0443:\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0411\u0414 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e;\u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0442\u043e \u0436\u0435, \u0447\u0442\u043e \u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438: \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0433\u0440\u0430\u0444 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. HTTP-\u0441\u043b\u043e\u044f \u0432 \u044d\u0442\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442, \u0440\u043e\u0443\u0442\u0435\u0440 \u0438 \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u044b \u0436\u0438\u0432\u0443\u0442 \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u0438 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u043e\u043d\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b.\u0412 Docker \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0432\u0435 \u0441\u0442\u0440\u043e\u043a\u0438: \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0432 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u0440\u0430\u0437. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u0432:RUN go build -o bin\/console .\/cmd\/console&#8230;COPY &#8212;from=builder \/app\/bin\/console \/app\/console\u0411\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u043b\u0435\u0436\u0438\u0442 \u0432 \u043e\u0431\u0440\u0430\u0437\u0435 \u0440\u044f\u0434\u043e\u043c \u0441 API. \u0412\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0435\u0433\u043e \u0438\u0437\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u0414\u043e\u0441\u0442\u0443\u043f \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u043a \u043d\u0435\u043c\u0443 \u0437\u0430\u043a\u0440\u044b\u0442.\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a:docker compose exec api \/app\/console\u0427\u0442\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 REPL: \u0442\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0422\u0435\u043f\u0435\u0440\u044c \u0442\u043e\u043d\u043a\u043e\u0435 \u043c\u0435\u0441\u0442\u043e: \u043a\u0430\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u0430 \u0432\u0438\u0434\u043d\u044b \u0432 \u0441\u0435\u0441\u0441\u0438\u0438. \u041c\u044b \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u043b\u0438 \u0442\u0440\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0448\u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439.\u041f\u043e\u043f\u044b\u0442\u043a\u0430 1: \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0451 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.i.Use(interp.Exports{&#171;console\/console&#187;: {    &#171;DB&#187;:      reflect.ValueOf(db),    &#171;Orders&#187;:  reflect.ValueOf(ordersUseCase),    &#171;Catalog&#187;: reflect.ValueOf(catalogUseCase),    &#8230;        \/\/ 30 \u0441\u0442\u0440\u043e\u043a \u0441\u0435\u0433\u043e\u0434\u043d\u044f, 60 \u043f\u043e\u0441\u043b\u0435 \u043f\u0430\u0440\u044b \u0441\u043f\u0440\u0438\u043d\u0442\u043e\u0432}})\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0441\u0442\u0451\u0442 \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u0434\u043e\u043c\u0435\u043d\u043e\u043c, \u0438\u043c\u0435\u043d\u0430 \u0436\u0438\u0432\u0443\u0442 \u0432 \u0434\u0432\u0443\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 (\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 + \u044d\u043a\u0441\u043f\u043e\u0440\u0442), \u0430 \u043f\u0440\u043e \u0437\u0430\u0431\u044b\u0442\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0443\u0437\u043d\u0430\u0451\u0448\u044c \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u0430.\u041f\u043e\u043f\u044b\u0442\u043a\u0430 2: \u0430\u0432\u0442\u043e\u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0435\u0439 \u043f\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443.\/\/ \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c reflect&#8217;\u043e\u043c \u043f\u043e \u043f\u043e\u043b\u044f\u043c Container \u0438 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0435v := reflect.ValueOf(app).Elem()for i := 0; i &lt; v.NumField(); i++ { &#8230; }\u041c\u0430\u0433\u0438\u044f, \u0438 \u043e\u043d\u0430 \u043e\u043f\u0430\u0441\u043d\u0430. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430: \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043d\u043e\u0435 \u043f\u043e\u043b\u0435, \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u044f \u0438\u043c\u0451\u043d, \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0444\u043e\u0440\u043c \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044f \u0441\u043f\u043e\u0442\u044b\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0438 \u044d\u0442\u043e \u0445\u0443\u0436\u0435: \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0448\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u0448\u044c \u043f\u043e\u043b\u0435, \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0448\u044c \u044e\u0437\u043a\u0435\u0439\u0441 \u043c\u0435\u0436\u0434\u0443 \u0434\u043e\u043c\u0435\u043d\u0430\u043c\u0438, \u0438 \u0432\u0441\u0451 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f, \u0432\u0441\u0435 \u0442\u0435\u0441\u0442\u044b \u0437\u0435\u043b\u0451\u043d\u044b\u0435: \u043f\u0440\u043e \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043e\u043d\u0438 \u043d\u0435 \u0437\u043d\u0430\u044e\u0442. \u0410 \u0432 \u0441\u0435\u0441\u0441\u0438\u0438 \u0442\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c \u0438\u043c\u0435\u043d\u0430: \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u0435 App.Orders.Usecases.Order.Get(&#8230;) \u0442\u0435\u043f\u0435\u0440\u044c undefined. \u0423\u0437\u043d\u0430\u0451\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0435 \u0430\u0432\u0442\u043e\u0440 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u0430 \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u043d\u0430 \u043f\u0440\u043e\u0434\u0435.\u0414\u043b\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0447\u0438\u043d\u044f\u0442 \u043f\u0440\u043e\u0434, \u00ab\u043c\u043e\u043b\u0447\u0430\u00bb \u044d\u0442\u043e \u0445\u0443\u0434\u0448\u0435\u0435 \u0441\u043b\u043e\u0432\u043e.\u041f\u043e\u043f\u044b\u0442\u043a\u0430 3: \u0432\u0435\u0441\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043e\u0434\u043d\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c.func exports(ctx context.Context, container *app.Container) interp.Exports {    return interp.Exports{        &#171;console\/console&#187;: {            &#171;App&#187;: reflect.ValueOf(container),            &#171;Ctx&#187;: reflect.ValueOf(ctx),        },    }}App \u044d\u0442\u043e \u0432\u0435\u0441\u044c composition root \u043a\u0430\u043a \u0435\u0441\u0442\u044c, Ctx \u044d\u0442\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u0435\u0441\u0441\u0438\u0438 \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0433\u043e \u0442\u0440\u0435\u0431\u0443\u044e\u0442. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 App:App (*app.Container) |&#8212; Orders |    |&#8212; Usecases.Order.Get(ctx, id)  -&gt; (models.Order, error) |                      .Cancel(ctx, id) |    \\&#8212; Repos.OrderRepo.Get(ctx, id) |                       .Update(ctx, id, orders.UpdateAttrs) |&#8212; Catalog |    |&#8212; Usecases.Item.List(ctx, catalog.ItemFilter) |    \\&#8212; Repos.ItemRepo.Get(ctx, id) \\&#8212; Shared      |&#8212; DB   *gorm.DB      \\&#8212; Tx   \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439: InTransaction(ctx, fn)\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u044d\u0442\u043e uuid.UUID, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 id \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043d\u0438\u0436\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 uuid, \u0430 \u043d\u0435 \u0447\u0438\u0441\u043b\u043e. \u0414\u043e\u0441\u0442\u0443\u043f \u0438\u0434\u0451\u0442 \u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e \u043f\u043e \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435:&gt; App.Orders.Usecases.Order.Get(Ctx, id)&gt; App.Catalog.Repos.ItemRepo.Get(Ctx, itemID)&gt; App.Shared.Tx.InTransaction(Ctx, func(&#8230;) error { &#8230; })\u0417\u0434\u0435\u0441\u044c reflect \u0432 \u043a\u043e\u0434\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u044d\u0442\u043e API Yaegi. \u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u043c\u0430\u0433\u0438\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439: \u0447\u0442\u043e \u043b\u0435\u0436\u0438\u0442 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435, \u0442\u043e \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e. \u0414\u043e\u0431\u0430\u0432\u0438\u043b \u044e\u0437\u043a\u0435\u0439\u0441 \u0432 composition root, \u043e\u043d \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. HTTP-\u0445\u0435\u043d\u0434\u043b\u0435\u0440\u044b \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043d\u0435 \u0432\u0445\u043e\u0434\u044f\u0442. \u041a\u043e\u043d\u0441\u043e\u043b\u044c \u043f\u0440\u043e \u043d\u0438\u0445 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430: \u0435\u0439 \u043d\u0443\u0436\u043d\u044b \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u0430 \u043d\u0435 \u0440\u043e\u0443\u0442\u0435\u0440.\u0410\u043a\u0442 3: \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u0438\u043b\u0438 \u043f\u043e\u0447\u0435\u043c\u0443 undefined type \u043f\u0440\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u0434\u0435\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Yaegi. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u0432:\u0421\u0438\u043c\u0432\u043e\u043b\u044b \u044d\u0442\u043e \u043c\u0430\u043f\u0430 \u00ab\u0438\u043c\u044f -&gt; reflect.Value\u00bb \u0432\u043d\u0443\u0442\u0440\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430. \u0427\u0435\u0440\u0435\u0437 \u043d\u0435\u0451 Yaegi \u0432\u0438\u0434\u0438\u0442 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0438\u0440.\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f (i.Use) \u044d\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0430\u043a\u0435\u0442\u0430 \u0432 \u044d\u0442\u0443 \u043c\u0430\u043f\u0443 \u043f\u043e\u0434 \u043a\u043b\u044e\u0447\u043e\u043c-\u043f\u0443\u0442\u0451\u043c. \u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u043b\u043e: \u0438\u043c\u044f \u0432 \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0430.\u0411\u0438\u043d\u0434\u0438\u043d\u0433 (i.ImportUsed) \u044d\u0442\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043c\u0451\u043d \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 \u0441\u043a\u043e\u0443\u043f\u0435 \u0441\u0435\u0441\u0441\u0438\u0438, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0432 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u0432\u0441\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u044b.extract \u044d\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432: \u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0438 \u043f\u0438\u0448\u0435\u0442 Go-\u0444\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 Symbols \u043f\u0440\u0438 init().\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: REPL \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442App \u0432 \u0441\u0435\u0441\u0441\u0438\u0438 \u0435\u0441\u0442\u044c, \u043c\u0435\u0442\u043e\u0434\u044b&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-497050","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/497050","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=497050"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/497050\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=497050"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=497050"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=497050"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}