{"id":429663,"date":"2024-08-21T09:00:45","date_gmt":"2024-08-21T09:00:45","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=429663"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=429663","title":{"rendered":"<span>\u00ab\u0411\u043e\u0431\u0435\u0440 \u0432\u044b\u0434\u044b\u0445\u0430\u0439\u00bb: Go, WinAPI \u0438 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0427\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432\u00a0\u0433\u043e\u043b\u043e\u0432\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043f\u0440\u0438\u00a0\u0441\u043b\u043e\u0432\u0435 \u00abGo\u00bb? Google \u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b? \u042f \u0442\u043e\u0436\u0435 \u0442\u0430\u043a \u0434\u0443\u043c\u0430\u043b, \u043d\u043e\u00a0\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0439.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2fe\/ef9\/748\/2feef9748f0af1801f3a850f1690379d.png\" alt=\"Gopher - \u043c\u0430\u0441\u043a\u043e\u0442 Golang \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043d\u0435 \u0431\u043e\u0431\u0435\u0440 \u0430 \u0446\u0435\u043b\u044b\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0438\u0434, \u0443 \u043d\u0430\u0441 \u0442\u0430\u043a\u0438\u0435 \u043d\u0435 \u0436\u0438\u0432\u0443\u0442.\" title=\"Gopher - \u043c\u0430\u0441\u043a\u043e\u0442 Golang \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043d\u0435 \u0431\u043e\u0431\u0435\u0440 \u0430 \u0446\u0435\u043b\u044b\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0438\u0434, \u0443 \u043d\u0430\u0441 \u0442\u0430\u043a\u0438\u0435 \u043d\u0435 \u0436\u0438\u0432\u0443\u0442.\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2fe\/ef9\/748\/2feef9748f0af1801f3a850f1690379d.png\"\/><\/p>\n<div><figcaption>Gopher\u00a0\u2014 \u043c\u0430\u0441\u043a\u043e\u0442 Golang \u043d\u0430\u00a0\u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043d\u0435\u00a0\u0431\u043e\u0431\u0435\u0440 \u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%93%D0%BE%D1%84%D0%B5%D1%80%D0%BE%D0%B2%D1%8B%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0446\u0435\u043b\u044b\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0438\u0434<\/a>, \u0443\u00a0\u043d\u0430\u0441 \u0442\u0430\u043a\u0438\u0435 \u043d\u0435\u00a0\u0436\u0438\u0432\u0443\u0442.<\/figcaption><\/div>\n<\/figure>\n<h3>\u0412\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u0439 \u043c\u0438\u0440 Windows<\/h3>\n<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0440\u043e\u0434\u0438\u043b\u0430\u0441\u044c <strong>\u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e<\/strong>\u00a0\u2014 \u0438\u0437 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043f\u043e\u0440\u0430 \u043e\u00a0\u0440\u0435\u0430\u043b\u0438\u044f\u0445 \u0438\u00a0\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445 \u044f\u0437\u044b\u043a\u0430 <a href=\"https:\/\/go.dev\/\" rel=\"noopener noreferrer nofollow\">Go<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u0437\u0430\u00a0\u0440\u0430\u043c\u043a\u0438 \u0435\u0433\u043e \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0444\u0435\u0440\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Go\" rel=\"noopener noreferrer nofollow\">\u043c\u0430\u0442\u0447\u0430\u0441\u0442\u0438<\/a> \u0434\u043b\u044f \u0442\u0435\u0445 \u043a\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c \u044f\u0437\u044b\u043a\u0435:<\/p>\n<blockquote>\n<p><strong>Go<\/strong> (\u0447\u0430\u0441\u0442\u043e \u0442\u0430\u043a\u0436\u0435 <strong>golang<\/strong>) \u2014 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D1%8B%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0439<\/a> <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B\" rel=\"noopener noreferrer nofollow\">\u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439<\/a> <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%AF%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">\u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a>, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Google_(%D0%BA%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D1%8F)\" rel=\"noopener noreferrer nofollow\">Google<\/a><a href=\"https:\/\/ru.wikipedia.org\/wiki\/Go#cite_note-11\" rel=\"noopener noreferrer nofollow\">[11]<\/a>. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 Go \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u0435 2007 \u0433\u043e\u0434\u0430, \u0435\u0433\u043e \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u044c <a href=\"https:\/\/ru.wikipedia.org\/w\/index.php?title=%D0%93%D1%80%D0%B8%D0%B7%D0%BC%D0%B5%D1%80,_%D0%A0%D0%BE%D0%B1%D0%B5%D1%80%D1%82&amp;action=edit&amp;redlink=1\" rel=\"noopener noreferrer nofollow\">\u0420\u043e\u0431\u0435\u0440\u0442 \u0413\u0440\u0438\u0437\u043c\u0435\u0440<\/a>, <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%B0%D0%B9%D0%BA,_%D0%A0%D0%BE%D0%B1\" rel=\"noopener noreferrer nofollow\">\u0420\u043e\u0431 \u041f\u0430\u0439\u043a<\/a> \u0438 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A2%D0%BE%D0%BC%D0%BF%D1%81%D0%BE%D0%BD,_%D0%9A%D0%B5%D0%BD\" rel=\"noopener noreferrer nofollow\">\u041a\u0435\u043d \u0422\u043e\u043c\u043f\u0441\u043e\u043d<\/a><a href=\"https:\/\/ru.wikipedia.org\/wiki\/Go#cite_note-langfaq-12\" rel=\"noopener noreferrer nofollow\">[12]<\/a>, \u0437\u0430\u043d\u0438\u043c\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Inferno_(%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0)\" rel=\"noopener noreferrer nofollow\">Inferno<\/a>. \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u044f\u0437\u044b\u043a \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u043d\u043e\u044f\u0431\u0440\u0435 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/2009_%D0%B3%D0%BE%D0%B4\" rel=\"noopener noreferrer nofollow\">2009 \u0433\u043e\u0434\u0430<\/a>.<\/p>\n<\/blockquote>\n<p>\u042f\u00a0\u043a\u0430\u043a \u0438\u00a0\u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u0447\u0438\u0442\u0430\u043b Golang \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043d\u043e\u0432\u043e\u043c\u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0438\u0433\u0440\u0443\u0448\u043a\u043e\u0439, \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0430\u0434\u0438\u0442\u044c \u0448\u0438\u0440\u043e\u043a\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043a\u0438\u0435 \u043c\u0430\u0441\u0441\u044b \u043d\u0430\u00a0\u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0443\u044e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044e \u00ab\u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u0431\u0440\u0430\u00bb\u00a0\u2014 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0441\u044f \u044d\u0442\u043e\u0442 \u044f\u0437\u044b\u043a \u0432\u043d\u0443\u0442\u0440\u0438 \u0413\u0443\u0433\u043b\u0430 \u0438 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447 \u0413\u0443\u0433\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u043e\u0431\u044b\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u0433\u0434\u0430 \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0443 Golang \u0441\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/apps\/\" rel=\"noopener noreferrer nofollow\">WinAPI<\/a> \u00ab\u0438\u0437\u00a0\u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb \u044f\u00a0\u0431\u044b\u043b \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u00a0\u2014  \u0432\u00a0\u0431\u043e\u043b\u0435\u0435 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u0432\u0440\u043e\u0434\u0435 C\/C++ \u0440\u0430\u0431\u043e\u0442\u0430 c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438 Windows \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u043a\u0443\u0434\u0430 \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u043d\u0441\u0442\u0440\u0443\u043e\u0437\u043d\u043e\u0439. \u0422\u0430\u043a \u0438 \u0440\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u044d\u0442\u0430 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f. <\/p>\n<p>\u0427\u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0442\u0432\u043e\u0440\u0438\u0442\u044c:<\/p>\n<blockquote>\n<p>Desktop-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c, \u0441\u00a0\u0443\u0447\u0435\u0442\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0439 Windows, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u0431\u0441\u0435\u0440\u0432\u0435\u0440, \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c REST API \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435.<\/p>\n<\/blockquote>\n<p>\u0415\u0449\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0438\u00a0\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0435\u0433\u043e \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0431\u043e\u0435\u0432\u00a0\u2014 \u0447\u0435\u0440\u0435\u0437 WinAPI. <\/p>\n<p>\u041f\u043b\u044e\u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u0445\u043e\u0434 \u0444\u0430\u0439\u0440\u0432\u043e\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0441\u044f \u0432\u043e\u0442 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437\u0434\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0439 \u044d\u043a\u0440\u0430\u043d \u0441 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/506\/84f\/2e4\/50684f2e430e005ae771b60d5fa8b50b.png\" alt=\"\u041e\u043d\u00a0\u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u0435\u043d\u044f \u0431\u0435\u0441\u0438\u043b, \u0430\u00a0\u0442\u043e\u00a0\u0447\u0442\u043e \u043c\u0435\u043d\u044f \u0431\u0435\u0441\u0438\u0442\u00a0\u2014 \u044f\u00a0\u043e\u0442\u0440\u044b\u0432\u0430\u044e \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u044e.\" title=\"\u041e\u043d\u00a0\u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u0435\u043d\u044f \u0431\u0435\u0441\u0438\u043b, \u0430\u00a0\u0442\u043e\u00a0\u0447\u0442\u043e \u043c\u0435\u043d\u044f \u0431\u0435\u0441\u0438\u0442\u00a0\u2014 \u044f\u00a0\u043e\u0442\u0440\u044b\u0432\u0430\u044e \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u044e.\" width=\"650\" height=\"452\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/506\/84f\/2e4\/50684f2e430e005ae771b60d5fa8b50b.png\"\/><\/p>\n<div><figcaption>\u041e\u043d\u00a0\u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u0435\u043d\u044f \u0431\u0435\u0441\u0438\u043b, \u0430\u00a0\u0442\u043e\u00a0\u0447\u0442\u043e \u043c\u0435\u043d\u044f \u0431\u0435\u0441\u0438\u0442\u00a0\u2014 \u044f\u00a0<s>\u043e\u0442\u0440\u044b\u0432\u0430\u044e<\/s> \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u044e.<\/figcaption><\/div>\n<\/figure>\n<blockquote>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0443\u0434\u0438\u0432\u0438\u0442 \u0434\u0430\u0436\u0435 \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043d\u0430 Golang.<\/p>\n<\/blockquote>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043e\u0442:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/116\/910\/5b9\/1169105b93633787d13134c2c51bb0cc.png\" alt=\"\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430\u00a0\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u00ab\u0437\u0430\u043a\u0440\u044b\u0442\u044c\u00bb \u0438 \u00ab\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c\u00bb\u00a0\u2014 \u0434\u0430\u0436\u0435 \u044d\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u00a0\u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c WinAPI\" title=\"\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430\u00a0\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u00ab\u0437\u0430\u043a\u0440\u044b\u0442\u044c\u00bb \u0438 \u00ab\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c\u00bb\u00a0\u2014 \u0434\u0430\u0436\u0435 \u044d\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u00a0\u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c WinAPI\" width=\"969\" height=\"478\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/116\/910\/5b9\/1169105b93633787d13134c2c51bb0cc.png\"\/><\/p>\n<div><figcaption>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430\u00a0\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u00ab\u0437\u0430\u043a\u0440\u044b\u0442\u044c\u00bb \u0438 \u00ab\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c\u00bb\u00a0\u2014 \u0434\u0430\u0436\u0435 \u044d\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u00a0\u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c WinAPI<\/figcaption><\/div>\n<\/figure>\n<p>\u0410 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Taskbar\" rel=\"noopener noreferrer nofollow\">\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0442\u0440\u0435\u0435\u043c<\/a>:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/95a\/191\/241\/95a191241b4304be96fa48ef22797ddb.png\" alt=\"\u041f\u043e \u043a\u043b\u0438\u043a\u0443 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0444\u043e\u043a\u0443\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\" title=\"\u041f\u043e \u043a\u043b\u0438\u043a\u0443 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0444\u043e\u043a\u0443\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\" width=\"450\" height=\"222\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/95a\/191\/241\/95a191241b4304be96fa48ef22797ddb.png\"\/><\/p>\n<div><figcaption>\u041f\u043e \u043a\u043b\u0438\u043a\u0443 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0444\u043e\u043a\u0443\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0449\u0435 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0438\u0430\u043b\u043e\u0433:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f56\/411\/91f\/f5641191fa01c9b1eb1957228df41fc0.png\" alt=\"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u0430, \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c.\" title=\"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u0430, \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c.\" width=\"370\" height=\"289\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f56\/411\/91f\/f5641191fa01c9b1eb1957228df41fc0.png\"\/><\/p>\n<div><figcaption>\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u0430, \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c.<\/figcaption><\/div>\n<\/figure>\n<p>\u0418 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440, \u0441 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5c7\/9ee\/9c6\/5c79ee9c6d3a5c23f3da46ab6b3eca26.png\" alt=\"\u0415\u0441\u043b\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u0442\u043e \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0447\u0442\u043e \u0442\u0443\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u0438 \u0432\u0441\u0435 \u043e\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0438\u0436\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435.\" title=\"\u0415\u0441\u043b\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u0442\u043e \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0447\u0442\u043e \u0442\u0443\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u0438 \u0432\u0441\u0435 \u043e\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0438\u0436\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435.\" width=\"1096\" height=\"368\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5c7\/9ee\/9c6\/5c79ee9c6d3a5c23f3da46ab6b3eca26.png\"\/><\/p>\n<div><figcaption>\u0415\u0441\u043b\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u0442\u043e \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0447\u0442\u043e \u0442\u0443\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u0438 \u0432\u0441\u0435 \u043e\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0438\u0436\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435.<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0443 \u0438 \u043f\u043e \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u0438 \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0432\u044b\u043b\u043e\u0436\u0435\u043d \u043d\u0430 <a href=\"https:\/\/github.com\/alex0x08\/golang-winapi-asm\" rel=\"noopener noreferrer nofollow\">Github<\/a>. <\/p>\n<h3>\u0421\u0431\u043e\u0440\u043a\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a<\/h3>\n<p>\u041d\u0430\u0447\u043d\u0443 \u0441\u00a0\u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e\u00a0\u2014 \u043a\u0430\u043a \u0432\u0441\u044e \u044d\u0442\u0443 \u0440\u0430\u0434\u043e\u0441\u0442\u044c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u00a0\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c.<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f \u043d\u0430\u0434\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Go:<\/p>\n<blockquote>\n<p>\u0414\u043b\u044f Windows \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 Golang, \u0434\u0430\u0436\u0435 \u0441 \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0442\u043e\u0440\u043e\u043c. <\/p>\n<\/blockquote>\n<p>\u0412\u0437\u044f\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430 Golang, \u0432\u043e\u0442 <a href=\"https:\/\/go.dev\/doc\/install\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>.<\/p>\n<p>\u042f\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043d\u0430\u00a0\u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u0435\u0440\u0441\u0438\u044e <strong>1.22.5<\/strong>, \u043d\u043e\u00a0\u044f\u0437\u044b\u043a \u0441\u0442\u043e\u043b\u044c \u0431\u0443\u0440\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0435\u00a0\u0443\u0434\u0438\u0432\u043b\u044e\u0441\u044c \u0435\u0441\u043b\u0438 \u0432\u044b\u0439\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0435\u0449\u0435 \u0434\u043e\u00a0\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u0430 \u0432 <a href=\"https:\/\/code.visualstudio.com\/\" rel=\"noopener noreferrer nofollow\">Visual Studio Code<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0430\u0432\u043d\u043e \u0438 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e <a href=\"https:\/\/code.visualstudio.com\/docs\/languages\/go\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Go<\/a>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ef5\/39d\/bda\/ef539dbda005bc5c7dc8ebec3c7dbca2.png\" alt=\"\u041e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 Visual Studio Code \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c \u0434\u043b\u044f Golang\" title=\"\u041e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 Visual Studio Code \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c \u0434\u043b\u044f Golang\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ef5\/39d\/bda\/ef539dbda005bc5c7dc8ebec3c7dbca2.png\"\/><\/p>\n<div><figcaption>\u041e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 Visual Studio Code \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c \u0434\u043b\u044f Golang<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435:<\/p>\n<blockquote>\n<p>\u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0435\u00a0\u043e\u0431\u044b\u0447\u043d\u044b\u0435 Makefile \u0438\u00a0\u043d\u0435\u00a0\u0448\u0435\u043b\u043b-\u0441\u043a\u0440\u0438\u043f\u0442\u044b\u00a0\u2014 \u0442\u0430\u043a \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0430\u00a0\u00ab\u0433\u043e\u0448\u0435\u0447\u043a\u0435\u00bb, \u0430\u00a0\u0446\u0435\u043b\u0430\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0432\u043d\u0435\u0448\u043d\u044f\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0431\u043e\u0440\u043a\u0438\u00a0\u2014 <a href=\"https:\/\/magefile.org\/\" rel=\"noopener noreferrer nofollow\">Magefile<\/a>.<\/p>\n<\/blockquote>\n<p>\u0421\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u043e\u043d\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432, \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439:<\/p>\n<pre><code class=\"powershell\">git clone https:\/\/github.com\/magefile\/mage cd mage go run bootstrap.go<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a <strong>mage<\/strong>, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u0441\u0431\u043e\u0440\u043a\u0443:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/125\/54f\/365\/12554f3658c8c431626f499aa3bccb60.png\" alt=\"Mage \u044d\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 mage.exe (\u0432 Windows \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f)\" title=\"Mage \u044d\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 mage.exe (\u0432 Windows \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f)\" width=\"1318\" height=\"516\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/125\/54f\/365\/12554f3658c8c431626f499aa3bccb60.png\"\/><\/p>\n<div><figcaption>Mage \u044d\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 <strong>mage.exe<\/strong> (\u0432 Windows \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f)<\/figcaption><\/div>\n<\/figure>\n<p>\u0417\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<pre><code class=\"powershell\">git clone https:\/\/github.com\/alex0x08\/golang-winapi-asm.git<\/code><\/pre>\n<p>\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"powershell\">mage install<\/code><\/pre>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c:<\/p>\n<pre><code class=\"powershell\">mage build<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0448\u043b\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u0432\u00a0\u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u0431\u0443\u0434\u0435\u0442 \u0444\u0430\u0439\u043b <strong>ungoogled-go.exe<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u0438\u00a0\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0430\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u0445\u00a0\u2014 \u043e\u043d\u00a0\u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0439 \u0438\u00a0\u043d\u0435\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442\u00a0\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e Golang. <\/p>\n<p>\u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c:<\/p>\n<pre><code class=\"powershell\">mage generate<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 <em>add.s<\/em> \u0438\u00a0<em>stub.go<\/em>\u00a0\u2014 \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u0430 \u043d\u0430\u00a0\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435.<\/p>\n<p>\u0421\u0442\u043e\u0438\u0442 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0438 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f, \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0443\u0442\u0435\u043c \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430:<\/p>\n<pre><code class=\"powershell\">-X main.DebugMode=false<\/code><\/pre>\n<p>\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\u00a0\u2014 \u0444\u043b\u0430\u0433\u043e\u043c \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043e\u043d\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5f2\/63c\/0b0\/5f263c0b055ba7f43e260d2479423e0e.png\" alt=\"\u041d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u044b\u0439 \u0444\u0430\u043a\u0442 \u2116 5668 : \u043d\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 Windows-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0437\u043d\u0430\u0435\u0442 \u043a\u0430\u043a \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0438\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438.\" title=\"\u041d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u044b\u0439 \u0444\u0430\u043a\u0442 \u2116 5668 : \u043d\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 Windows-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0437\u043d\u0430\u0435\u0442 \u043a\u0430\u043a \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0438\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438.\" width=\"1626\" height=\"600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5f2\/63c\/0b0\/5f263c0b055ba7f43e260d2479423e0e.png\"\/><\/p>\n<div><figcaption>\u041d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u044b\u0439 \u0444\u0430\u043a\u0442 \u2116 5668 : \u043d\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 Windows-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0437\u043d\u0430\u0435\u0442 \u043a\u0430\u043a \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0438\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438.<\/figcaption><\/div>\n<\/figure>\n<h3>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Windows<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u00a0\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u00a0Windows \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u00abHello world\u00bb \u043d\u0430\u00a0C:<\/p>\n<pre><code class=\"cpp\">#include &lt;stdio.h&gt; int main() {    printf(\"Hello, World!\");    return 0; }<\/code><\/pre>\n<p>\u0442\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f <s>\u0441\u0442\u0440\u0430\u0448\u043d\u0430\u044f<\/s> \u0447\u0435\u0440\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043a\u0430\u043a \u043d\u0430 \u0441\u043d\u0438\u043c\u043a\u0435 \u0432\u044b\u0448\u0435. <\/p>\n<p>\u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 Windows \u0434\u043b\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/learnwin32\/winmain--the-application-entry-point\" rel=\"noopener noreferrer nofollow\">\u0434\u0440\u0443\u0433\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430<\/a> (entry point):<\/p>\n<blockquote>\n<p>Every Windows program includes an entry-point function named either <strong>WinMain<\/strong> or <strong>wWinMain<\/strong>.<\/p>\n<\/blockquote>\n<p>\u0418\u00a0\u0435\u0441\u043b\u0438 \u0443\u0436\u00a0\u0436\u0438\u0437\u043d\u044c \u0432\u0430\u0441 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u00a0Golang \u043f\u043e\u0434 Windows, \u0435\u0449\u0435 \u0438\u00a0\u0441\u00a0\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c, \u0442\u043e\u00a0\u0441\u0442\u043e\u0438\u0442 \u00ab\u0433\u043e\u0448\u0435\u0447\u043a\u0435\u00bb \u043e\u0431\u00a0\u044d\u0442\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0444\u043b\u0430\u0433:<\/p>\n<pre><code class=\"powershell\">-H windowsgui<\/code><\/pre>\n<p>\u0432\u00a0\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b ldflags.<\/p>\n<p>\u0426\u0435\u043b\u0438\u043a\u043e\u043c \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"powershell\">go build -ldflags \"-H windowsgui\"<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e, \u044f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u0440\u0435\u0436\u0438\u043c \u0441\u0431\u043e\u0440\u043a\u0438 <em>exe<\/em>:<\/p>\n<pre><code class=\"powershell\">-buildmode=exe Build the listed main packages and everything they import into executables. Packages not named main are ignored.<\/code><\/pre>\n<p>\u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432 \u0438\u0442\u043e\u0433\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u0434\u0438\u043d \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0439 <strong>exe<\/strong> \u0444\u0430\u0439\u043b.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b1a\/a64\/3d2\/b1aa643d2e01eca76a479e1700cc6b05.png\" alt=\"\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 &quot;\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 Hello World&quot; \u043d\u0430 C++ \u0438 WinAPI\" title=\"\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 &quot;\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 Hello World&quot; \u043d\u0430 C++ \u0438 WinAPI\" width=\"1920\" height=\"1010\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b1a\/a64\/3d2\/b1aa643d2e01eca76a479e1700cc6b05.png\"\/><\/p>\n<div><figcaption>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u00ab\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 Hello World\u00bb \u043d\u0430\u00a0C++ \u0438 WinAPI<\/figcaption><\/div>\n<\/figure>\n<h3>Golang \u0438 WinAPI<\/h3>\n<p>\u0421\u0442\u043e\u0438\u0442 \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u044f\u0441\u043d\u0438\u0442\u044c \u0434\u043b\u044f \u043d\u0435\u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u044b\u0445\u00a0\u2014 \u0432\u00a0\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0WinAPI.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u043e\u0437\u044c\u043c\u0435\u043c <a href=\"https:\/\/github.com\/microsoft\/Windows-classic-samples\/blob\/main\/Samples\/Win7Samples\/begin\/LearnWin32\/HelloWorld\/cpp\/main.cpp\" rel=\"noopener noreferrer nofollow\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u00abHello world\u00bb<\/a> \u043d\u0430\u00a0C++ \u043f\u043e\u0434 Windows:<\/p>\n<pre><code class=\"cpp\">#ifndef UNICODE #define UNICODE #endif   #include &lt;windows.h&gt;  LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg,                                 WPARAM wParam,                                 LPARAM lParam);  int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE,                                 PWSTR pCmdLine, int nCmdShow) {     \/\/ Register the window class.     const wchar_t CLASS_NAME[]  = L\"Sample Window Class\";          WNDCLASS wc = { };      wc.lpfnWndProc   = WindowProc;     wc.hInstance     = hInstance;     wc.lpszClassName = CLASS_NAME;      RegisterClass(&amp;wc);      \/\/ Create the window.     HWND hwnd = CreateWindowEx(         0,                              \/\/ Optional window styles.         CLASS_NAME,                     \/\/ Window class         L\"Learn to Program Windows\",    \/\/ Window text         WS_OVERLAPPEDWINDOW,            \/\/ Window style          \/\/ Size and position         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,          NULL,       \/\/ Parent window             NULL,       \/\/ Menu         hInstance,  \/\/ Instance handle         NULL        \/\/ Additional application data         );      if (hwnd == NULL)     {         return 0;     }      ShowWindow(hwnd, nCmdShow);      \/\/ Run the message loop.     MSG msg = { };     while (GetMessage(&amp;msg, NULL, 0, 0))     {         TranslateMessage(&amp;msg);         DispatchMessage(&amp;msg);     }     return 0; }  LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg,                              WPARAM wParam, LPARAM lParam) {     switch (uMsg)     {     case WM_DESTROY:         PostQuitMessage(0);         return 0;     case WM_PAINT:         {             PAINTSTRUCT ps;             HDC hdc = BeginPaint(hwnd, &amp;ps);             \/\/ All painting occurs here, between BeginPaint and EndPaint.             FillRect(hdc, &amp;ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));             EndPaint(hwnd, &amp;ps);         }         return 0;     }     return DefWindowProc(hwnd, uMsg, wParam, lParam); }<\/code><\/pre>\n<p>\u041d\u0443 \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0433\u043e?<\/p>\n<p>\u0410 \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e 90% \u043a\u043e\u0434\u0430 \u0434\u0430\u0436\u0435 \u0432 \u0441\u0442\u043e\u043b\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 <em>\u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043a C++<\/em>, \u0430 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438, \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438 \u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0441\u0430\u043c\u043e\u0433\u043e WinAPI. <\/p>\n<blockquote>\n<p>\u041e\u0442\u00a0C++ \u0442\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b (int) \u0438\u00a0\u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 (case, while).<\/p>\n<\/blockquote>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u0434\u0430\u0447\u0430 \u043a\u0430\u043a-\u0442\u043e \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u00a0WinAPI (\u0434\u0430\u043b\u044c\u0448\u0435 \u0447\u0435\u043c \u0440\u0430\u0437\u043e\u0432\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438)\u00a0\u2014 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u043b\u0430, \u0435\u0441\u0442\u044c \u0438\u00a0\u0431\u0443\u0434\u0435\u0442 <strong>\u0441\u043b\u043e\u0436\u043d\u043e\u0439<\/strong>.<\/p>\n<p>\u0410\u00a0\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u043e\u0434 Windows \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u043e\u0439, \u0447\u0435\u043c\u043f\u0438\u043e\u043d\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u043d\u0435\u00a0\u0437\u043d\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 C\/C++ \u0432\u043e\u043e\u0431\u0449\u0435 \u0438\u00a0\u0432\u0441\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 (\u0434\u0430\u0436\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0443\u044e) \u0432\u0435\u0441\u0442\u0438 \u043d\u0430\u00a0\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0445 WinAPI.<\/p>\n<p>\u041d\u043e\u00a0\u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a\u00a0\u043d\u0430\u0448\u0435\u0439 \u00ab\u0433\u043e\u0448\u0435\u0447\u043a\u0435\u00bb.<\/p>\n<p>Go \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435\u00a0C++ \u0438\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u044d\u043a\u0437\u043e\u0442\u0438\u043a\u043e\u0439 \u0432\u00a0\u043c\u0438\u0440\u0435 Windows-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u043a\u0430\u043c\u043f\u0443\u0441\u043e\u0432 Google.<\/p>\n<blockquote>\n<p>\u041d\u043e \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 WinAPI \u0432 \u043d\u0435\u043c \u043e\u0447\u0435\u043d\u044c \u0434\u0430\u0436\u0435 \u043d\u0435\u043f\u043b\u043e\u0445\u0430.<\/p>\n<\/blockquote>\n<p>\u0412\u0437\u0433\u043b\u044f\u043d\u0438\u0442\u0435 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u044b\u0437\u043e\u0432 WinAPI \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043e\u0431\u043e\u0435\u0432 \u043d\u0430 Golang:<\/p>\n<pre><code class=\"go\">var (     user32DLL= windows.NewLazyDLL(\"user32.dll\")     procSystemParamInfo= user32DLL.NewProc(\"SystemParametersInfoW\") ) func main()  { imagePath, _ := windows.UTF16PtrFromString(`image.jpg`) fmt.Println(\"[+] Changing background now...\") procSystemParamInfo.Call(20, 0, uintptr(unsafe.                        Pointer(imagePath)), 0x001A) }<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0442\u0430\u043a \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0441\u043a\u0440\u044b\u0442\u044b \u0432\u0441\u0435 \u0441\u043a\u043e\u043b\u044c\u0437\u043a\u0438\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0432\u0440\u043e\u0434\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u043f\u0430\u043c\u044f\u0442\u0438, \u0433\u0434\u0435 \u043b\u0435\u0436\u0438\u0442 \u043f\u0443\u0442\u044c \u0434\u043e \u0444\u0430\u0439\u043b\u0430 \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439:<\/p>\n<pre><code class=\"go\">unsafe.Pointer(imagePath)<\/code><\/pre>\n<p>\u0438\u043b\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0441 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430\u043c\u0438:<\/p>\n<pre><code class=\"go\"> windows.UTF16PtrFromString(`image.jpg`)<\/code><\/pre>\n<p>..\u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0438\u0432\u0443 \u0434\u0430\u0435\u0448\u044c\u0441\u044f.<\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0430  \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/907\/8e4\/718\/9078e4718b1b6cabd12fc7903e7847ed.gif\" width=\"2316\" height=\"903\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/907\/8e4\/718\/9078e4718b1b6cabd12fc7903e7847ed.gif\"\/><\/figure>\n<blockquote>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0443 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u043a\u043e\u0434, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 <a href=\"https:\/\/anubissec.github.io\/How-To-Call-Windows-APIs-In-Golang\/#\" rel=\"noopener noreferrer nofollow\">\u0432\u043e\u0442 \u0442\u0443\u0442<\/a> \u043b\u0435\u0436\u0438\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0441\u0435 \u0443\u0436\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u043e.<\/p>\n<\/blockquote>\n<p>\u0421\u043a\u0430\u0436\u0443 \u043b\u0438\u0448\u044c \u0447\u0442\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u0442\u043e\u043b\u044c \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 WinAPI, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043d\u0435 <s>\u0443\u0442\u043e\u043f\u0438\u0442\u044c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f<\/s> \u0443\u0442\u043e\u043d\u0443\u0442\u044c \u0432 \u0434\u0435\u0442\u0430\u043b\u044f\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/53e\/d74\/ef8\/53ed74ef88bff2c3f42b4c297ed80d85.png\" alt=\"\u0417\u0430\u043f\u0443\u0441\u043a \u0434\u0435\u043c\u043e \u0441 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u043c \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c WinAPI\" title=\"\u0417\u0430\u043f\u0443\u0441\u043a \u0434\u0435\u043c\u043e \u0441 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u043c \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c WinAPI\" width=\"1514\" height=\"768\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/53e\/d74\/ef8\/53ed74ef88bff2c3f42b4c297ed80d85.png\"\/><\/p>\n<div><figcaption>\u0417\u0430\u043f\u0443\u0441\u043a \u0434\u0435\u043c\u043e \u0441 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u043c \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c WinAPI<\/figcaption><\/div>\n<\/figure>\n<h3>WinAPI \u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/h3>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u0447\u0435\u0441\u0442\u043d\u043e \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c <strong>\u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u044e<\/strong> \u043b\u043e\u0433\u0438\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 WinAPI \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e <em>\u0432\u0440\u0443\u0447\u043d\u0443\u044e<\/em>, \u043a\u0430\u043a \u0432 <a href=\"https:\/\/gist.github.com\/NaniteFactory\/0bd94e84bbe939cda7201374a0c261fd\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435<\/a> \u0441\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u044b\u043c \u043e\u043a\u043d\u043e\u043c:<\/p>\n<pre><code class=\"go\">import ( \"syscall\" \"unsafe\" )  \/\/ MessageBox of Win32 API. func MessageBox(hwnd uintptr, caption, title string, flags uint) int { ret, _, _ := syscall.NewLazyDLL(\"user32.dll\").          NewProc(\"MessageBoxW\").Call( uintptr(hwnd), uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(caption))), uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(title))), uintptr(flags)) return int(ret) }  \/\/ MessageBoxPlain of Win32 API. func MessageBoxPlain(title, caption string) int { const ( NULL  = 0 MB_OK = 0 ) return MessageBox(NULL, caption, title, MB_OK) }<\/code><\/pre>\n<p>\u0418\u00a0\u043e\u043d\u043e \u0434\u0430\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e.<\/p>\n<p>\u041d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u0435\u043c \u043a\u043e\u0434\u0430 \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u0432\u044b\u0440\u043e\u0441 \u0434\u043e \u0431\u044b\u043b\u0438\u043d\u043d\u044b\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0438 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0432\u043b\u0435\u0437\u0430\u043b \u0432 \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u0441\u0442\u0430\u0442\u044c\u0438. <\/p>\n<blockquote>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0442\u00a0\u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c\u00a0\u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u043e\u0441\u0442\u0430\u0432\u0438\u0432 \u043b\u0438\u0448\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0442\u0440\u0435\u0435\u043c.<\/p>\n<\/blockquote>\n<p>\u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u044f \u043e\u0442\u0434\u0430\u043b \u043d\u0430 \u043e\u0442\u043a\u0443\u043f \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c.<\/p>\n<p>\u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043e\u043a\u043e\u043d \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0431\u044b\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0447\u0435\u0440\u0435\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"https:\/\/github.com\/rodrigocfd\/windigo\" rel=\"noopener noreferrer nofollow\">Windigo<\/a>. \u2014\u00a0\u0445\u043e\u0442\u044f \u044d\u0442\u043e \u043f\u043e-\u0441\u0443\u0442\u0438 \u043b\u0438\u0448\u044c \u043d\u0430\u0431\u043e\u0440 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u043e\u0432 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 WinAPI.<\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0434\u0435\u043c\u043e-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Windigo:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e0b\/d53\/23a\/e0bd5323a4ad2af4b2a97800ac89a3bf.gif\" alt=\"\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0442\u0443\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0432\u0441\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0440\u0430\u0434\u043e\u0441\u0442\u0438 Windigo, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0431\u0435\u0437 \u0434\u043e\u043b\u0433\u0438\u0445 \u0447\u0430\u0441\u043e\u0432 \u043a\u0430\u043c\u043b\u0430\u043d\u0438\u044f \u043d\u0430\u0434 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439\" title=\"\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0442\u0443\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0432\u0441\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0440\u0430\u0434\u043e\u0441\u0442\u0438 Windigo, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0431\u0435\u0437 \u0434\u043e\u043b\u0433\u0438\u0445 \u0447\u0430\u0441\u043e\u0432 \u043a\u0430\u043c\u043b\u0430\u043d\u0438\u044f \u043d\u0430\u0434 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439\" width=\"400\" height=\"204\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e0b\/d53\/23a\/e0bd5323a4ad2af4b2a97800ac89a3bf.gif\"\/><\/p>\n<div><figcaption>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0442\u0443\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0432\u0441\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0440\u0430\u0434\u043e\u0441\u0442\u0438 Windigo, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0431\u0435\u0437 \u0434\u043e\u043b\u0433\u0438\u0445 \u0447\u0430\u0441\u043e\u0432 \u043a\u0430\u043c\u043b\u0430\u043d\u0438\u044f \u043d\u0430\u0434 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439<\/figcaption><\/div>\n<\/figure>\n<h3>func main()<\/h3>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Go \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e <a href=\"https:\/\/go.dev\/ref\/spec\" rel=\"noopener noreferrer nofollow\">\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/a> \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <em>func main()<\/em> \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 <em>main<\/em>:<\/p>\n<blockquote>\n<p>A complete program is created by linking a single, unimported package called the main package with all the packages it imports, transitively. The main package must have package name main and declare a function main that takes no arguments and returns no value.<\/p>\n<\/blockquote>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0436\u0435 \u0441\u0442\u0440\u043e\u043a\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 main() \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0438:<\/p>\n<pre><code class=\"go\">runtime.LockOSThread()<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u0432\u044b\u0437\u043e\u0432 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <em>runtime<\/em> \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 goroutines (\u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 Go) \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c \u0432 <strong>\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445<\/strong> \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u0430\u0445 \u043a\u0430\u0436\u0434\u044b\u0439.<\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u043c \u0437\u0430 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441:<\/p>\n<blockquote>\n<p>A goroutine should call LockOSThread before calling OS services or non-Go library functions that depend on per-thread state.<\/p>\n<\/blockquote>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u0439 \u0437\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430:<\/p>\n<pre><code class=\"go\">mainWindow = newMyWindow()<\/code><\/pre>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043a\u0430\u043a \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0438 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0437\u0430 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f:<\/p>\n<pre><code class=\"go\">func newMyWindow() *MyWindow<\/code><\/pre>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430:<\/p>\n<pre><code class=\"go\">type MyWindow struct {     wnd     ui.WindowMain       lblName ui.Static       txtName ui.Edit    btnShow ui.Button    }<\/code><\/pre>\n<p>\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u0435 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\u00a0\u2014 \u0441\u0430\u043c\u043e \u043e\u043a\u043d\u043e (wnd), \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0443\u044e \u043c\u0435\u0442\u043a\u0443 (lblName), \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 (txtName) \u0438 \u043a\u043d\u043e\u043f\u043a\u0443 (btnShow).<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043e\u043a\u043d\u0430:<\/p>\n<pre><code class=\"go\">opts := ui.WindowMainOpts().         ClassStyles(co.CS_NOCLOSE).           Title(\"Tiny Server\").           ClientArea(win.SIZE{Cx: 600, Cy: 245})<\/code><\/pre>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/winmsg\/window-class-styles\" rel=\"noopener noreferrer nofollow\"><em>co.CS_NOCLOSE<\/em><\/a> \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430:<\/p>\n<blockquote>\n<p><strong>CS_NOCLOSE <\/strong>0x0200 Disables <strong>Close<\/strong> on the window menu.<\/p>\n<\/blockquote>\n<p>\u041d\u0443\u00a0\u0438\u00a0\u0434\u0430\u043b\u044c\u0448\u0435 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0438\u00a0\u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043e\u043a\u043d\u0430\u00a0\u2014 \u0442\u0443\u0442 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>\u0421\u043b\u043e\u0436\u043d\u043e \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435:<\/p>\n<pre><code class=\"go\">if DebugMode == \"false\" { \/\/ ID of icon resource, see resources folder \/\/ does not work in debug mode opts = opts.IconId(101) }<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043a\u043e\u043d\u043a\u0430 \u043e\u043a\u043d\u0430 \u0432 \u0432\u0438\u0434\u0435 \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0433\u043e ID \u0440\u0435\u0441\u0443\u0440\u0441\u0430, \u0444\u0430\u0439\u043b \u0441 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 <em>minimal.syso<\/em> \u0431\u044b\u043b \u0432\u0437\u044f\u0442 \u0438\u0437 <a href=\"https:\/\/github.com\/rodrigocfd\/windigo\/tree\/master\/resources\" rel=\"noopener noreferrer nofollow\">\u0434\u0435\u043c\u043e-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 Windigo<\/a>:<\/p>\n<blockquote>\n<p>A syso file, ready to use, that contains the icon and the manifest. Just place it at the root folder of your project. You can load the icon using the resource ID 101.<\/p>\n<\/blockquote>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u0437\u043e\u0432 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u043a\u043d\u0430:<\/p>\n<pre><code class=\"go\">\/\/ create main window wnd := ui.NewWindowMain(opts)<\/code><\/pre>\n<p>\u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f WinAPI <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/api\/winuser\/nf-winuser-createwindowexw\" rel=\"noopener noreferrer nofollow\">CreateWindowEx<\/a>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u043a\u043d\u0430.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<pre><code class=\"go\">\/\/ build UI me := &amp;MyWindow{ wnd: wnd, \/\/ add label lblName: ui.NewStatic(wnd, ui.StaticOpts(). Text(\"Server log\"). Position(win.POINT{X: 10, Y: 22}), ), \/\/ add shutdown button btnShow: ui.NewButton(wnd, ui.ButtonOpts(). Text(\"&amp;Quit\"). Position(win.POINT{X: 510, Y: 17}), ), \/\/ add message log (text area) txtName: ui.NewEdit(wnd, ui.EditOpts(). WndStyles(co.WS_CHILD|co.WS_VISIBLE|co.WS_VSCROLL). CtrlStyles(co.ES_AUTOHSCROLL|co.ES_MULTILINE|co.ES_LEFT|co.ES_READONLY). Position(win.POINT{X: 0, Y: 45}). Size(win.SIZE{Cx: 600, Cy: 200}), ), }<\/code><\/pre>\n<p>\u0412\u0430\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 WinAPI \u0437\u0430 \u043b\u044e\u0431\u043e\u0439 \u0432\u0432\u043e\u0434 \u0442\u0435\u043a\u0441\u0442\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/controls\/about-edit-controls\" rel=\"noopener noreferrer nofollow\">CEdit<\/a>, c \u0440\u0430\u0437\u043d\u044b\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a:<\/p>\n<ul>\n<li>\n<p>co.ES_MULTILINE\u00a0\u2014 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043d\u0430\u00a0\u0432\u0432\u043e\u0434 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0442\u0440\u043e\u043a (\u043a\u0430\u043a textarea \u0432\u00a0HTML);<\/p>\n<\/li>\n<li>\n<p>co.WS_VISIBLE\u00a0\u2014 \u043e\u043a\u043d\u043e \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0440\u044b\u0442\u043e;<\/p>\n<\/li>\n<li>\n<p>co.WS_VSCROLL\u00a0\u2014 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b;<\/p>\n<\/li>\n<li>\n<p>co.ES_AUTOHSCROLL\u00a0\u2014 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b;<\/p>\n<\/li>\n<li>\n<p>co.ES_READONLY\u00a0\u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"go\">\/\/ setup handler on 'shutdown' button click me.btnShow.On().BnClicked(func() { \/\/ start confirmation dialog        resp := me.wnd.Hwnd().MessageBox(\"Quit application?\",                  \"Confirm quit\", co.MB_YESNO) \/\/ if user clicked 'YES' - shutdown application if resp == co.ID_YES { appendToLog(\"Exiting..\") if httpSrv != nil { if err := httpSrv.Close(); err != nil { fmt.Printf(\"HTTP close error: %v\", err) } } me.wnd.Hwnd().DestroyWindow() os.Exit(0) } })<\/code><\/pre>\n<p>\u041f\u043e \u043a\u043b\u0438\u043a\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0438\u0430\u043b\u043e\u0433 \u0441 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0442\u0440\u0435\u0434\u0430:<\/p>\n<pre><code class=\"go\"> resp := me.wnd.Hwnd().MessageBox(\"Quit application?\",                  \"Confirm quit\", co.MB_YESNO)<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0436\u0430\u043b \u043a\u043d\u043e\u043f\u043a\u0443 \u00abYes\u00bb (\u0442.\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e), \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430: <\/p>\n<pre><code class=\"go\">if httpSrv != nil { if err := httpSrv.Close(); err != nil { fmt.Printf(\"HTTP close error: %v\", err) } }<\/code><\/pre>\n<p>\u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"go\">me.wnd.Hwnd().DestroyWindow()<\/code><\/pre>\n<p>\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b:<\/p>\n<pre><code class=\"go\">os.Exit(0)<\/code><\/pre>\n<p>\u0421\u043b\u0435\u0434\u0443\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 main \u043c\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0438\u043a\u043e\u043d\u043a\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0443\u044e \u0432 \u0442\u0440\u0435\u0435:<\/p>\n<pre><code class=\"go\">var trayIcon win.HICON  \/\/ Load icon \/\/ in debug mode, there are no resources available, so we need to load \/\/ icons from FS if DebugMode == \"false\" { trayIcon = win.HICON( win.GetModuleHandle(win.StrOptNone()).LoadImage( win.ResIdInt(101), co.IMAGE_ICON, 16, 16, co.LR_DEFAULTCOLOR, )) } else { trayIcon = win.HICON( win.GetModuleHandle(win.StrOptNone()).LoadImage( win.ResIdStr(\"gopher.ico\"), co.IMAGE_ICON, 16, 16, co.LR_DEFAULTCOLOR|co.LR_LOADFROMFILE, )) }<\/code><\/pre>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0434\u043b\u044f \u0440\u0435\u0436\u0438\u043c\u0430 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0438\u00a0\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u00a0\u0433\u043e\u0442\u043e\u0432\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0438\u043a\u043e\u043d\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432\u00a0\u0440\u0435\u0441\u0443\u0440\u0441\u0430\u0445\u00a0\u2014 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435, \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c.<\/p>\n<p>\u0410 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043b\u0438\u0431\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432\u0440\u043e\u0434\u0435:<\/p>\n<pre><code class=\"powershell\">go run main.go<\/code><\/pre>\n<p>\u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0438\u043a\u043e\u043d\u043a\u0443 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043d\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"go\">\/\/ close systray on main window destroy mainWindow.wnd.On().WmDestroy(func() { if tray != nil { tray.Dispose() } })<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430, \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u0438\u00a0\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u0442\u0440\u0435\u044f\u00a0\u2014 \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u043e\u0439 \u0438\u043d\u043e\u043d\u043a\u0438, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0437\u0430\u043a\u0440\u044b\u043b\u043e\u0441\u044c, \u0430\u00a0\u0435\u0433\u043e \u0438\u043a\u043e\u043d\u043a\u0430 \u0434\u043e\u00a0\u0441\u0438\u0445 \u043f\u043e\u0440 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u0442\u0440\u0435\u0435.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u0432\u0435\u0448\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044e \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430, \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0439\u043c\u0430\u0442\u044c \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u043b\u043d\u043e\u0439 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440: <\/p>\n<pre><code class=\"go\">var configured = false \/\/ check for action that runs only once  mainWindow.wnd.On().WmActivate(func(p wm.Activate) { \/\/ we need to run our handler logic only once at start if configured { return } configured = true go startServer() })<\/code><\/pre>\n<p>\u0421\u0442\u043e\u043b\u044c \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0430\u0440\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438:<\/p>\n<blockquote>\n<p>\u043c\u0435\u0442\u043e\u0434 startServer () \u043f\u0438\u0448\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432\u00a0\u00ab\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043b\u043e\u0433\u00bb, \u0435\u0441\u043b\u0438 \u043e\u043d\u00a0\u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u043d\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u00a0\u2014 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u043f\u0430\u0434\u0443\u0442.<\/p>\n<\/blockquote>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u0442\u043e\u043c \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0447\u0438\u043a \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0438\u00a0\u043d\u0430\u00a0\u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0443\u044e \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0441\u043b\u0435 \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043e\u043a\u043d\u0430)\u00a0\u2014 \u0447\u0442\u043e\u0431\u044b \u043b\u043e\u0433\u0438\u043a\u0430 \u043d\u0435\u00a0\u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u00a0\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <em>configured<\/em>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0444\u043b\u0430\u0433\u0430 \u00ab\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430\u00bb.<\/p>\n<p>\u041d\u0443 \u0438 \u0441\u0430\u043c \u0437\u0430\u043f\u0443\u0441\u043a HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430:<\/p>\n<pre><code class=\"go\">go startServer()<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0442\u0440\u0435\u044f \u043f\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430:<\/p>\n<pre><code class=\"go\">\/\/ action on windows create \/\/ runs once mainWindow.wnd.On().WmNcCreate(func(p wm.Create) bool { \/\/ create systray tray := systray.CreateSysTray() \/\/ set handler on icon click - just focus on main window systray.SetTrayClickHandler(func() { systray.ShowWindow(uintptr(mainWindow.wnd.Hwnd()),  systray.SW_SHOWNORMAL) })  tray.SetIcon(uintptr(trayIcon)) tray.SetTooltip(\"Tiny Server: click me to show main window.\")  return true })<\/code><\/pre>\n<p>\u041d\u0443\u0436\u043d\u043e \u044d\u0442\u043e \u043f\u043e \u0442\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0447\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/apps\/develop\/ui-input\/retrieve-hwnd\" rel=\"noopener noreferrer nofollow\">window handle<\/a>:<\/p>\n<pre><code class=\"go\">mainWindow.wnd.Hwnd()<\/code><\/pre>\n<p>\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u043e\u043a\u043d\u043e\u043c:<\/p>\n<pre><code class=\"go\">systray.ShowWindow(uintptr(mainWindow.wnd.Hwnd())<\/code><\/pre>\n<p>\u0414\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 (\u0442.\u0435. \u0434\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430) HWND \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u043a\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 <strong>\u043f\u0443\u0441\u0442\u044b\u043c<\/strong>. <\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0433 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <em>main()<\/em> \u044d\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 c\u043e\u0431\u044b\u0442\u0438\u0439:<\/p>\n<pre><code class=\"go\">mainWindow.wnd.RunAsMain()<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u0447\u043d\u0435\u0442 \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u0440\u043e\u0434\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043b\u0430\u0432\u0438\u0448 \u0438\u043b\u0438 \u043a\u043b\u0438\u043a\u043e\u0432 \u043c\u044b\u0448\u043a\u043e\u0439.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0442\u0440\u0435\u0435\u043c\u00a0\u2014 \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u0447\u0438\u0441\u0442\u044b\u043c WinAPI.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/aaf\/eca\/436\/aafeca4362edaf9343963d4935a55bf6.png\" alt=\"\u0412\u043e\u0442 \u0442\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 Windows 11\" title=\"\u0412\u043e\u0442 \u0442\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 Windows 11\" width=\"742\" height=\"220\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/aaf\/eca\/436\/aafeca4362edaf9343963d4935a55bf6.png\"\/><\/p>\n<div><figcaption>\u0412\u043e\u0442 \u0442\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 Windows 11<\/figcaption><\/div>\n<\/figure>\n<h3>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0442\u0440\u0435\u0435\u043c<\/h3>\n<p>\u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f \u0435\u0441\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u043e\u0449\u0435: <\/p>\n<blockquote>\n<p>\u0432\u0437\u044f\u0442\u044c \u043e\u0434\u043d\u0443 \u0438\u0437\u00a0\u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0447\u0442\u043e \u0435\u0441\u0442\u044c <a href=\"https:\/\/github.com\/getlantern\/systray\" rel=\"noopener noreferrer nofollow\">\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0435<\/a>\u00a0\u2014 \u0441\u0440\u0430\u0437\u0443 \u0434\u043b\u044f Windows, MacOS \u0438\u00a0Linux \u0438 \u0432\u0441\u0435\u0439\u00a0\u043a\u0443\u0447\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0440\u0435\u0434 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/blockquote>\n<p>\u041d\u043e\u00a0\u0444\u0430\u043d\u0430 \u0440\u0430\u0434\u0438 \u0438\u00a0\u043f\u043e\u043b\u044c\u0437\u044b \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f, \u0431\u044b\u043b \u0438\u0437\u0431\u0440\u0430\u043d \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043f\u0443\u0442\u044c\u00a0\u2014 <s>\u0437\u0430\u043a\u0430\u0442 \u0441\u043e\u043b\u043d\u0446\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e<\/s> \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0442\u0440\u0435\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 WinAPI.<\/p>\n<p>\u0412\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 <em>systray<\/em>: <\/p>\n<pre><code class=\"go\">import ( ..   systray \"github.com\/alex0x08\/ungoogled-go\/systray\" .. )<\/code><\/pre>\n<p>\u041c\u0435\u0441\u0442\u043e \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"go\">\/\/ creates systray icon func CreateSysTray() *TrayIcon { \/\/ first, create hidden message-only window hwnd, err := createMessageWindow() if err != nil { panic(err) } \/\/ create systray with parent = our message-only window ti, err := newTrayIcon(hwnd) if err != nil { panic(err) } return ti }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435 \u0442\u0443\u0442 \u043d\u0435\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0435 \u043e\u043a\u043d\u043e\u00a0\u2014 \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043a\u0440\u044b\u0442\u043e\u0435 \u043e\u043a\u043d\u043e, <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/winmsg\/window-features#message-only-windows\" rel=\"noopener noreferrer nofollow\">\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u0435\u043c\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439<\/a>:<\/p>\n<pre><code class=\"go\">func createMessageWindow() (uintptr, error) { hInstance, err := GetModuleHandle(nil) if err != nil { return 0, err }  wndClass := windows.StringToUTF16Ptr(\"MyWindow\")  var wcex WNDCLASSEX  wcex.CbSize = uint32(unsafe.Sizeof(wcex)) wcex.LpfnWndProc = windows.NewCallback(wndProc) wcex.HInstance = hInstance wcex.LpszClassName = wndClass if _, err := RegisterClassEx(&amp;wcex); err != nil { return 0, err }  hwnd, err := CreateWindowEx( 0, wndClass, windows.StringToUTF16Ptr(\"\"), WS_OVERLAPPED, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, uintptr(HWND_MESSAGE), 0, hInstance, nil) if err != nil { return 0, err } return hwnd, nil }<\/code><\/pre>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0442\u0443\u0442\u00a0\u2014 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 WinAPI <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/api\/winuser\/nf-winuser-createwindowexw\" rel=\"noopener noreferrer nofollow\">CreateWindowEx<\/a>, c\u00a0\u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u043b\u0430\u0433\u0430 HWND_MESSAGE:<\/p>\n<pre><code class=\"go\">hwnd, err := CreateWindowEx( .. uintptr(HWND_MESSAGE) .. )<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u0444\u043b\u0430\u0433\u0443 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u043e \u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u044f:<\/p>\n<pre><code class=\"go\">\/\/ this is main window function \/\/ see https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/api\/winuser\/nc-winuser-wndproc func wndProc(hWnd uintptr, msg uint32, wParam, lParam uintptr) uintptr { switch msg { case TrayIconMsg: nmsg := LOWORD(uint32(lParam)) \/\/ if user clicked on tray icon if nmsg == WM_LBUTTONDOWN { \/\/ if callback function exist if trayClickCallback != nil { trayClickCallback() } } case WM_DESTROY: PostQuitMessage(0) default: r, _ := DefWindowProc(hWnd, msg, wParam, lParam) return r } return 0 }<\/code><\/pre>\n<p>\u0414\u0430, \u044d\u0442\u043e \u0432\u0441\u0435 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0442\u0430\u0440\u044b\u0439 \u0434\u043e\u0431\u0440\u044b\u0439 <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/api\/winuser\/nc-winuser-wndproc\" rel=\"noopener noreferrer nofollow\">WndProc<\/a> , \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043b\u044e\u0431\u044b\u043c Windows-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c.<\/p>\n<p>\u0411\u043b\u043e\u043a \u0432\u043d\u0443\u0442\u0440\u0438:<\/p>\n<pre><code class=\"go\">.. case TrayIconMsg: nmsg := LOWORD(uint32(lParam)) \/\/ if user clicked on tray icon if nmsg == WM_LBUTTONDOWN { \/\/ if callback function exist if trayClickCallback != nil { trayClickCallback() } } ..<\/code><\/pre>\n<p>\u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u044f.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044e \u043a\u043b\u0438\u043a\u0430 \u043b\u0435\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438 \u043c\u044b\u0448\u0438 (<a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/inputdev\/wm-lbuttondown\" rel=\"noopener noreferrer nofollow\">WM_LBUTTONDOWN<\/a>) \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"go\">systray.SetTrayClickHandler(func() { systray.ShowWindow(uintptr(mainWindow.wnd.Hwnd()) , systray.SW_SHOWNORMAL) })<\/code><\/pre>\n<p>\u0410 <em>systray.ShowWindow()<\/em> \u044d\u0442\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u0440\u0435\u0442\u043a\u0430 \u043d\u0430\u0434 \u0447\u0438\u0441\u0442\u044b\u043c WinAPI:<\/p>\n<pre><code class=\"go\">func ShowWindow(hWnd uintptr, nCmdShow int32) (int32, error) { r, _, err := procShowWindow.Call(hWnd, uintptr(nCmdShow)) if r == 0 { return 0, err } return int32(r), nil }<\/code><\/pre>\n<p>\u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 <em>procShowWindow<\/em>\u00a0\u2014 \u0447\u0438\u0441\u0442\u044b\u0439 definition \u0434\u043b\u044f \u0444\u0443\u043a\u043d\u0446\u0438\u0438 WinAPI <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/api\/winuser\/nf-winuser-showwindow\" rel=\"noopener noreferrer nofollow\">ShowWindow<\/a>:<\/p>\n<pre><code class=\"go\">.. libuser32   = windows.NewLazySystemDLL(\"user32.dll\") .. procShowWindow        = libuser32.NewProc(\"ShowWindow\") ..<\/code><\/pre>\n<p>\u0421\u043b\u043e\u0432\u043e\u043c, \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441\u00a0WinAPI \u0438\u00a0\u043b\u0435\u0433\u043a\u043e\u0441\u0442\u0438 \u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0440\u0430\u0436\u0430\u0435\u0442 \u0432\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e1a\/0d7\/b5c\/e1a0d7b5ca89ee2a0cee2462e0722819.png\" alt=\"\u041b\u043e\u0433 \u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c\" title=\"\u041b\u043e\u0433 \u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c\" width=\"968\" height=\"478\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e1a\/0d7\/b5c\/e1a0d7b5ca89ee2a0cee2462e0722819.png\"\/><\/p>\n<div><figcaption>\u041b\u043e\u0433 \u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c<\/figcaption><\/div>\n<\/figure>\n<h3>\u041b\u043e\u0433 <\/h3>\n<p>\u041e\u043d\u00a0\u0436\u0435 \u00ab\u0436\u0443\u0440\u043d\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u044b\u00bb\u00a0\u2014 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0432\u00a0\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438. \u041b\u043e\u0433\u0438\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"go\">\/\/ appends to UI log func appendToLog(message string) { \/\/ could be no window yet if mainWindow == nil || mainWindow.txtName == nil { fmt.Println(message) return } \/\/ window could be not visible yet \/\/ and attempt to add message will raise an exception if !mainWindow.txtName.Hwnd().IsWindowVisible() { fmt.Println(message) return } \/\/ get current text txt := mainWindow.txtName.Text() \/\/ to avoid overflow if len(txt) &gt; 512 { txt = \"\" } b := strings.Builder{} b.WriteString(txt)     \/\/ append existing text b.WriteString(message) \/\/ append new message b.WriteString(\"\\r\\n\")  \/\/ this is Windows, so \\r\\n, not \\n ! \/\/ and finally set updated text (yep, there is no append, sorry) mainWindow.txtName.SetText(b.String()) }<\/code><\/pre>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043f\u043e\u043b\u043d\u043e\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0442\u0443\u0442 \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u0432\u043e\u0442 \u0442\u0430\u043a\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430:<\/p>\n<pre><code>if !mainWindow.txtName.Hwnd().IsWindowVisible() { fmt.Println(message) return }<\/code><\/pre>\n<p>\u041d\u0443\u0436\u043d\u043e \u044d\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e <a href=\"https:\/\/learn.microsoft.com\/en-us\/cpp\/mfc\/reference\/cedit-class?view=msvc-170\" rel=\"noopener noreferrer nofollow\">CEdit<\/a> \u043d\u0435 \u0434\u0430\u0441\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0435\u0441\u043b\u0438 \u0441\u0430\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0435\u0449\u0435 \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f, \u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 API \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e (\u0445\u043e\u0442\u044f \u0434\u043b\u044f \u043a\u043e\u0433\u043e \u043a\u0430\u043a) \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0447\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 Windows \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u043d\u0435\u00a0\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f (append)\u00a0\u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u043d\u0443\u044e \u0437\u0430\u043c\u0435\u043d\u0443 \u0432\u0441\u0435\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430:<\/p>\n<pre><code class=\"go\">\/\/ get current text txt := mainWindow.txtName.Text() \/\/ to avoid overflow if len(txt) &gt; 512 { txt = \"\" } b := strings.Builder{} b.WriteString(txt)     \/\/ append existing text b.WriteString(message) \/\/ append new message b.WriteString(\"\\r\\n\")  \/\/ this is Windows, so \\r\\n, not \\n ! \/\/ and finally set updated text (yep, there is no append, sorry) mainWindow.txtName.SetText(b.String())<\/code><\/pre>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u00a0\u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043a\u043e\u043b\u0445\u043e\u0437, \u043d\u043e\u00a0\u0443\u0432\u044b\u00a0\u2014 \u0442\u0430\u043a\u043e\u0432\u044b \u0440\u0435\u0430\u043b\u0438\u0438 WinAPI.<\/p>\n<h3>\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 HTTP-\u0441\u0435\u0440\u0432\u0435\u0440<\/h3>\n<p>\u0412 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 Golang \u0438\u0434\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0439 HTTP-\u0441\u0435\u0440\u0432\u0435\u0440 (\u043f\u0430\u043a\u0435\u0442 \u00ab<a href=\"https:\/\/pkg.go.dev\/net\/http\" rel=\"noopener noreferrer nofollow\">net\/http<\/a>\u00bb), \u0441 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430\u043c\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0434\u043b\u044f \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439.<\/p>\n<p>\u0421 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0438\u043b\u0430\u043c\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u043c\u0435\u0442\u043e\u0434 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"go\">\/\/ starts HTTP server func startServer() { appendToLog(fmt.Sprintf(\"Starting, debug mode: %s\", DebugMode))  \/\/ firewall bypass does not work correctly in debug mode if DebugMode == \"false\" { server.AddAppFirewallRule() appendToLog(\"Added firewall rule..\") } \/\/ create request multiplexer, see https:\/\/pkg.go.dev\/net\/http#ServeMux mux := http.NewServeMux() \/\/ test assembler method mux.HandleFunc(\"\/asmtest\", server.TestAsmMethod) \/\/ upload &amp; set wallpaper image mux.HandleFunc(\"\/upload\", server.UploadHandler) \/\/ default handler mux.HandleFunc(\"\/\", server.IndexHandler)  \/\/ if this is production mode - bind to all interfaces if DebugMode == \"false\" { httpSrv = &amp;http.Server{ Addr:    \":8090\", Handler: mux, } } else { \/\/ otherwise - bind to localhost (firewall bypass  \/\/ does not work in debug mode) httpSrv = &amp;http.Server{ Addr:    \"localhost:8090\", Handler: mux, } }  appendToLog(fmt.Sprintf(\"Server started at %s\", httpSrv.Addr)) \/\/ set logging handler server.SetMessageLogHandler(appendToLog) httpSrv.ListenAndServe() \/\/ here will be lock }<\/code><\/pre>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0447\u0442\u043e \u0442\u0443\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043f\u0435\u0440\u0432\u044b\u043c \u0448\u0430\u0433\u043e\u043c \u0438\u0434\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043b\u043e\u0433:<\/p>\n<pre><code class=\"go\">appendToLog(fmt.Sprintf(\"Starting, debug mode: %s\", DebugMode))<\/code><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c NAG-screen \u0444\u0430\u0439\u0440\u0432\u043e\u043b\u0430:<\/p>\n<pre><code class=\"go\">\/\/ firewall bypass does not work correctly in debug mode if DebugMode == \"false\" { server.AddAppFirewallRule() appendToLog(\"Added firewall rule..\") }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043e \u043d\u0438\u0436\u0435, \u043f\u043e\u043a\u0430 \u0437\u0430\u043c\u0435\u0447\u0443 \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043e\u0431\u0445\u043e\u0434 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0443\u0442 \u0438 \u0441\u0442\u043e\u0438\u0442 \u0442\u0430\u043a\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u043d\u0430\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0430\u0446\u0438\u044f \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u043e\u0440\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432:<\/p>\n<pre><code class=\"go\">\/\/ create request multiplexer, see https:\/\/pkg.go.dev\/net\/http#ServeMux mux := http.NewServeMux()<\/code><\/pre>\n<p>\u0438 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c URL:<\/p>\n<pre><code class=\"go\">\/\/ test assembler method mux.HandleFunc(\"\/asmtest\", server.TestAsmMethod) \/\/ upload &amp; set wallpaper image mux.HandleFunc(\"\/upload\", server.UploadHandler) \/\/ default handler mux.HandleFunc(\"\/\", server.IndexHandler)<\/code><\/pre>\n<p>\u0422.\u0435. \u043f\u043e \u043a\u0430\u043a\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. <\/p>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u0432\u0441\u0435\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u0430 \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435, \u0430 \u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u0439\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u043b\u043e\u0433\u0438\u043a\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430:<\/p>\n<pre><code class=\"go\">\/\/ if this is production mode - bind to all interfaces if DebugMode == \"false\" { httpSrv = &amp;http.Server{ Addr:    \":8090\", Handler: mux, } } else { \/\/ otherwise - bind to localhost (firewall bypass  \/\/ does not work in debug mode) httpSrv = &amp;http.Server{ Addr:    \"localhost:8090\", Handler: mux, } }<\/code><\/pre>\n<p>\u0412\u0441\u044f \u044d\u0442\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u043d\u044f \u043d\u0443\u0436\u043d\u0430 \u043f\u043e \u0442\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0447\u0442\u043e \u0432 Golang \u043d\u0435\u0442 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Ternary_operation\" rel=\"noopener noreferrer nofollow\">\u0442\u0435\u0440\u043d\u0430\u0440\u043e\u0432<\/a>, \u0442.\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0432\u0440\u043e\u0434\u0435:<\/p>\n<pre><code class=\"go\">Addr = DebugMode? \"localhost:8090\" : \":8090\"<\/code><\/pre>\n<p>\u041a\u0430\u043a \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0432 Java \u0438\u043b\u0438 Typescript.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u043b\u0438\u0431\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043e\u0442\u0434\u0430\u044e\u0449\u0443\u044e \u0430\u0434\u0440\u0435\u0441, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430\u00a0DebugMode, \u043b\u0438\u0431\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0430\u043a \u043d\u0430\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435\u00a0\u2014 \u0434\u0432\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0431\u043b\u043e\u043a\u0430.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u043b\u043e\u0433\u0438\u043a\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"go\">\/\/ set logging handler server.SetMessageLogHandler(appendToLog)<\/code><\/pre>\n<p>\u0421\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043e\u043d \u0432\u044b\u0437\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"go\">\/\/ logs message with callback on UI func logMessage(message string) {     if messageLogCallback != nil {           messageLogCallback(message)        } else {             fmt.Println(message)       } }<\/code><\/pre>\n<p>\u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"go\">logMessage(fmt.Sprintf(\"Background changed to %s\", dst.Name()))<\/code><\/pre>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430:<\/p>\n<pre><code class=\"go\">httpSrv.ListenAndServe() \/\/ here will be lock<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0447\u0442\u043e<em> httpSrv<\/em> \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u043a\u0430\u043a \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f:<\/p>\n<pre><code class=\"go\">var ( tray       *systray.TrayIcon httpSrv    *http.Server mainWindow *MyWindow \/\/You can only set string variables with -X linker flag. From the docs: DebugMode = \"true\" )<\/code><\/pre>\n<p>\u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c HTTP-\u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b (graceful shutdown):<\/p>\n<pre><code class=\"go\">if httpSrv != nil { if err := httpSrv.Close(); err != nil { fmt.Printf(\"HTTP close error: %v\", err) } }<\/code><\/pre>\n<h3>\u041e\u0431\u0445\u043e\u0434 \u0444\u0430\u0439\u0440\u0432\u043e\u043b\u0430<\/h3>\n<p>\u0418\u00a0\u043d\u0435\u00a0\u043d\u0430\u0434\u043e \u0442\u0430\u043a \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c\u00a0\u2014 \u0440\u0435\u0447\u044c \u043f\u0440\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0435\u0431\u0435 <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/fwp\/windows-filtering-platform-start-page\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 API<\/a>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0435 \u043e\u0442\u043a\u0440\u043e\u0432\u0435\u043d\u043d\u043e \u0434\u0443\u0440\u0430\u0446\u043a\u043e\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3b4\/1aa\/6a6\/3b41aa6a6d39c0957a572176c53faf27.png\" alt=\"\u0411\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0435\u0449\u0435 \u0432 Windows 7 \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043b\u044c\u044e: \u0432\u044b\u0431\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\" title=\"\u0411\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0435\u0449\u0435 \u0432 Windows 7 \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043b\u044c\u044e: \u0432\u044b\u0431\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\" width=\"733\" height=\"687\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3b4\/1aa\/6a6\/3b41aa6a6d39c0957a572176c53faf27.png\"\/><\/p>\n<div><figcaption>\u0411\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0435\u0449\u0435 \u0432 Windows 7 \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043b\u044c\u044e: \u0432\u044b\u0431\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c, \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0432\u043e\u043b\u0435\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/github.com\/tailscale\/wf\" rel=\"noopener noreferrer nofollow\">\u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043f\u0430\u043a\u0435\u0442<\/a> \u0441 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0430\u043c\u0438:<\/p>\n<blockquote>\n<p>This is a package for controlling the Windows Filtering Platform (WFP), also known as the Windows firewall.<\/p>\n<\/blockquote>\n<p>\u0421 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0441\u0432\u0435\u043b\u0430\u0441\u044c \u043a \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432\u0437\u044f\u0442\u043e\u0439 \u0438\u0437 <a href=\"https:\/\/github.com\/tailscale\/wf\/issues\/27\" rel=\"noopener noreferrer nofollow\">issue<\/a> \u0432 Github \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0439:<\/p>\n<pre><code class=\"go\">\/\/ adds firewall rule via WinAPI to bypass confirmation screen func AddAppFirewallRule() error { session, err := wf.New(&amp;wf.Options{ Name:    \"ungoogled session\", Dynamic: false, }) if err != nil { return err } defer session.Close() guid, _ := windows.GenerateGUID() execPath, _ := os.Executable() appID, _ := wf.AppID(execPath) err = session.AddRule(&amp;wf.Rule{ ID:     wf.RuleID(guid), Name:   \"Ungoogled\", Layer:  wf.LayerALEAuthRecvAcceptV4, Weight: 800, Conditions: []*wf.Match{ { Field: wf.FieldALEAppID, Op:    wf.MatchTypeEqual, Value: appID, }, }, Action: wf.ActionPermit, })  if err != nil { return err } return nil }<\/code><\/pre>\n<p>\u041d\u0435\u00a0\u0431\u0443\u0434\u0443 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443\u00a0\u2014 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0443\u0436\u00a0\u0442\u0443\u0442 \u043c\u043d\u043e\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0438 WFP, \u0447\u0438\u0442\u0430\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u0435\u0442\u0435.<\/p>\n<blockquote>\n<p>\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432\u00a0\u0442\u0435\u043c\u0443\u00a0\u2014 \u0432\u0430\u043c \u0432\u00a0\u043f\u043e\u043c\u043e\u0449\u044c <a href=\"https:\/\/tailscale.com\/blog\/windows-firewall\" rel=\"noopener noreferrer nofollow\">\u0432\u043e\u0442 \u0442\u0430\u043a\u0430\u044f<\/a> \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043e\u0442\u00a0\u0430\u0432\u0442\u043e\u0440\u043e\u0432 \u043f\u0430\u043a\u0435\u0442\u0430, \u0433\u0434\u0435 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u043e \u0432\u00a0\u0434\u0435\u0442\u0430\u043b\u044f\u0445 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u0435\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e WFP \u0438\u00a0\u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u00a0\u0435\u0433\u043e\u00a0API.<\/p>\n<\/blockquote>\n<p>\u041d\u043e\u00a0\u0435\u0441\u043b\u0438 \u0432\u00a0\u043a\u0440\u0430\u0442\u0446\u0435\u00a0\u2014 \u0442\u0443\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u00a0\u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0438\u0437\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432\u00a0API.<\/p>\n<h3>Golang \u0438 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430 \u0438\u0437 Go, \u0432\u043e\u0442 \u0432\u0430\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0446\u0438\u0442\u0430\u0442\u0430:<\/p>\n<blockquote>\n<p><a href=\"https:\/\/davidwong.fr\/goasm\/aes\" rel=\"noopener noreferrer nofollow\">This example<\/a> is taken from the <a href=\"https:\/\/golang.org\/pkg\/crypto\/aes\/\" rel=\"noopener noreferrer nofollow\">AES package<\/a> of the standard Go library. It makes use of Go Assembly to leverage Intel\u2019s hardware support for AES, calling the AES-NI CPU instructions that can perform a \u201cround\u201d of encryption or decryption of the AES algorithm.<\/p>\n<\/blockquote>\n<p>\u0414\u0430, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u0438\u00a0\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u043b\u0430\u0431\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435\u00a0\u2014 \u0441\u0440\u0430\u0437\u0443 \u0441\u00a0\u0434\u0430\u043b\u044c\u043d\u0435\u0439 \u043f\u043e\u043b\u043a\u0438 \u0434\u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u044b\u043b\u044c\u043d\u0430\u044f \u043a\u043d\u0438\u0433\u0430 \u043f\u043e\u00a0\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0443. <\/p>\n<p>\u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f \u043d\u0435 \u0431\u044b\u043b\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435\u043c \u0447\u0442\u043e \u044f\u0437\u044b\u043a, \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0432\u043e\u0435\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u043c\u0435\u0432\u0448\u0438\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434 \u0443\u043c\u0435\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435\u043c \u0431\u044b\u043b\u0430 <a href=\"https:\/\/davidwong.fr\/goasm\/add\" rel=\"noopener noreferrer nofollow\">\u043b\u0435\u0433\u043a\u043e\u0441\u0442\u044c \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0430<\/a> \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1be\/577\/f3c\/1be577f3cac8cd517b88a17d1a12b650.png\" alt=\"\u041d\u0435 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u0447\u0435\u043c\u0443 \u043c\u0430\u0441\u043a\u043e\u0442\u044b Go \u0438 Plan 9 \u0442\u0430\u043a \u043f\u043e\u0445\u043e\u0436\u0438?\" title=\"\u041d\u0435 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u0447\u0435\u043c\u0443 \u043c\u0430\u0441\u043a\u043e\u0442\u044b Go \u0438 Plan 9 \u0442\u0430\u043a \u043f\u043e\u0445\u043e\u0436\u0438?\" width=\"800\" height=\"1040\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1be\/577\/f3c\/1be577f3cac8cd517b88a17d1a12b650.png\"\/><\/p>\n<div><figcaption>\u041d\u0435 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u0447\u0435\u043c\u0443 \u043c\u0430\u0441\u043a\u043e\u0442\u044b Go \u0438 Plan 9 \u0442\u0430\u043a \u043f\u043e\u0445\u043e\u0436\u0438?<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0449\u0435 \u043e\u0434\u043d\u0438\u043c \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0442\u043e\u0440\u0447\u0430\u0449\u0438\u0435 \u0443\u0448\u0438 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Plan_9_from_Bell_Labs\" rel=\"noopener noreferrer nofollow\">Plan 9<\/a>:<\/p>\n<blockquote>\n<p>The assembler is based on the input style of the Plan 9 assemblers, which is documented in detail <a href=\"https:\/\/9p.io\/sys\/doc\/asm.html\" rel=\"noopener noreferrer nofollow\">elsewhere<\/a>. If you plan to write assembly language, you should read that document although much of it is Plan 9-specific<\/p>\n<\/blockquote>\n<p>\u0410\u00a0\u0440\u0430\u0437\u0433\u0430\u0434\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u00a0\u2014 \u043e\u0434\u0438\u043d \u0438\u0437\u00a0\u0430\u0432\u0442\u043e\u0440\u043e\u0432 Go \u043a\u043e\u0433\u0434\u0430\u2011\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043d\u0430\u0434 Plan 9: <\/p>\n<blockquote>\n<p><strong>Robert Pike<\/strong>\u00a0(born 1956) is a Canadian\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Programmer\" rel=\"noopener noreferrer nofollow\">programmer<\/a>\u00a0and\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Author\" rel=\"noopener noreferrer nofollow\">author<\/a>. He is best known for his work on the\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Go_(programming_language)\" rel=\"noopener noreferrer nofollow\">Go programming language<\/a>\u00a0while working at\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Google\" rel=\"noopener noreferrer nofollow\">Google<\/a><a href=\"https:\/\/en.wikipedia.org\/wiki\/Rob_Pike#cite_note-Inform-1\" rel=\"noopener noreferrer nofollow\"><sup>[1]<\/sup><\/a><a href=\"https:\/\/en.wikipedia.org\/wiki\/Rob_Pike#cite_note-2\" rel=\"noopener noreferrer nofollow\"><sup>[2]<\/sup><\/a>\u00a0and the\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Plan_9_(operating_system)\" rel=\"noopener noreferrer nofollow\">Plan 9 operating system<\/a>\u00a0while working at\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Bell_Labs\" rel=\"noopener noreferrer nofollow\">Bell Labs<\/a>, where he was a member of the\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Unix\" rel=\"noopener noreferrer nofollow\">Unix<\/a>\u00a0team.<a href=\"https:\/\/en.wikipedia.org\/wiki\/Rob_Pike#cite_note-Inform-1\" rel=\"noopener noreferrer nofollow\"><sup>[1]<\/sup><\/a><\/p>\n<\/blockquote>\n<p>\u041d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0442\u0435\u043c\u0443 \u0441 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c.<\/p>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435\u043c \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0438 \u043b\u0438\u043d\u043a\u043e\u0432\u043a\u043e\u0439 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0445 \u0432\u0441\u0442\u0430\u0432\u043e\u043a \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a <a href=\"https:\/\/github.com\/mmcloughlin\/avo\" rel=\"noopener noreferrer nofollow\">Avo<\/a>: <\/p>\n<blockquote>\n<p><code>avo<\/code> makes high-performance Go assembly easier to write, review and maintain. <\/p>\n<\/blockquote>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435 \u0447\u0442\u043e \u043e\u043d \u0434\u0430\u0435\u0442:<\/p>\n<ul>\n<li>\n<p><strong>Use Go control structures<\/strong> for assembly generation; <code>avo<\/code> programs <em>are<\/em> Go programs<\/p>\n<\/li>\n<\/ul>\n<p>\u0418 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u0432\u0443\u0447\u0438\u0442:<\/p>\n<pre><code class=\"go\">\/\/go:build ignore  package main  import . \"github.com\/mmcloughlin\/avo\/build\"  func main() { TEXT(\"Add\", NOSPLIT, \"func(x, y uint64) uint64\") Doc(\"Add adds x and y.\") x := Load(Param(\"x\"), GP64()) y := Load(Param(\"y\"), GP64()) ADDQ(x, y) Store(y, ReturnIndex(0)) RET() Generate() }<\/code><\/pre>\n<p>\u042d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430 Go, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 <strong>\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442<\/strong> \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 \u0444\u0430\u0439\u043b\u0435 asm\/add.s:<\/p>\n<pre><code class=\"assembly\">\/\/ Code generated by command: go run asm.go -out asmtest\/add.s -stubs asmtest\/stub.go. DO NOT EDIT.  #include \"textflag.h\"  \/\/ func Add(x uint64, y uint64) uint64 TEXT \u00b7Add(SB), NOSPLIT, $0-24 MOVQ x+0(FP), AX MOVQ y+8(FP), CX ADDQ AX, CX MOVQ CX, ret+16(FP) RET<\/code><\/pre>\n<p>\u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043d\u0430 Go \u0432 \u0444\u0430\u0439\u043b\u0435 <em>stub.go<\/em>:<\/p>\n<pre><code class=\"go\">\/\/ Code generated by command: go run asm.go -out asmtest\/add.s -stubs asmtest\/stub.go. DO NOT EDIT. package ungoogled \/\/ Add adds x and y. func Add(x uint64, y uint64) uint64<\/code><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043b\u0438\u043d\u043a\u0443\u044e\u0442\u0441\u044f \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u0430 \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 \u0441 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u0439 \u0432\u0441\u0442\u0430\u0432\u043a\u043e\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"go\">\/\/ a test API method to call function with Assembler inside func TestAsmMethod(w http.ResponseWriter, req *http.Request) {  query := req.URL.Query() fmt.Println(\"GET params were:\", query)  param1, param2 := query.Get(\"param1\"), query.Get(\"param2\")  int1, _ := strconv.ParseUint(param1, 10, 64) int2, _ := strconv.ParseUint(param2, 10, 64) fmt.Fprintf(w, \"int1: %v int2: %v \\n\", int1, int2)  \/\/ yep, check stub.go in asmtest out := ungoogled.Add(int1, int2)  fmt.Fprintf(w, \"result: %v \\n\", out) logMessage( fmt.Sprintf(\"Called asm method with params: %v , %v and result: %v\",  int1, int2, out)) }<\/code><\/pre>\n<p>\u041b\u0435\u043f\u043e\u0442\u0430 \u0438 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0442\u044c,  \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2de\/540\/966\/2de54096680a735e6cb3035c9984f6e2.png\" alt=\"\u0422\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043c\u0435\u043d\u0430 \u043e\u0431\u043e\u0435\u0432 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438\" title=\"\u0422\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043c\u0435\u043d\u0430 \u043e\u0431\u043e\u0435\u0432 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438\" width=\"1473\" height=\"670\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2de\/540\/966\/2de54096680a735e6cb3035c9984f6e2.png\"\/><\/p>\n<div><figcaption>\u0422\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043c\u0435\u043d\u0430 \u043e\u0431\u043e\u0435\u0432 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438<\/figcaption><\/div>\n<\/figure>\n<h3>\u0421\u043c\u0435\u043d\u0430 \u043e\u0431\u043e\u0435\u0432 \u0447\u0435\u0440\u0435\u0437 WinAPI \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0444\u0430\u0439\u043b\u043e\u0432<\/h3>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u043a \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0443 \u043f\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 \u0431\u044b\u043b \u043f\u0440\u0438\u0434\u0435\u043b\u0430\u043d \u0432\u044b\u0437\u043e\u0432 WinAPI \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0441\u043c\u0435\u043d\u044b \u043e\u0431\u043e\u0435\u0432 \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u0441\u0442\u043e\u043b\u0435.<\/p>\n<p>\u0421\u0430\u043c\u0430 \u0444\u043e\u0440\u043c\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e:<\/p>\n<pre><code class=\"xml\">&lt;!DOCTYPE html&gt; &lt;html lang=\"en\"&gt;   &lt;head&gt;     &lt;meta charset=\"UTF-8\" \/&gt;     &lt;meta name=\"viewport\"         content=\"width=device-width, initial-scale=1.0\" \/&gt;     &lt;meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\" \/&gt;     &lt;title&gt;Upload an image&lt;\/title&gt;   &lt;\/head&gt;   &lt;body&gt;     &lt;form       enctype=\"multipart\/form-data\"       action=\"\/upload\"       method=\"post\"&gt;       &lt;input type=\"file\" name=\"imageFile\" accept=\"image\/*\" \/&gt;       &lt;input type=\"submit\" value=\"upload\" \/&gt;     &lt;\/form&gt;   &lt;\/body&gt; &lt;\/html&gt;<\/code><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u043e\u043d\u0430 \u0437\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/pkg.go.dev\/embed\" rel=\"noopener noreferrer nofollow\">go:embed<\/a>:<\/p>\n<pre><code class=\"go\">\/\/go:embed upload.html var uploadTemplate string<\/code><\/pre>\n<p>\u0422.\u0435. \u0432\u043e\u00a0\u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <em>uploadTemplate<\/em> \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c HTML-\u0448\u0430\u0431\u043b\u043e\u043d \u0432\u044b\u0448\u0435 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438\u00a0\u2014 \u0437\u0430\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043e\u00a0\u0432\u0440\u0435\u043c\u044f \u0441\u0431\u043e\u0440\u043a\u0438.<\/p>\n<p>\u0417\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f: <\/p>\n<pre><code class=\"go\">func uploadFile(w http.ResponseWriter, r *http.Request) { .. }<\/code><\/pre>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0441\u043a\u0443\u0447\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0440\u0430\u0437\u0431\u043e\u0440\u043a\u0438 multipart-\u0444\u043e\u0440\u043c\u044b \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 &#8212; \u0435\u0435 \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c, \u0437\u0430\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043a\u043e\u0435-\u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435:<\/p>\n<pre><code class=\"go\">\/\/ build full path to image imagePath, err := windows.UTF16PtrFromString(dst.Name())<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 UTF-16 \u0441\u0442\u0440\u043e\u043a\u0443, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u044e\u0449\u0443\u044e \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043a \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u044d\u0442\u0430 \u0441\u0441\u044b\u043b\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 API:<\/p>\n<pre><code class=\"go\">\/\/ call WinAPI  to change wallpaper to just uploaded image _, _, err = procSystemParamInfo.Call(20, 0,               uintptr(unsafe.Pointer(imagePath)), 0x001A) \/\/ check for errors, respond 500 if any if err, ok := err.(syscall.Errno); ok { if err != 0 { fmt.Println(\"Error :\") fmt.Println(err) http.Error(w, err.Error(), http.StatusInternalServerError) return } }<\/code><\/pre>\n<p>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/api\/winuser\/nf-winuser-systemparametersinfow\" rel=\"noopener noreferrer nofollow\">SystemParametersInfoW<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439:<\/p>\n<blockquote>\n<p>Retrieves or sets the value of one of the system-wide parameters. This function can also update the user profile while setting a parameter.<\/p>\n<\/blockquote>\n<p>\u041d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0434\u043b\u044f \u0441\u043c\u0435\u043d\u044b \u043e\u0431\u043e\u0435\u0432 actionName \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f SPI_SETDESKWALLPAPER \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435.<\/p>\n<h3>\u042d\u043f\u0438\u043b\u043e\u0433<\/h3>\n<p>\u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f \u044f \u0442\u0430\u043a\u043e\u0439 \u043d\u0435 \u043e\u0434\u0438\u043d \u0438 \u0443\u0436\u0435 <a href=\"https:\/\/justen.codes\/breaking-all-the-rules-using-go-to-call-windows-api-2cbfd8c79724\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e<\/a> <a href=\"https:\/\/www.scriptchildie.com\/malware-development-in-golang-introduction\/golang-programming-intro\/3.-calling-messagebox-winapi-from-go\" rel=\"noopener noreferrer nofollow\">\u043c\u043d\u043e\u0433\u043e<\/a> <a href=\"https:\/\/www.thesubtlety.com\/post\/getting-started-golang-windows-apis\/\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432<\/a> \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u0438\u0440\u0443 \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 Go \u0438 WinAPI.<\/p>\n<blockquote>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c \u0432\u043e\u0441\u0442\u043e\u0440\u0433\u043e\u0432 \u0438\u00a0\u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430\u00a0\u043b\u044e\u0431\u0438\u043c\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u043c \u0443\u0433\u043b\u043e\u043c<\/p>\n<\/blockquote>\n<p>\u041f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f!<\/p>\n<p>\u042d\u0442\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u0446\u0435\u0437\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043c\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, <a href=\"https:\/\/blog.0x08.ru\/golang-winapi-asm\" rel=\"noopener noreferrer nofollow\">\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b<\/a>\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432\u00a0\u043d\u0430\u0448\u0435\u043c \u0431\u043b\u043e\u0433\u0435.<\/p>\n<h4>0x08 Software<\/h4>\n<p>\u041c\u044b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0432\u0435\u0442\u0435\u0440\u0430\u043d\u043e\u0432 \u0418\u0422\u2011\u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0438 \u0434\u043e\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0430\u043c\u043e\u0435 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435, \u043d\u0430\u0448 \u0441\u043e\u0444\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0431\u0438\u0437\u043d\u0435\u0441\u2011\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u043d\u0430\u00a0\u0442\u0440\u0435\u0445 \u043a\u043e\u043d\u0442\u0438\u043d\u0435\u043d\u0442\u0430\u0445, \u0432\u00a0\u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u0442\u0440\u0430\u0441\u043b\u044f\u0445 \u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445.<\/p>\n<p>\u041e\u0436\u0438\u0432\u043b\u044f\u0435\u043c\u00a0<a href=\"https:\/\/blog.0x08.ru\/xerox-alto-bcpl-hello-world\" rel=\"noopener noreferrer nofollow\">\u0434\u0430\u0432\u043d\u043e \u0443\u043c\u0435\u0440\u0448\u0435\u0435<\/a>,\u00a0<a href=\"https:\/\/blog.0x08.ru\/running-from-websphere-esb\" rel=\"noopener noreferrer nofollow\">\u0447\u0438\u043d\u0438\u043c \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u00a0\u0440\u0430\u0431\u043e\u0442\u0430\u0432\u0448\u0435\u0435<\/a>\u00a0\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c\u00a0<a href=\"https:\/\/blog.0x08.ru\/call-webservice-from-dos\" rel=\"noopener noreferrer nofollow\">\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435<\/a>\u00a0\u2014 \u0437\u0430\u0442\u0435\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u0431\u00a0\u044d\u0442\u043e\u043c \u0432\u00a0\u0441\u0432\u043e\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/837454\/\"> https:\/\/habr.com\/ru\/articles\/837454\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0427\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432\u00a0\u0433\u043e\u043b\u043e\u0432\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043f\u0440\u0438\u00a0\u0441\u043b\u043e\u0432\u0435 \u00abGo\u00bb? Google \u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b? \u042f \u0442\u043e\u0436\u0435 \u0442\u0430\u043a \u0434\u0443\u043c\u0430\u043b, \u043d\u043e\u00a0\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0439.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Gopher\u00a0\u2014 \u043c\u0430\u0441\u043a\u043e\u0442 Golang \u043d\u0430\u00a0\u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043d\u0435\u00a0\u0431\u043e\u0431\u0435\u0440 \u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%93%D0%BE%D1%84%D0%B5%D1%80%D0%BE%D0%B2%D1%8B%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0446\u0435\u043b\u044b\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0438\u0434<\/a>, \u0443\u00a0\u043d\u0430\u0441 \u0442\u0430\u043a\u0438\u0435 \u043d\u0435\u00a0\u0436\u0438\u0432\u0443\u0442.<\/figcaption><\/div>\n<\/figure>\n<h3>\u0412\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u0439 \u043c\u0438\u0440 Windows<\/h3>\n<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0440\u043e\u0434\u0438\u043b\u0430\u0441\u044c <strong>\u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e<\/strong>\u00a0\u2014 \u0438\u0437 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043f\u043e\u0440\u0430 \u043e\u00a0\u0440\u0435\u0430\u043b\u0438\u044f\u0445 \u0438\u00a0\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445 \u044f\u0437\u044b\u043a\u0430 <a href=\"https:\/\/go.dev\/\" rel=\"noopener noreferrer nofollow\">Go<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u0437\u0430\u00a0\u0440\u0430\u043c\u043a\u0438 \u0435\u0433\u043e \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0444\u0435\u0440\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Go\" rel=\"noopener noreferrer nofollow\">\u043c\u0430\u0442\u0447\u0430\u0441\u0442\u0438<\/a> \u0434\u043b\u044f \u0442\u0435\u0445 \u043a\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c \u044f\u0437\u044b\u043a\u0435:<\/p>\n<blockquote>\n<p><strong>Go<\/strong> (\u0447\u0430\u0441\u0442\u043e \u0442\u0430\u043a\u0436\u0435 <strong>golang<\/strong>) \u2014 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D1%8B%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0439<\/a> <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B\" rel=\"noopener noreferrer nofollow\">\u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439<\/a> <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%AF%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">\u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a>, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Google_(%D0%BA%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D1%8F)\" rel=\"noopener noreferrer nofollow\">Google<\/a><a href=\"https:\/\/ru.wikipedia.org\/wiki\/Go#cite_note-11\" rel=\"noopener noreferrer nofollow\">[11]<\/a>. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 Go \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u0435 2007 \u0433\u043e\u0434\u0430, \u0435\u0433\u043e \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u044c <a href=\"https:\/\/ru.wikipedia.org\/w\/index.php?title=%D0%93%D1%80%D0%B8%D0%B7%D0%BC%D0%B5%D1%80,_%D0%A0%D0%BE%D0%B1%D0%B5%D1%80%D1%82&amp;action=edit&amp;redlink=1\" rel=\"noopener noreferrer nofollow\">\u0420\u043e\u0431\u0435\u0440\u0442 \u0413\u0440\u0438\u0437\u043c\u0435\u0440<\/a>, <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%B0%D0%B9%D0%BA,_%D0%A0%D0%BE%D0%B1\" rel=\"noopener noreferrer nofollow\">\u0420\u043e\u0431 \u041f\u0430\u0439\u043a<\/a> \u0438 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A2%D0%BE%D0%BC%D0%BF%D1%81%D0%BE%D0%BD,_%D0%9A%D0%B5%D0%BD\" rel=\"noopener noreferrer nofollow\">\u041a\u0435\u043d \u0422\u043e\u043c\u043f\u0441\u043e\u043d<\/a><a href=\"https:\/\/ru.wikipedia.org\/wiki\/Go#cite_note-langfaq-12\" rel=\"noopener noreferrer nofollow\">[12]<\/a>, \u0437\u0430\u043d\u0438\u043c\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Inferno_(%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0)\" rel=\"noopener noreferrer nofollow\">Inferno<\/a>. \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u044f\u0437\u044b\u043a \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u043d\u043e\u044f\u0431\u0440\u0435 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/2009_%D0%B3%D0%BE%D0%B4\" rel=\"noopener noreferrer nofollow\">2009 \u0433\u043e\u0434\u0430<\/a>.<\/p>\n<\/blockquote>\n<p>\u042f\u00a0\u043a\u0430\u043a \u0438\u00a0\u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u0447\u0438\u0442\u0430\u043b Golang \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043d\u043e\u0432\u043e\u043c\u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0438\u0433\u0440\u0443\u0448\u043a\u043e\u0439, \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0430\u0434\u0438\u0442\u044c \u0448\u0438\u0440\u043e\u043a\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043a\u0438\u0435 \u043c\u0430\u0441\u0441\u044b \u043d\u0430\u00a0\u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0443\u044e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044e \u00ab\u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u0431\u0440\u0430\u00bb\u00a0\u2014 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0441\u044f \u044d\u0442\u043e\u0442 \u044f\u0437\u044b\u043a \u0432\u043d\u0443\u0442\u0440\u0438 \u0413\u0443\u0433\u043b\u0430 \u0438 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447 \u0413\u0443\u0433\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u043e\u0431\u044b\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u0433\u0434\u0430 \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0443 Golang \u0441\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/apps\/\" rel=\"noopener noreferrer nofollow\">WinAPI<\/a> \u00ab\u0438\u0437\u00a0\u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb \u044f\u00a0\u0431\u044b\u043b \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u00a0\u2014  \u0432\u00a0\u0431\u043e\u043b\u0435\u0435 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u0432\u0440\u043e\u0434\u0435 C\/C++ \u0440\u0430\u0431\u043e\u0442\u0430 c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438 Windows \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u043a\u0443\u0434\u0430 \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u043d\u0441\u0442\u0440\u0443\u043e\u0437\u043d\u043e\u0439. \u0422\u0430\u043a \u0438 \u0440\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u044d\u0442\u0430 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f. <\/p>\n<p>\u0427\u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0442\u0432\u043e\u0440\u0438\u0442\u044c:<\/p>\n<blockquote>\n<p>Desktop-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c, \u0441\u00a0\u0443\u0447\u0435\u0442\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0439 Windows, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u0431\u0441\u0435\u0440\u0432\u0435\u0440, \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c REST API \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435.<\/p>\n<\/blockquote>\n<p>\u0415\u0449\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0438\u00a0\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0435\u0433\u043e \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0431\u043e\u0435\u0432\u00a0\u2014 \u0447\u0435\u0440\u0435\u0437 WinAPI. <\/p>\n<p>\u041f\u043b\u044e\u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u0445\u043e\u0434 \u0444\u0430\u0439\u0440\u0432\u043e\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0441\u044f \u0432\u043e\u0442 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437\u0434\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0439 \u044d\u043a\u0440\u0430\u043d \u0441 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\u043c:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041e\u043d\u00a0\u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u0435\u043d\u044f \u0431\u0435\u0441\u0438\u043b, \u0430\u00a0\u0442\u043e\u00a0\u0447\u0442\u043e \u043c\u0435\u043d\u044f \u0431\u0435\u0441\u0438\u0442\u00a0\u2014 \u044f\u00a0<s>\u043e\u0442\u0440\u044b\u0432\u0430\u044e<\/s> \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u044e.<\/figcaption><\/div>\n<\/figure>\n<blockquote>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0443\u0434\u0438\u0432\u0438\u0442 \u0434\u0430\u0436\u0435 \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043d\u0430 Golang.<\/p>\n<\/blockquote>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043e\u0442:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430\u00a0\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u00ab\u0437\u0430\u043a\u0440\u044b\u0442\u044c\u00bb \u0438 \u00ab\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c\u00bb\u00a0\u2014 \u0434\u0430\u0436\u0435 \u044d\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u00a0\u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c WinAPI<\/figcaption><\/div>\n<\/figure>\n<p>\u0410 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Taskbar\" rel=\"noopener noreferrer nofollow\">\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0442\u0440\u0435\u0435\u043c<\/a>:<\/p>\n<figure class=\"\">\n<div><figcaption>\u041f\u043e \u043a\u043b\u0438\u043a\u0443 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0444\u043e\u043a\u0443\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0449\u0435 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0438\u0430\u043b\u043e\u0433:<\/p>\n<figure class=\"\">\n<div><figcaption>\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u0430, \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c.<\/figcaption><\/div>\n<\/figure>\n<p>\u0418 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440, \u0441 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0415\u0441\u043b\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u0442\u043e \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0447\u0442\u043e \u0442\u0443\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u0438 \u0432\u0441\u0435 \u043e\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0438\u0436\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435.<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0443 \u0438 \u043f\u043e \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u0438 \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0432\u044b\u043b\u043e\u0436\u0435\u043d \u043d\u0430 <a href=\"https:\/\/github.com\/alex0x08\/golang-winapi-asm\" rel=\"noopener noreferrer nofollow\">Github<\/a>. <\/p>\n<h3>\u0421\u0431\u043e\u0440\u043a\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a<\/h3>\n<p>\u041d\u0430\u0447\u043d\u0443 \u0441\u00a0\u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e\u00a0\u2014 \u043a\u0430\u043a \u0432\u0441\u044e \u044d\u0442\u0443 \u0440\u0430\u0434\u043e\u0441\u0442\u044c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u00a0\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c.<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f \u043d\u0430\u0434\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Go:<\/p>\n<blockquote>\n<p>\u0414\u043b\u044f Windows \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 Golang, \u0434\u0430\u0436\u0435 \u0441 \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0442\u043e\u0440\u043e\u043c. <\/p>\n<\/blockquote>\n<p>\u0412\u0437\u044f\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430 Golang, \u0432\u043e\u0442 <a href=\"https:\/\/go.dev\/doc\/install\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>.<\/p>\n<p>\u042f\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043d\u0430\u00a0\u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u0435\u0440\u0441\u0438\u044e <strong>1.22.5<\/strong>, \u043d\u043e\u00a0\u044f\u0437\u044b\u043a \u0441\u0442\u043e\u043b\u044c \u0431\u0443\u0440\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0435\u00a0\u0443\u0434\u0438\u0432\u043b\u044e\u0441\u044c \u0435\u0441\u043b\u0438 \u0432\u044b\u0439\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0435\u0449\u0435 \u0434\u043e\u00a0\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u0430 \u0432 <a href=\"https:\/\/code.visualstudio.com\/\" rel=\"noopener noreferrer nofollow\">Visual Studio Code<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0430\u0432\u043d\u043e \u0438 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e <a href=\"https:\/\/code.visualstudio.com\/docs\/languages\/go\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Go<\/a>:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 Visual Studio Code \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c \u0434\u043b\u044f Golang<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435:<\/p>\n<blockquote>\n<p>\u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0435\u00a0\u043e\u0431\u044b\u0447\u043d\u044b\u0435 Makefile \u0438\u00a0\u043d\u0435\u00a0\u0448\u0435\u043b\u043b-\u0441\u043a\u0440\u0438\u043f\u0442\u044b\u00a0\u2014 \u0442\u0430\u043a \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0430\u00a0\u00ab\u0433\u043e\u0448\u0435\u0447\u043a\u0435\u00bb, \u0430\u00a0\u0446\u0435\u043b\u0430\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0432\u043d\u0435\u0448\u043d\u044f\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0431\u043e\u0440\u043a\u0438\u00a0\u2014 <a href=\"https:\/\/magefile.org\/\" rel=\"noopener noreferrer nofollow\">Magefile<\/a>.<\/p>\n<\/blockquote>\n<p>\u0421\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u043e\u043d\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432, \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439:<\/p>\n<pre><code class=\"powershell\">git clone https:\/\/github.com\/magefile\/mage cd mage go run bootstrap.go<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a <strong>mage<\/strong>, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u0441\u0431\u043e\u0440\u043a\u0443:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Mage \u044d\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 <strong>mage.exe<\/strong> (\u0432 Windows \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f)<\/figcaption><\/div>\n<\/figure>\n<p>\u0417\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<pre><code class=\"powershell\">git clone https:\/\/github.com\/alex0x08\/golang-winapi-asm.git<\/code><\/pre>\n<p>\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"powershell\">mage install<\/code><\/pre>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c:<\/p>\n<pre><code class=\"powershell\">mage build<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0448\u043b\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u0432\u00a0\u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u0431\u0443\u0434\u0435\u0442 \u0444\u0430\u0439\u043b <strong>ungoogled-go.exe<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u0438\u00a0\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0430\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u0445\u00a0\u2014 \u043e\u043d\u00a0\u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0439 \u0438\u00a0\u043d\u0435\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442\u00a0\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e Golang. <\/p>\n<p>\u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c:<\/p>\n<pre><code class=\"powershell\">mage generate<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 <em>add.s<\/em> \u0438\u00a0<em>stub.go<\/em>\u00a0\u2014 \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u0430 \u043d\u0430\u00a0\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435.<\/p>\n<p>\u0421\u0442\u043e\u0438\u0442 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0438 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f, \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0443\u0442\u0435\u043c \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430:<\/p>\n<pre><code class=\"powershell\">-X main.DebugMode=false<\/code><\/pre>\n<p>\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\u00a0\u2014 \u0444\u043b\u0430\u0433\u043e\u043c \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043e\u043d\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u044b\u0439 \u0444\u0430\u043a\u0442 \u2116 5668 : \u043d\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 Windows-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0437\u043d\u0430\u0435\u0442 \u043a\u0430\u043a \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0438\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438.<\/figcaption><\/div>\n<\/figure>\n<h3>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Windows<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u00a0\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u00a0Windows \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u00abHello world\u00bb \u043d\u0430\u00a0C:<\/p>\n<pre><code class=\"cpp\">#include &lt;stdio.h&gt; int main() {    printf(\"Hello, World!\");    return 0; }<\/code><\/pre>\n<p>\u0442\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f <s>\u0441\u0442\u0440\u0430\u0448\u043d\u0430\u044f<\/s> \u0447\u0435\u0440\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043a\u0430\u043a \u043d\u0430 \u0441\u043d\u0438\u043c\u043a\u0435 \u0432\u044b\u0448\u0435. <\/p>\n<p>\u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 Windows \u0434\u043b\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/learnwin32\/winmain--the-application-entry-point\" rel=\"noopener noreferrer nofollow\">\u0434\u0440\u0443\u0433\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430<\/a> (entry point):<\/p>\n<blockquote>\n<p>Every Windows program includes an entry-point function named either <strong>WinMain<\/strong> or <strong>wWinMain<\/strong>.<\/p>\n<\/blockquote>\n<p>\u0418\u00a0\u0435\u0441\u043b\u0438 \u0443\u0436\u00a0\u0436\u0438\u0437\u043d\u044c \u0432\u0430\u0441 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u00a0Golang \u043f\u043e\u0434 Windows, \u0435\u0449\u0435 \u0438\u00a0\u0441\u00a0\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c, \u0442\u043e\u00a0\u0441\u0442\u043e\u0438\u0442 \u00ab\u0433\u043e\u0448\u0435\u0447\u043a\u0435\u00bb \u043e\u0431\u00a0\u044d\u0442\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0444\u043b\u0430\u0433:<\/p>\n<pre><code class=\"powershell\">-H windowsgui<\/code><\/pre>\n<p>\u0432\u00a0\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b ldflags.<\/p>\n<p>\u0426\u0435\u043b\u0438\u043a\u043e\u043c \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"powershell\">go build -ldflags \"-H windowsgui\"<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e, \u044f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u0440\u0435\u0436\u0438\u043c \u0441\u0431\u043e\u0440\u043a\u0438 <em>exe<\/em>:<\/p>\n<pre><code class=\"powershell\">-buildmode=exe Build the listed main packages and everything they import into executables. Packages not named main are ignored.<\/code><\/pre>\n<p>\u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432 \u0438\u0442\u043e\u0433\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u0434\u0438\u043d \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0439 <strong>exe<\/strong> \u0444\u0430\u0439\u043b.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u00ab\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 Hello World\u00bb \u043d\u0430\u00a0C++ \u0438 WinAPI<\/figcaption><\/div>\n<\/figure>\n<h3>Golang \u0438 WinAPI<\/h3>\n<p>\u0421\u0442\u043e\u0438\u0442 \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u044f\u0441\u043d\u0438\u0442\u044c \u0434\u043b\u044f \u043d\u0435\u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u044b\u0445\u00a0\u2014 \u0432\u00a0\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0WinAPI.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u043e\u0437\u044c\u043c\u0435\u043c <a href=\"https:\/\/github.com\/microsoft\/Windows-classic-samples\/blob\/main\/Samples\/Win7Samples\/begin\/LearnWin32\/HelloWorld\/cpp\/main.cpp\" rel=\"noopener noreferrer nofollow\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u00abHello world\u00bb<\/a> \u043d\u0430\u00a0C++ \u043f\u043e\u0434 Windows:<\/p>\n<pre><code class=\"cpp\">#ifndef UNICODE #define UNICODE #endif   #include &lt;windows.h&gt;  LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg,                                 WPARAM wParam,                                 LPARAM lParam);  int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE,                                 PWSTR pCmdLine, int nCmdShow) {     \/\/ Register the window class.     const wchar_t CLASS_NAME[]  = L\"Sample Window Class\";          WNDCLASS wc = { };      wc.lpfnWndProc   = WindowProc;     wc.hInstance     = hInstance;     wc.lpszClassName = CLASS_NAME;      RegisterClass(&amp;wc);      \/\/ Create the window.     HWND hwnd = CreateWindowEx(         0,                              \/\/ Optional window styles.         CLASS_NAME,                     \/\/ Window class         L\"Learn to Program Windows\",    \/\/ Window text         WS_OVERLAPPEDWINDOW,            \/\/ Window style          \/\/ Size and position         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,          NULL,       \/\/ Parent window             NULL,       \/\/ Menu         hInstance,  \/\/ Instance handle         NULL        \/\/ Additional application data         );      if (hwnd == NULL)     {         return 0;     }      ShowWindow(hwnd, nCmdShow);      \/\/ Run the message loop.     MSG msg = { };     while (GetMessage(&amp;msg, NULL, 0, 0))     {         TranslateMessage(&amp;msg);         DispatchMessage(&amp;msg);     }     return 0; }  LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg,                              WPARAM wParam, LPARAM lParam) {     switch (uMsg)     {     case WM_DESTROY:         PostQuitMessage(0);         return 0;     case WM_PAINT:         {             PAINTSTRUCT ps;             HDC hdc = BeginPaint(hwnd, &amp;ps);             \/\/ All painting occurs here, between BeginPaint and EndPaint.             FillRect(hdc, &amp;ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));             EndPaint(hwnd, &amp;ps);         }         return 0;     }     return DefWindowProc(hwnd, uMsg, wParam, lParam); }<\/code><\/pre>\n<p>\u041d\u0443 \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0433\u043e?<\/p>\n<p>\u0410 \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e 90% \u043a\u043e\u0434\u0430 \u0434\u0430\u0436\u0435 \u0432 \u0441\u0442\u043e\u043b\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 <em>\u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043a C++<\/em>, \u0430 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438, \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438 \u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0441\u0430\u043c\u043e\u0433\u043e WinAPI. <\/p>\n<blockquote>\n<p>\u041e\u0442\u00a0C++ \u0442\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b (int) \u0438\u00a0\u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 (case, while).<\/p>\n<\/blockquote>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u0434\u0430\u0447\u0430 \u043a\u0430\u043a-\u0442\u043e \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u00a0WinAPI (\u0434\u0430\u043b\u044c\u0448\u0435 \u0447\u0435\u043c \u0440\u0430\u0437\u043e\u0432\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438)\u00a0\u2014 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u043b\u0430, \u0435\u0441\u0442\u044c \u0438\u00a0\u0431\u0443\u0434\u0435\u0442 <strong>\u0441\u043b\u043e\u0436\u043d\u043e\u0439<\/strong>.<\/p>\n<p>\u0410\u00a0\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u043e\u0434 Windows \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u043e\u0439, \u0447\u0435\u043c\u043f\u0438\u043e\u043d\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u043d\u0435\u00a0\u0437\u043d\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 C\/C++ \u0432\u043e\u043e\u0431\u0449\u0435 \u0438\u00a0\u0432\u0441\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 (\u0434\u0430\u0436\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0443\u044e) \u0432\u0435\u0441\u0442\u0438 \u043d\u0430\u00a0\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0445 WinAPI.<\/p>\n<p>\u041d\u043e\u00a0\u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a\u00a0\u043d\u0430\u0448\u0435\u0439 \u00ab\u0433\u043e\u0448\u0435\u0447\u043a\u0435\u00bb.<\/p>\n<p>Go \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435\u00a0C++ \u0438\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u044d\u043a\u0437\u043e\u0442\u0438\u043a\u043e\u0439 \u0432\u00a0\u043c\u0438\u0440\u0435 Windows-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u043a\u0430\u043c\u043f\u0443\u0441\u043e\u0432 Google.<\/p>\n<blockquote>\n<p>\u041d\u043e \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 WinAPI \u0432 \u043d\u0435\u043c \u043e\u0447\u0435\u043d\u044c \u0434\u0430\u0436\u0435 \u043d\u0435\u043f\u043b\u043e\u0445\u0430.<\/p>\n<\/blockquote>\n<p>\u0412\u0437\u0433\u043b\u044f\u043d\u0438\u0442\u0435 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u044b\u0437\u043e\u0432 WinAPI \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043e\u0431\u043e\u0435\u0432 \u043d\u0430 Golang:<\/p>\n<pre><code class=\"go\">var (     user32DLL= windows.NewLazyDLL(\"user32.dll\")     procSystemParamInfo= user32DLL.NewProc(\"SystemParametersInfoW\") ) func main()  { imagePath, _ := windows.UTF16PtrFromString(`image.jpg`) fmt.Println(\"[+] Changing background now...\") procSystemParamInfo.Call(20, 0, uintptr(unsafe.                        Pointer(imagePath)), 0x001A) }<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0442\u0430\u043a \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0441\u043a\u0440\u044b\u0442\u044b \u0432\u0441\u0435 \u0441\u043a\u043e\u043b\u044c\u0437\u043a\u0438\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0432\u0440\u043e\u0434\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u043f\u0430\u043c\u044f\u0442\u0438, \u0433\u0434\u0435 \u043b\u0435\u0436\u0438\u0442 \u043f\u0443\u0442\u044c \u0434\u043e \u0444\u0430\u0439\u043b\u0430 \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439:<\/p>\n<pre><code class=\"go\">unsafe.Pointer(imagePath)<\/code><\/pre>\n<p>\u0438\u043b\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0441 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430\u043c\u0438:<\/p>\n<pre><code class=\"go\"> windows.UTF16PtrFromString(`image.jpg`)<\/code><\/pre>\n<p>..\u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0438\u0432\u0443 \u0434\u0430\u0435\u0448\u044c\u0441\u044f.<\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0430  \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<figure class=\"full-width\"><\/figure>\n<blockquote>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0443 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u043a\u043e\u0434, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 <a href=\"https:\/\/anubissec.github.io\/How-To-Call-Windows-APIs-In-Golang\/#\" rel=\"noopener noreferrer nofollow\">\u0432\u043e\u0442 \u0442\u0443\u0442<\/a> \u043b\u0435\u0436\u0438\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0441\u0435 \u0443\u0436\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u043e.<\/p>\n<\/blockquote>\n<p>\u0421\u043a\u0430\u0436\u0443 \u043b\u0438\u0448\u044c \u0447\u0442\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u0442\u043e\u043b\u044c \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 WinAPI, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043d\u0435 <s>\u0443\u0442\u043e\u043f\u0438\u0442\u044c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f<\/s> \u0443\u0442\u043e\u043d\u0443\u0442\u044c \u0432 \u0434\u0435\u0442\u0430\u043b\u044f\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0417\u0430\u043f\u0443\u0441\u043a \u0434\u0435\u043c\u043e \u0441 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u043c \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c WinAPI<\/figcaption><\/div>\n<\/figure>\n<h3>WinAPI \u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/h3>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u0447\u0435\u0441\u0442\u043d\u043e \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c <strong>\u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u044e<\/strong> \u043b\u043e\u0433\u0438\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 WinAPI \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e <em>\u0432\u0440\u0443\u0447\u043d\u0443\u044e<\/em>, \u043a\u0430\u043a \u0432 <a href=\"https:\/\/gist.github.com\/NaniteFactory\/0bd94e84bbe939cda7201374a0c261fd\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435<\/a> \u0441\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u044b\u043c \u043e\u043a\u043d\u043e\u043c:<\/p>\n<pre><code class=\"go\">import ( \"syscall\" \"unsafe\" )  \/\/ MessageBox of Win32 API. func MessageBox(hwnd uintptr, caption, title string, flags uint) int { ret, _, _ := syscall.NewLazyDLL(\"user32.dll\").          NewProc(\"MessageBoxW\").Call( uintptr(hwnd), uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(caption))), uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(title))), uintptr(flags)) return int(ret) }  \/\/<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-429663","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/429663","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=429663"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/429663\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=429663"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=429663"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=429663"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}