{"id":3975,"date":"2019-11-11T20:39:54","date_gmt":"2019-11-11T12:39:54","guid":{"rendered":"https:\/\/damogame.cn\/wordpress\/?p=3975"},"modified":"2019-11-11T20:39:54","modified_gmt":"2019-11-11T12:39:54","slug":"go-mod-%e4%bd%bf%e7%94%a8","status":"publish","type":"post","link":"https:\/\/i007.cc\/wordpress\/archives\/3975","title":{"rendered":"Go mod \u4f7f\u7528"},"content":{"rendered":"<div class=\"post-topheader custom-gusibi pt0\">\n<div class=\"mb20\">\n<div class=\"block-for-right-border\">\n<div class=\"row\">\n<div class=\"col-md-12 col-sm-12 col-xs-12\">\n<div class=\"post-topheader__info\" data-username=\"goodspeed\" data-userslug=\"goodspeed\" data-useravatar=\"https:\/\/avatar-static.segmentfault.com\/278\/610\/2786103630-1030000000123757_big64\">\n<div class=\"content__tech hidden-xs\"><a href=\"https:\/\/segmentfault.com\/a\/1190000018536993\">\u539f\u6587\u5730\u5740\u00a0<\/a><\/div>\n<div><\/div>\n<div class=\"content__tech hidden-xs\">\n<ul class=\"taglist--inline inline-block article__title--tag mr10\">\n<li class=\"tagPopup mb5\"><a class=\"tag\" href=\"https:\/\/segmentfault.com\/t\/%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B\/blogs\" data-toggle=\"popover\" data-img=\"\" data-placement=\"top\" data-original-title=\"\u5165\u95e8\u6559\u7a0b\" data-id=\"1040000002566337\">\u5165\u95e8\u6559\u7a0b<\/a><\/li>\n<li class=\"tagPopup mb5\"><a class=\"tag\" href=\"https:\/\/segmentfault.com\/t\/models\/blogs\" data-toggle=\"popover\" data-img=\"\" data-placement=\"top\" data-original-title=\"models\" data-id=\"1040000000652915\">models<\/a><\/li>\n<li class=\"tagPopup mb5\"><a class=\"tag\" href=\"https:\/\/segmentfault.com\/t\/golang\/blogs\" data-toggle=\"popover\" data-img=\"https:\/\/avatar-static.segmentfault.com\/188\/580\/1885801236-5a263f342d63c_big64\" data-placement=\"top\" data-original-title=\"golang\" data-id=\"1040000000090203\">golang<\/a><\/li>\n<\/ul>\n<p>13.4k \u6b21\u9605\u8bfb \u00a0\u00b7\u00a0 \u8bfb\u5b8c\u9700\u8981 29 \u5206\u949f<\/p><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"visible-lg\">\n<div class=\"side-widget\">\n<div id=\"side-widget-votes-btn\" class=\"stream__item-zan btn btn-default mt0 mb15 ml0 mr0 pt0 pb0 pl0 pr0 \"><span id=\"side-widget-votes-num\" class=\"stream__item-zan-number\">15<\/span><\/div>\n<p><i id=\"side-widget-bookmarks-btn\" class=\"fa fa-bookmark item \"><\/i><i class=\"fa fa-weibo item\"><\/i><i class=\"fa fa-weixin item\" title=\"\" data-toggle=\"popover\" data-placement=\"right\" data-original-title=\"\"><\/i><i class=\"fa fa-twitter item\"><\/i><i class=\"fa fa-facebook item\"><\/i><i class=\"fa fa-arrow-up item\"><\/i><\/div>\n<\/div>\n<div class=\"article fmt article__content\" data-id=\"1190000018536993\" data-license=\"nd\">\n<p><code>go modules<\/code>\u00a0\u662f golang 1.11 \u65b0\u52a0\u7684\u7279\u6027\u3002\u73b0\u57281.12 \u5df2\u7ecf\u53d1\u5e03\u4e86\uff0c\u662f\u65f6\u5019\u7528\u8d77\u6765\u4e86\u3002Modules\u5b98\u65b9\u5b9a\u4e49\u4e3a\uff1a<\/p>\n<blockquote><p>\u6a21\u5757\u662f\u76f8\u5173Go\u5305\u7684\u96c6\u5408\u3002modules\u662f\u6e90\u4ee3\u7801\u4ea4\u6362\u548c\u7248\u672c\u63a7\u5236\u7684\u5355\u5143\u3002 go\u547d\u4ee4\u76f4\u63a5\u652f\u6301\u4f7f\u7528modules\uff0c\u5305\u62ec\u8bb0\u5f55\u548c\u89e3\u6790\u5bf9\u5176\u4ed6\u6a21\u5757\u7684\u4f9d\u8d56\u6027\u3002modules\u66ff\u6362\u65e7\u7684\u57fa\u4e8eGOPATH\u7684\u65b9\u6cd5\u6765\u6307\u5b9a\u5728\u7ed9\u5b9a\u6784\u5efa\u4e2d\u4f7f\u7528\u54ea\u4e9b\u6e90\u6587\u4ef6\u3002<\/p><\/blockquote>\n<h2 id=\"articleHeader0\">\u5982\u4f55\u4f7f\u7528 Modules \uff1f<\/h2>\n<ol>\n<li>\u628a golang \u5347\u7ea7\u5230 1.11\uff08\u73b0\u57281.12 \u5df2\u7ecf\u53d1\u5e03\u4e86\uff0c\u5efa\u8bae\u4f7f\u75281.12\uff09<\/li>\n<li>\u8bbe\u7f6e\u00a0<code>GO111MODULE<\/code><\/li>\n<\/ol>\n<p>GO111MODULE<\/p>\n<p><code>GO111MODULE<\/code>\u00a0\u6709\u4e09\u4e2a\u503c\uff1a<code>off<\/code>,\u00a0<code>on<\/code>\u548c<code>auto\uff08\u9ed8\u8ba4\u503c\uff09<\/code>\u3002<\/p>\n<ul>\n<li><code>GO111MODULE=off<\/code>\uff0cgo\u547d\u4ee4\u884c\u5c06\u4e0d\u4f1a\u652f\u6301module\u529f\u80fd\uff0c\u5bfb\u627e\u4f9d\u8d56\u5305\u7684\u65b9\u5f0f\u5c06\u4f1a\u6cbf\u7528\u65e7\u7248\u672c\u90a3\u79cd\u901a\u8fc7vendor\u76ee\u5f55\u6216\u8005GOPATH\u6a21\u5f0f\u6765\u67e5\u627e\u3002<\/li>\n<li><code>GO111MODULE=on<\/code>\uff0cgo\u547d\u4ee4\u884c\u4f1a\u4f7f\u7528modules\uff0c\u800c\u4e00\u70b9\u4e5f\u4e0d\u4f1a\u53bbGOPATH\u76ee\u5f55\u4e0b\u67e5\u627e\u3002<\/li>\n<li><code>GO111MODULE=auto<\/code>\uff0c\u9ed8\u8ba4\u503c\uff0cgo\u547d\u4ee4\u884c\u5c06\u4f1a\u6839\u636e\u5f53\u524d\u76ee\u5f55\u6765\u51b3\u5b9a\u662f\u5426\u542f\u7528module\u529f\u80fd\u3002\u8fd9\u79cd\u60c5\u51b5\u4e0b\u53ef\u4ee5\u5206\u4e3a\u4e24\u79cd\u60c5\u5f62\uff1a\n<ul>\n<li>\u5f53\u524d\u76ee\u5f55\u5728GOPATH\/src\u4e4b\u5916\u4e14\u8be5\u76ee\u5f55\u5305\u542bgo.mod\u6587\u4ef6<\/li>\n<li>\u5f53\u524d\u6587\u4ef6\u5728\u5305\u542bgo.mod\u6587\u4ef6\u7684\u76ee\u5f55\u4e0b\u9762\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<blockquote><p>\u5f53modules \u529f\u80fd\u542f\u7528\u65f6\uff0c\u4f9d\u8d56\u5305\u7684\u5b58\u653e\u4f4d\u7f6e\u53d8\u66f4\u4e3a<code>$GOPATH\/pkg<\/code>\uff0c\u5141\u8bb8\u540c\u4e00\u4e2apackage\u591a\u4e2a\u7248\u672c\u5e76\u5b58\uff0c\u4e14\u591a\u4e2a\u9879\u76ee\u53ef\u4ee5\u5171\u4eab\u7f13\u5b58\u7684 module\u3002<\/p><\/blockquote>\n<h3 id=\"articleHeader1\">go mod<\/h3>\n<p>golang \u63d0\u4f9b\u4e86\u00a0<code>go mod<\/code>\u547d\u4ee4\u6765\u7ba1\u7406\u5305\u3002<\/p>\n<p>go mod \u6709\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th>\u547d\u4ee4<\/th>\n<th>\u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>download<\/td>\n<td>download modules to local cache(\u4e0b\u8f7d\u4f9d\u8d56\u5305)<\/td>\n<\/tr>\n<tr>\n<td>edit<\/td>\n<td>edit go.mod from tools or scripts\uff08\u7f16\u8f91go.mod<\/td>\n<\/tr>\n<tr>\n<td>graph<\/td>\n<td>print module requirement graph (\u6253\u5370\u6a21\u5757\u4f9d\u8d56\u56fe)<\/td>\n<\/tr>\n<tr>\n<td>init<\/td>\n<td>initialize new module in current directory\uff08\u5728\u5f53\u524d\u76ee\u5f55\u521d\u59cb\u5316mod\uff09<\/td>\n<\/tr>\n<tr>\n<td>tidy<\/td>\n<td>add missing and remove unused modules(\u62c9\u53d6\u7f3a\u5c11\u7684\u6a21\u5757\uff0c\u79fb\u9664\u4e0d\u7528\u7684\u6a21\u5757)<\/td>\n<\/tr>\n<tr>\n<td>vendor<\/td>\n<td>make vendored copy of dependencies(\u5c06\u4f9d\u8d56\u590d\u5236\u5230vendor\u4e0b)<\/td>\n<\/tr>\n<tr>\n<td>verify<\/td>\n<td>verify dependencies have expected content (\u9a8c\u8bc1\u4f9d\u8d56\u662f\u5426\u6b63\u786e\uff09<\/td>\n<\/tr>\n<tr>\n<td>why<\/td>\n<td>explain why packages or modules are needed(\u89e3\u91ca\u4e3a\u4ec0\u4e48\u9700\u8981\u4f9d\u8d56)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"articleHeader2\">\u5982\u4f55\u5728\u9879\u76ee\u4e2d\u4f7f\u7528<\/h2>\n<h3 id=\"articleHeader3\">\u793a\u4f8b\u4e00\uff1a\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee<\/h3>\n<ol>\n<li>\u5728<code>GOPATH \u76ee\u5f55\u4e4b\u5916<\/code>\u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\uff0c\u5e76\u4f7f\u7528<code>go mod init<\/code>\u00a0\u521d\u59cb\u5316\u751f\u6210<code>go.mod<\/code>\u00a0\u6587\u4ef6<\/li>\n<\/ol>\n<pre class=\"hljs go\"><code class=\"sh\">\u279c  ~ mkdir hello\r\n\u279c  ~ cd hello\r\n\u279c  hello <span class=\"hljs-keyword\">go<\/span> mod init hello\r\n<span class=\"hljs-keyword\">go<\/span>: creating <span class=\"hljs-built_in\">new<\/span> <span class=\"hljs-keyword\">go<\/span>.mod: module hello\r\n\u279c  hello ls\r\n<span class=\"hljs-keyword\">go<\/span>.mod\r\n\u279c  hello cat <span class=\"hljs-keyword\">go<\/span>.mod\r\nmodule hello\r\n\r\n<span class=\"hljs-keyword\">go<\/span> <span class=\"hljs-number\">1.12<\/span><\/code><\/pre>\n<blockquote><p>go.mod\u6587\u4ef6\u4e00\u65e6\u521b\u5efa\u540e\uff0c\u5b83\u7684\u5185\u5bb9\u5c06\u4f1a\u88abgo toolchain\u5168\u9762\u638c\u63a7\u3002go toolchain\u4f1a\u5728\u5404\u7c7b\u547d\u4ee4\u6267\u884c\u65f6\uff0c\u6bd4\u5982go get\u3001go build\u3001go mod\u7b49\u4fee\u6539\u548c\u7ef4\u62a4go.mod\u6587\u4ef6\u3002<\/p><\/blockquote>\n<p>go.mod \u63d0\u4f9b\u4e86<code>module<\/code>,\u00a0<code>require<\/code>\u3001<code>replace<\/code>\u548c<code>exclude<\/code>\u00a0\u56db\u4e2a\u547d\u4ee4<\/p>\n<ul>\n<li><code>module<\/code>\u00a0\u8bed\u53e5\u6307\u5b9a\u5305\u7684\u540d\u5b57\uff08\u8def\u5f84\uff09<\/li>\n<li><code>require<\/code>\u00a0\u8bed\u53e5\u6307\u5b9a\u7684\u4f9d\u8d56\u9879\u6a21\u5757<\/li>\n<li><code>replace<\/code>\u00a0\u8bed\u53e5\u53ef\u4ee5\u66ff\u6362\u4f9d\u8d56\u9879\u6a21\u5757<\/li>\n<li><code>exclude<\/code>\u00a0\u8bed\u53e5\u53ef\u4ee5\u5ffd\u7565\u4f9d\u8d56\u9879\u6a21\u5757<\/li>\n<\/ul>\n<ol>\n<li>\u6dfb\u52a0\u4f9d\u8d56<\/li>\n<\/ol>\n<p>\u65b0\u5efa\u4e00\u4e2a server.go \u6587\u4ef6\uff0c\u5199\u5165\u4ee5\u4e0b\u4ee3\u7801\uff1a<\/p>\n<pre class=\"go hljs\"><code class=\"go\"><span class=\"hljs-keyword\">package<\/span> main\r\n\r\n<span class=\"hljs-keyword\">import<\/span> (\r\n    <span class=\"hljs-string\">\"net\/http\"<\/span>\r\n    \r\n    <span class=\"hljs-string\">\"github.com\/labstack\/echo\"<\/span>\r\n)\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span><\/span> {\r\n    e := echo.New()\r\n    e.GET(<span class=\"hljs-string\">\"\/\"<\/span>, <span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span><span class=\"hljs-params\">(c echo.Context)<\/span> <span class=\"hljs-title\">error<\/span><\/span> {\r\n        <span class=\"hljs-keyword\">return<\/span> c.String(http.StatusOK, <span class=\"hljs-string\">\"Hello, World!\"<\/span>)\r\n    })\r\n    e.Logger.Fatal(e.Start(<span class=\"hljs-string\">\":1323\"<\/span>))\r\n}<\/code><\/pre>\n<p>\u6267\u884c\u00a0<code>go run server.go<\/code>\u00a0\u8fd0\u884c\u4ee3\u7801\u4f1a\u53d1\u73b0 go mod \u4f1a\u81ea\u52a8\u67e5\u627e\u4f9d\u8d56\u81ea\u52a8\u4e0b\u8f7d\uff1a<\/p>\n<pre class=\"hljs markdown\"><code class=\"sh\">$ go run server.go\r\ngo: finding github.com\/labstack\/echo v3.3.10+incompatible\r\ngo: downloading github.com\/labstack\/echo v3.3.10+incompatible\r\ngo: extracting github.com\/labstack\/echo v3.3.10+incompatible\r\ngo: finding github.com\/labstack\/gommon\/color latest\r\ngo: finding github.com\/labstack\/gommon\/log latest\r\ngo: finding github.com\/labstack\/gommon v0.2.8\r\n<span class=\"hljs-section\"># \u6b64\u5904\u7701\u7565\u5f88\u591a\u884c<\/span>\r\n...\r\n\r\n   <span class=\"hljs-strong\">____    __<\/span>\r\n  \/ <span class=\"hljs-strong\">__\/__<\/span><span class=\"hljs-emphasis\">_\/ \/  _<\/span>__\r\n \/ <span class=\"hljs-emphasis\">_\/\/ _<\/span><span class=\"hljs-emphasis\">_\/ _<\/span> \\\/ _ \\\r\n\/<span class=\"hljs-strong\">___\/\\__<\/span>\/<span class=\"hljs-emphasis\">_\/\/_<\/span>\/\\<span class=\"hljs-emphasis\">___<\/span>\/ v3.3.10-dev\r\nHigh performance, minimalist Go web framework\r\nhttps:\/\/echo.labstack.com\r\n<span class=\"hljs-strong\">_____<\/span><span class=\"hljs-strong\">_____<\/span><span class=\"hljs-strong\">_____<\/span><span class=\"hljs-strong\">_____<\/span><span class=\"hljs-strong\">_____<\/span><span class=\"hljs-strong\">_____<\/span><span class=\"hljs-strong\">_____<\/span><span class=\"hljs-emphasis\">_O\/_<\/span><span class=\"hljs-strong\">_____<\/span>_\r\n<span class=\"hljs-code\">                                    O\\<\/span>\r\n\u21e8 http server started on [::]:1323<\/code><\/pre>\n<p>\u73b0\u5728\u67e5\u770bgo.mod \u5185\u5bb9\uff1a<\/p>\n<pre class=\"go hljs\"><code class=\"go\">$ cat <span class=\"hljs-keyword\">go<\/span>.mod\r\n\r\nmodule hello\r\n\r\n<span class=\"hljs-keyword\">go<\/span> <span class=\"hljs-number\">1.12<\/span>\r\n\r\nrequire (\r\n    github.com\/labstack\/echo v3<span class=\"hljs-number\">.3<\/span><span class=\"hljs-number\">.10<\/span>+incompatible <span class=\"hljs-comment\">\/\/ indirect<\/span>\r\n    github.com\/labstack\/gommon v0<span class=\"hljs-number\">.2<\/span><span class=\"hljs-number\">.8<\/span> <span class=\"hljs-comment\">\/\/ indirect<\/span>\r\n    github.com\/mattn\/<span class=\"hljs-keyword\">go<\/span>-colorable v0<span class=\"hljs-number\">.1<\/span><span class=\"hljs-number\">.1<\/span> <span class=\"hljs-comment\">\/\/ indirect<\/span>\r\n    github.com\/mattn\/<span class=\"hljs-keyword\">go<\/span>-isatty v0<span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.7<\/span> <span class=\"hljs-comment\">\/\/ indirect<\/span>\r\n    github.com\/valyala\/fasttemplate v1<span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.0<\/span> <span class=\"hljs-comment\">\/\/ indirect<\/span>\r\n    golang.org\/x\/crypto v0<span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">-20190313024323<\/span>-a1f597ede03a <span class=\"hljs-comment\">\/\/ indirect<\/span>\r\n)<\/code><\/pre>\n<p>go module \u5b89\u88c5 package \u7684\u539f\u5247\u662f\u5148\u62c9\u6700\u65b0\u7684 release tag\uff0c\u82e5\u65e0tag\u5219\u62c9\u6700\u65b0\u7684commit\uff0c\u8be6\u89c1\u00a0<a href=\"https:\/\/github.com\/golang\/go\/wiki\/Modules\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Modules\u5b98\u65b9\u4ecb\u7ecd<\/a>\u3002 go \u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a go.sum \u6587\u4ef6\u6765\u8bb0\u5f55 dependency tree\uff1a<\/p>\n<pre class=\"hljs groovy\"><code class=\"sh\">$ cat go.sum\r\ngithub.com<span class=\"hljs-regexp\">\/labstack\/<\/span>echo v3<span class=\"hljs-number\">.3<\/span><span class=\"hljs-number\">.10<\/span>+incompatible <span class=\"hljs-string\">h1:<\/span>pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg=\r\ngithub.com<span class=\"hljs-regexp\">\/labstack\/<\/span>echo v3<span class=\"hljs-number\">.3<\/span><span class=\"hljs-number\">.10<\/span>+incompatible<span class=\"hljs-regexp\">\/go.mod h1:0INS7j\/<\/span>VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s=\r\ngithub.com<span class=\"hljs-regexp\">\/labstack\/<\/span>gommon v0<span class=\"hljs-number\">.2<\/span><span class=\"hljs-number\">.8<\/span> <span class=\"hljs-string\">h1:<\/span>JvRqmeZcfrHC5u6uVleB4NxxNbzx6gpbJiQknDbKQu0=\r\ngithub.com<span class=\"hljs-regexp\">\/labstack\/<\/span>gommon v0<span class=\"hljs-number\">.2<\/span><span class=\"hljs-number\">.8<\/span><span class=\"hljs-regexp\">\/go.mod h1:\/<\/span>tj9csK2iPSBvn+<span class=\"hljs-number\">3<\/span>NLM9e52usepMtrd5ilFYA+wQNJ4=\r\ngithub.com<span class=\"hljs-regexp\">\/mattn\/<\/span>go-colorable v0<span class=\"hljs-number\">.1<\/span><span class=\"hljs-number\">.1<\/span> <span class=\"hljs-string\">h1:<\/span>G1f5SKeVxmagw\/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg=\r\ngithub.com<span class=\"hljs-regexp\">\/mattn\/<\/span>go-colorable v0<span class=\"hljs-number\">.1<\/span><span class=\"hljs-number\">.1<\/span><span class=\"hljs-regexp\">\/go.mod h1:FuOcm+DKB9mbwrcAfNl7\/<\/span>TZVBZ6rcnceauSikq3lYCQ=\r\n... \u7701\u7565\u5f88\u591a\u884c<\/code><\/pre>\n<ol>\n<li>\u518d\u6b21\u6267\u884c\u811a\u672c\u00a0<code>go run server.go<\/code>\u00a0\u53d1\u73b0\u8df3\u8fc7\u4e86\u68c0\u67e5\u5e76\u5b89\u88c5\u4f9d\u8d56\u7684\u6b65\u9aa4\u3002<\/li>\n<li>\u53ef\u4ee5\u4f7f\u7528\u547d\u4ee4\u00a0<code>go list -m -u all<\/code>\u00a0\u6765\u68c0\u67e5\u53ef\u4ee5\u5347\u7ea7\u7684package\uff0c\u4f7f\u7528<code>go get -u need-upgrade-package<\/code>\u00a0\u5347\u7ea7\u540e\u4f1a\u5c06\u65b0\u7684\u4f9d\u8d56\u7248\u672c\u66f4\u65b0\u5230go.mod\n<ul>\n<li>\u4e5f\u53ef\u4ee5\u4f7f\u7528\u00a0<code>go get -u<\/code>\u00a0\u5347\u7ea7\u6240\u6709\u4f9d\u8d56<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h4>go get \u5347\u7ea7<\/h4>\n<ul>\n<li>\u8fd0\u884c go get -u \u5c06\u4f1a\u5347\u7ea7\u5230\u6700\u65b0\u7684\u6b21\u8981\u7248\u672c\u6216\u8005\u4fee\u8ba2\u7248\u672c(x.y.z, z\u662f\u4fee\u8ba2\u7248\u672c\u53f7\uff0c y\u662f\u6b21\u8981\u7248\u672c\u53f7)<\/li>\n<li>\u8fd0\u884c go get -u=patch \u5c06\u4f1a\u5347\u7ea7\u5230\u6700\u65b0\u7684\u4fee\u8ba2\u7248\u672c<\/li>\n<li>\u8fd0\u884c go get package@version \u5c06\u4f1a\u5347\u7ea7\u5230\u6307\u5b9a\u7684\u7248\u672c\u53f7version<\/li>\n<li>\u8fd0\u884cgo get\u5982\u679c\u6709\u7248\u672c\u7684\u66f4\u6539\uff0c\u90a3\u4e48go.mod\u6587\u4ef6\u4e5f\u4f1a\u66f4\u6539<\/li>\n<\/ul>\n<h3 id=\"articleHeader4\">\u793a\u4f8b\u4e8c\uff1a\u6539\u9020\u73b0\u6709\u9879\u76ee(helloword)<\/h3>\n<p>\u9879\u76ee\u76ee\u5f55\u4e3a\uff1a<\/p>\n<pre class=\"bash hljs\"><code class=\"bash\">$ tree\r\n.\r\n\u251c\u2500\u2500 api\r\n\u2502   \u2514\u2500\u2500 apis.go\r\n\u2514\u2500\u2500 server.go\r\n\r\n1 directory, 2 files<\/code><\/pre>\n<p>server.go \u6e90\u7801\u4e3a\uff1a<\/p>\n<pre class=\"go hljs\"><code class=\"go\"><span class=\"hljs-keyword\">package<\/span> main\r\n\r\n<span class=\"hljs-keyword\">import<\/span> (\r\n    api <span class=\"hljs-string\">\".\/api\"<\/span>  <span class=\"hljs-comment\">\/\/ \u8fd9\u91cc\u4f7f\u7528\u7684\u662f\u76f8\u5bf9\u8def\u5f84<\/span>\r\n    <span class=\"hljs-string\">\"github.com\/labstack\/echo\"<\/span>\r\n)\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span><\/span> {\r\n    e := echo.New()\r\n    e.GET(<span class=\"hljs-string\">\"\/\"<\/span>, api.HelloWorld)\r\n    e.Logger.Fatal(e.Start(<span class=\"hljs-string\">\":1323\"<\/span>))\r\n}<\/code><\/pre>\n<p>api\/apis.go \u6e90\u7801\u4e3a\uff1a<\/p>\n<pre class=\"go hljs\"><code class=\"go\"><span class=\"hljs-keyword\">package<\/span> api\r\n\r\n<span class=\"hljs-keyword\">import<\/span> (\r\n    <span class=\"hljs-string\">\"net\/http\"<\/span>\r\n\r\n    <span class=\"hljs-string\">\"github.com\/labstack\/echo\"<\/span>\r\n)\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">HelloWorld<\/span><span class=\"hljs-params\">(c echo.Context)<\/span> <span class=\"hljs-title\">error<\/span><\/span> {\r\n    <span class=\"hljs-keyword\">return<\/span> c.JSON(http.StatusOK, <span class=\"hljs-string\">\"hello world\"<\/span>)\r\n}<\/code><\/pre>\n<ol>\n<li>\u4f7f\u7528\u00a0<code>go mod init ***<\/code>\u00a0\u521d\u59cb\u5316go.mod<\/li>\n<\/ol>\n<pre class=\"hljs go\"><code>$ <span class=\"hljs-keyword\">go<\/span> mod init helloworld\r\n<span class=\"hljs-keyword\">go<\/span>: creating <span class=\"hljs-built_in\">new<\/span> <span class=\"hljs-keyword\">go<\/span>.mod: module helloworld<\/code><\/pre>\n<ol>\n<li>\u8fd0\u884c\u00a0<code>go run server.go<\/code><\/li>\n<\/ol>\n<pre class=\"hljs groovy\"><code class=\"sh\"><span class=\"hljs-string\">go:<\/span> finding github.com<span class=\"hljs-regexp\">\/labstack\/<\/span>gommon\/color latest\r\n<span class=\"hljs-string\">go:<\/span> finding github.com<span class=\"hljs-regexp\">\/labstack\/<\/span>gommon\/log latest\r\n<span class=\"hljs-string\">go:<\/span> finding golang.org<span class=\"hljs-regexp\">\/x\/<\/span>crypto<span class=\"hljs-regexp\">\/acme\/<\/span>autocert latest\r\n<span class=\"hljs-string\">go:<\/span> finding golang.org<span class=\"hljs-regexp\">\/x\/<\/span>crypto\/acme latest\r\n<span class=\"hljs-string\">go:<\/span> finding golang.org<span class=\"hljs-regexp\">\/x\/<\/span>crypto latest\r\nbuild command-line-<span class=\"hljs-string\">arguments:<\/span> cannot find module <span class=\"hljs-keyword\">for<\/span> path _<span class=\"hljs-regexp\">\/home\/<\/span>gs<span class=\"hljs-regexp\">\/helloworld\/<\/span>api<\/code><\/pre>\n<p>\u9996\u5148\u8fd8\u662f\u4f1a\u67e5\u627e\u5e76\u4e0b\u8f7d\u5b89\u88c5\u4f9d\u8d56\uff0c\u7136\u540e\u8fd0\u884c\u811a\u672c\u00a0<code>server.go<\/code>\uff0c\u8fd9\u91cc\u4f1a\u629b\u51fa\u4e00\u4e2a\u9519\u8bef\uff1a<\/p>\n<pre class=\"hljs groovy\"><code class=\"sh\">build command-line-<span class=\"hljs-string\">arguments:<\/span>\u00a0cannot find module\u00a0<span class=\"hljs-keyword\">for<\/span>\u00a0path _<span class=\"hljs-regexp\">\/home\/<\/span>gs<span class=\"hljs-regexp\">\/helloworld\/<\/span>api<\/code><\/pre>\n<p>\u4f46\u662f<code>go.mod<\/code>\u00a0\u5df2\u7ecf\u66f4\u65b0\uff1a<\/p>\n<pre class=\"hljs groovy\"><code class=\"sh\">$ cat go.mod\r\nmodule helloworld\r\n\r\ngo <span class=\"hljs-number\">1.12<\/span>\r\n\r\nrequire (\r\n        github.com<span class=\"hljs-regexp\">\/labstack\/<\/span>echo v3<span class=\"hljs-number\">.3<\/span><span class=\"hljs-number\">.10<\/span>+incompatible <span class=\"hljs-comment\">\/\/ indirect<\/span>\r\n        github.com<span class=\"hljs-regexp\">\/labstack\/<\/span>gommon v0<span class=\"hljs-number\">.2<\/span><span class=\"hljs-number\">.8<\/span> <span class=\"hljs-comment\">\/\/ indirect<\/span>\r\n        github.com<span class=\"hljs-regexp\">\/mattn\/<\/span>go-colorable v0<span class=\"hljs-number\">.1<\/span><span class=\"hljs-number\">.1<\/span> <span class=\"hljs-comment\">\/\/ indirect<\/span>\r\n        github.com<span class=\"hljs-regexp\">\/mattn\/<\/span>go-isatty v0<span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.7<\/span> <span class=\"hljs-comment\">\/\/ indirect<\/span>\r\n        github.com<span class=\"hljs-regexp\">\/valyala\/<\/span>fasttemplate v1<span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.0<\/span> <span class=\"hljs-comment\">\/\/ indirect<\/span>\r\n        golang.org<span class=\"hljs-regexp\">\/x\/<\/span>crypto v0<span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">-20190313024323<\/span>-a1f597ede03a <span class=\"hljs-comment\">\/\/ indirect<\/span>\r\n)<\/code><\/pre>\n<h5>\u90a3\u4e3a\u4ec0\u4e48\u4f1a\u629b\u51fa\u8fd9\u4e2a\u9519\u8bef\u5462\uff1f<\/h5>\n<p>\u8fd9\u662f\u56e0\u4e3a server.go \u4e2d\u4f7f\u7528 internal package \u7684\u65b9\u6cd5\u8ddf\u4ee5\u524d\u5df2\u7ecf\u4e0d\u540c\u4e86\uff0c\u7531\u4e8e go.mod\u4f1a\u626b\u63cf\u540c\u5de5\u4f5c\u76ee\u5f55\u4e0b\u6240\u6709 package \u5e76\u4e14<code>\u53d8\u66f4\u5f15\u5165\u65b9\u6cd5<\/code>\uff0c\u5fc5\u987b\u5c06 helloworld\u5f53\u6210\u8def\u5f84\u7684\u524d\u7f00\uff0c\u4e5f\u5c31\u662f\u9700\u8981\u5199\u6210 import helloworld\/api\uff0c\u4ee5\u5f80 GOPATH\/dep \u6a21\u5f0f\u5141\u8bb8\u7684 import .\/api \u5df2\u7ecf\u5931\u6548\uff0c\u8be6\u60c5\u53ef\u4ee5\u67e5\u770b\u8fd9\u4e2a\u00a0<a href=\"https:\/\/github.com\/golang\/go\/issues\/26645\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">issue<\/a>\u3002<\/p>\n<ol>\n<li>\u66f4\u65b0\u65e7\u7684package import \u65b9\u5f0f<\/li>\n<\/ol>\n<p>\u6240\u4ee5server.go \u9700\u8981\u6539\u5199\u6210\uff1a<\/p>\n<pre class=\"go hljs\"><code class=\"go\"><span class=\"hljs-keyword\">package<\/span> main\r\n\r\n<span class=\"hljs-keyword\">import<\/span> (\r\n    api <span class=\"hljs-string\">\"helloworld\/api\"<\/span>  <span class=\"hljs-comment\">\/\/ \u8fd9\u662f\u66f4\u65b0\u540e\u7684\u5f15\u5165\u65b9\u6cd5<\/span>\r\n    <span class=\"hljs-string\">\"github.com\/labstack\/echo\"<\/span>\r\n)\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span><\/span> {\r\n    e := echo.New()\r\n    e.GET(<span class=\"hljs-string\">\"\/\"<\/span>, api.HelloWorld)\r\n    e.Logger.Fatal(e.Start(<span class=\"hljs-string\">\":1323\"<\/span>))\r\n}<\/code><\/pre>\n<blockquote><p><code>\u4e00\u4e2a\u5c0f\u5751<\/code>\uff1a\u5f00\u59cb\u5728golang1.11 \u4e0b\u4f7f\u7528go mod \u9047\u5230\u8fc7\u00a0<code>go build github.com\/valyala\/fasttemplate: module requires go 1.12<\/code>\u00a0<a href=\"https:\/\/github.com\/golang\/go\/issues\/27565\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\u8fd9\u79cd\u9519\u8bef<\/a>\uff0c\u9047\u5230\u7c7b\u4f3c\u8fd9\u79cd\u9700\u8981\u5347\u7ea7\u52301.12 \u7684\u95ee\u9898\uff0c\u76f4\u63a5\u5347\u7ea7golang1.12 \u5c31\u597d\u4e86\u3002\u5e78\u4e8f\u662f\u57281.12 \u53d1\u5e03\u540e\u624d\u5c1d\u8bd5\u7684<code>go mod<\/code>\u00a0?\u200d\u2642\ufe0f<\/p><\/blockquote>\n<ol>\n<li>\u5230\u8fd9\u91cc\u5c31\u548c\u65b0\u521b\u5efa\u4e00\u4e2a\u9879\u76ee\u6ca1\u4ec0\u4e48\u533a\u522b\u4e86<\/li>\n<\/ol>\n<h2 id=\"articleHeader5\">\u4f7f\u7528replace\u66ff\u6362\u65e0\u6cd5\u76f4\u63a5\u83b7\u53d6\u7684package<\/h2>\n<p>\u7531\u4e8e\u67d0\u4e9b\u5df2\u77e5\u7684\u539f\u56e0\uff0c\u5e76\u4e0d\u662f\u6240\u6709\u7684package\u90fd\u80fd\u6210\u529f\u4e0b\u8f7d\uff0c\u6bd4\u5982\uff1a<code>golang.org<\/code>\u4e0b\u7684\u5305\u3002<\/p>\n<p>modules \u53ef\u4ee5\u901a\u8fc7\u5728 go.mod \u6587\u4ef6\u4e2d\u4f7f\u7528 replace \u6307\u4ee4\u66ff\u6362\u6210github\u4e0a\u5bf9\u5e94\u7684\u5e93\uff0c\u6bd4\u5982\uff1a<\/p>\n<pre class=\"hljs lisp\"><code>replace (\r\n    <span class=\"hljs-name\">golang<\/span>.org\/x\/crypto v0.<span class=\"hljs-number\">0.0<\/span><span class=\"hljs-number\">-20190313024323<\/span>-a1f597ede03a =&gt; github.com\/golang\/crypto v0.<span class=\"hljs-number\">0.0<\/span><span class=\"hljs-number\">-20190313024323<\/span>-a1f597ede03a\r\n)<\/code><\/pre>\n<p>\u6216\u8005<\/p>\n<pre class=\"hljs typescript\"><code>replace golang.org\/x\/crypto v0<span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">-20190313024323<\/span>-<span class=\"hljs-function\"><span class=\"hljs-params\">a1f597ede03a<\/span>\u00a0=&gt;<\/span>\u00a0github.com\/golang\/crypto v0<span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">-20190313024323<\/span>-a1f597ede03a<\/code><\/pre>\n<h2 id=\"articleHeader6\">\u53c2\u8003\u94fe\u63a5<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/golang\/go\/wiki\/Modules\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Modules\u5b98\u65b9\u4ecb\u7ecd<\/a><\/li>\n<li><a href=\"https:\/\/www.lightblue.asia\/golang-1-11-new-festures-modules\/?doing_wp_cron=1552464864.6369309425354003906250\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Golang 1.11 \u65b0\u529f\u80fd\u4ecb\u7d39 \u2013 Modules<\/a><\/li>\n<li><a href=\"https:\/\/talks.godoc.org\/github.com\/myitcv\/talks\/2018-08-15-glug-modules\/main.slide#1\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">What are Go modules and how do I use them?<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/golang\/go\/issues\/27565\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">go mod doesn&#8217;t work for github.com\/gomarkdown\/markdown\/html<\/a><\/li>\n<li><a href=\"https:\/\/www.cnblogs.com\/apocelipes\/p\/10295096.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\u518d\u63a2go modules\uff1a\u4f7f\u7528\u4e0e\u7ec6\u8282<\/a><\/li>\n<li><a href=\"https:\/\/tonybai.com\/2018\/07\/15\/hello-go-module\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\u521d\u7aa5Go module<\/a><\/li>\n<\/ul>\n<h4>References<\/h4>\n<p>[1] Modules\u5b98\u65b9\u4ecb\u7ecd:\u00a0<a href=\"https:\/\/github.com\/golang\/go\/wiki\/Modules\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https:\/\/github.com\/golang\/go\/&#8230;<\/a><br \/>\n[2] issue:\u00a0<a href=\"https:\/\/github.com\/golang\/go\/issues\/26645\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https:\/\/github.com\/golang\/go\/&#8230;<\/a><br \/>\n[3] \u8fd9\u79cd\u9519\u8bef:\u00a0<a href=\"https:\/\/github.com\/golang\/go\/issues\/27565\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https:\/\/github.com\/golang\/go\/&#8230;<\/a><br \/>\n[4] Modules\u5b98\u65b9\u4ecb\u7ecd:\u00a0<a href=\"https:\/\/github.com\/golang\/go\/wiki\/Modules\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https:\/\/github.com\/golang\/go\/&#8230;<\/a><br \/>\n[5] Golang 1.11 \u65b0\u529f\u80fd\u4ecb\u7d39 \u2013 Modules:\u00a0<a href=\"https:\/\/www.lightblue.asia\/golang-1-11-new-festures-modules\/?doing_wp_cron=1552464864.6369309425354003906250\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https:\/\/www.lightblue.asia\/go&#8230;<\/a><br \/>\n[6] What are Go modules and how do I use them?:\u00a0<a href=\"https:\/\/talks.godoc.org\/github.com\/myitcv\/talks\/2018-08-15-glug-modules\/main.slide#1\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https:\/\/talks.godoc.org\/githu&#8230;<\/a><br \/>\n[7] go mod doesn&#8217;t work for github.com\/gomarkdown\/markdown\/html :\u00a0<a href=\"https:\/\/github.com\/golang\/go\/issues\/27565\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https:\/\/github.com\/golang\/go\/&#8230;<\/a><br \/>\n[8] \u518d\u63a2go modules\uff1a\u4f7f\u7528\u4e0e\u7ec6\u8282:\u00a0<a href=\"https:\/\/www.cnblogs.com\/apocelipes\/p\/10295096.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https:\/\/www.cnblogs.com\/apoce&#8230;<\/a><br \/>\n[9] \u521d\u7aa5Go module:\u00a0<a href=\"https:\/\/tonybai.com\/2018\/07\/15\/hello-go-module\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https:\/\/tonybai.com\/2018\/07\/1&#8230;<\/a><\/p>\n<hr \/>\n<p><strong>\u6700\u540e\uff0c\u611f\u8c22\u5973\u670b\u53cb\u652f\u6301\u548c\u5305\u5bb9\uff0c\u6bd4\u2764\ufe0f<\/strong><\/p>\n<p>\u4e5f\u53ef\u4ee5\u5728\u516c\u53f7\u8f93\u5165\u4ee5\u4e0b\u5173\u952e\u5b57\u83b7\u53d6\u5386\u53f2\u6587\u7ae0\uff1a<code>\u516c\u53f7&amp;\u5c0f\u7a0b\u5e8f<\/code>\u00a0|\u00a0<code>\u8bbe\u8ba1\u6a21\u5f0f<\/code>\u00a0|\u00a0<code>\u5e76\u53d1&amp;\u534f\u7a0b<\/code><\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u539f\u6587\u5730\u5740\u00a0 \u5165\u95e8\u6559\u7a0b models go<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[],"tags":[122],"class_list":["post-3975","post","type-post","status-publish","format-standard","hentry","tag-06-godocker"],"_links":{"self":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/3975","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/comments?post=3975"}],"version-history":[{"count":0,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/3975\/revisions"}],"wp:attachment":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/media?parent=3975"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/categories?post=3975"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/tags?post=3975"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}