亲测GO环境搭建,理解go build、go install、go get

2023-11-11

前言:
秉承着作为一个新人,要有着“指哪打哪”的觉悟。在老大的需求下,顶上前端的空缺先干阵子前端。当然,在工作之余还是要好好朝着既定的方向努力的,实习结束后还了电脑,这次毕业再来换了新Mac,重新搭下Go的环境,顺便好好总结下,以后随着学习的深入,也会持续更新。

GO下载:
GO语言中文网下载: https://studygolang.com/dl
Mac下直接通过brew instatll go指令即可完成下载安装

GO环境变量配置:
$GOROOT=/usr/local/go                        GO安装目录
$GOPATH=/usr/local/var/www/go          GO工作目录
$GOBIN=$GOPATH/bin                          GO可执行文件目录
$PATH=$PATH:$GOBIN:$GOROOT/bin  将GO可执行文件加入PATH中,使GO指令与我们编写的GO应用可以全局调用

$GOPATH工作目录结构,约定有三个子目录(需要自行创建):
src ——存放源代码文件
pkg——存放编译后的文件
bin ——存放编译后的可执行文件

示例(首先使用go推荐的go build方式构建应用,稍后会说到其他的方式):
通过我们的操作,在最终测试成功后,$GOPATH的目录树应该如下所示:
具体操作如下:
1、创建应用包mypkg:切到【$GOPATH/src】目录下,创建一个mypkg目录,在mypkg目录下,新建一个hello.go,内容如下:
2、编译应用包(在此Demo中,此步骤并不必要,在此只是为了展示go install编译效果):在刚刚的目录下执行【go install】指令或者在任意目录下执行【go install mypkg】指令,如果代码有错或依赖找不到会报错,如果正确则没有任何提示。此时,你可以切到【$GOPATH/pkg】目录下,会发现多了一个名为【$GOOS_$GOARCH】的目录,切进该目录,就会看到刚刚编译生成的文件mypkg.a文件。(其中$GOOS与$GOARCH的具体值可以通过【go env】指令查询,更多详情可参看: http://wiki.jikexueyuan.com/project/go-command-tutorial/0.14.html
3、创建新应用包myapp,创建新文件main.go(同步骤1),import引入mypkg包,内容如下:
4、构建可执行文件:在myapp目录下,使用【go build】指令,会在当前目录下生成一个myapp的可执行文件,这个可执行文件不依赖其他文件,复制到任何目录下都可通过【./myapp】执行,复制到任何$PATH配置的目录中都可通过【myapp】全局执行。
总结:我们在这个Demo里主要用到了两个GO指令,【go install】与【go build】,他们的区别如下:
【go build】指令的作用是:在当前目录下编译生成可执行文件。注意,go build指令会调用所有引用包的源码,重新编译,而不是直接使用pkg里的编译后文件,如果在【$GOROOT】与【$GOPATH】下没有找到import引入包的项目源码,就会报错。在本demo里,main.go中import引入了"mypkg"包,如果我删除【$GOPATH/src/mypkg】源码,执行【go build】指令,会报错如下:
【go install】指令的作用是:编译源代码,如果为可执行文件(package "main"且包含main方法),则会编译生成可执行文件到【$GOPATH/bin】目录下;可执行文件import引入的其他包,就会被编译到【$GOPATH/pkg/$GOOS_$GOARCH】目录下。
(关于go的导入和编译,如果有不清楚的,可以看下这篇博客 https://studygolang.com/articles/3189
我们会发现:【go install】也可以完成类似【go build】的功能,区别在于【go install】会生成二进制文件到【$GOPATH/pkg/$GOOS_$GOARCH】目录下(这个二进制文件对于我们并没什么意义),但【go install】会把可执行文件自动生成到【$GOBIN】目录下,这是在一开始被配置到【$PATH】中了,这样就可以使项目可执行文件能被方便的全局调用。
如果在本Demo中,使用【go install】构建可执行文件
我们编写好源代码文件时,目录树如下:
切到myapp目录下,执行【go install】指令,会生成如下结构目录树:
此时就可以通过【myapp】全局执行了!

其他指令:
go env指令可检查go环境
go version查看go版本
go get可以暂时理解为git clone到【$GOPATH/src】 + go install

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

亲测GO环境搭建,理解go build、go install、go get 的相关文章

  • 无法从 Git 扩展向 GitHub 进行身份验证?

    我只是在 Visual Studio 2010 中设置 Git 扩展 但无法真正使其工作 我无法进行身份验证 在 Git Extensions 中 如果我选择 Plugins gt GitHub 我可以添加用户 密码 API 令牌并选择 S
  • 为什么 shell=True 的 subprocess.Popen() 在 Linux 和 Windows 上的工作方式不同?

    使用时subprocess Popen args shell True 跑步 gcc version 仅作为示例 在 Windows 上我们得到 gt gt gt from subprocess import Popen gt gt gt
  • 永久删除 git 提交历史记录

    我需要永久且完全删除 git 存储库的提交历史记录并继续使用文件的当前版本 旧版本 提交不得以任何方式访问 我尝试创建一个新的主分支 删除所有其他分支 但是当我在 git bash 中尝试 git show xxxx 时 旧的提交继续显示
  • shell解析json并循环输出组合变量

    杰斯克喜欢我之前的话题 https stackoverflow com questions 74063588 shell parsing json contains spaces in string 我知道如何解析带有空格的简单 json
  • 比较linux中的两个未排序列表,列出第二个文件中的唯一项

    我有 2 个包含号码列表 电话号码 的文件 我正在寻找一种列出第二个文件中第一个文件中不存在的数字的方法 我尝试过各种方法 comm getting some weird sorting errors fgrep v x f second
  • 从远程获取上个月在 git 分支上提交的文件列表

    我正在尝试获取上个月在 master 分支的 github 存储库上更改的所有文件的列表 我的本地克隆没有可以追溯到那么远的日志 因此当我运行以下命令时 git diff stat 1 month ago 我收到一条警告消息和一小部分更改
  • 如何使用 bash 中提供的工具生成一系列非周末日期?

    我想生成一个文件列表 其中名称包含 filename date 例如file 20111101 file 20120703 开始November 1 2011直到今天 应该不包括周末 Thanks 2011年试试这个 for y in 20
  • PHP exec rm -Rf 不适用于子目录

    我试图删除特定文件夹中的所有内容 但它似乎不会影响子文件夹 但它应该 因为 bash 命令是从控制台执行的 system rm Rf some dir 该命令中不需要星号 如果要与文件一起删除目录 请同时删除斜杠 留下斜杠将删除文件 但保留
  • Git:如何维护项目的两个分支并仅合并共享数据?

    假设我有一个项目的两个分支 IMClient MacOS 和 IMClient Windows 它们的代码仅 比方说 一个目录 main 有所不同 所有其他目录都包含与系统无关的代码并且可以互换 有些工作人员在 Windows 版本上工作
  • “git merge --squash”的正确用例是什么?

    有些人喜欢git merge squash由于以下原因 压缩到单个提交使您有机会清理混乱的 WIP 提交 并为您要合并的更改提供良好的理由 https coderwall com p qkrmjq git merge squash http
  • 合并多个 git 存储库

    假设我有一个看起来像这样的设置 phd code phd figures phd thesis 由于历史原因 这些都有自己的 git 存储库 但我想将它们合并为一个 以稍微简化事情 例如 现在我可能会进行两组更改 并且必须执行类似的操作 c
  • 在 bash 中,如何除以两个变量并输出四舍五入到小数点后 5 位的答案? [复制]

    这个问题在这里已经有答案了 我将两个变量作为输入 将它们相除后 我希望将输出四舍五入到小数点后 5 位 我已经尝试过这种方法 gt sum 12 n 7 output scale 5 sum n bc echo output 我的代码没有显
  • 仅将单个文件放入 git 子模块/存储库中

    我在 git 源代码存储库中有一个特定文件 其中包含生产设置 密码 我想限制此文件 以便只有制作团队的成员才能看到它 但是 我想控制它的变化 我考虑过在 git 中使用子模块 然后限制对新存储库的访问 然而 git 似乎需要子模块的整个子目
  • 无法从另一台计算机访问 git 分支

    基本上我看不到另一台计算机上的分支 我跑 git branch a 在家用电脑上我得到 C learn ror sample app filling in layout gt git branch a filling in layout m
  • Windows 上的 git 忽略文件名大小写更改 [重复]

    这个问题在这里已经有答案了 我有一个reactjs应用程序 我正在将所有文件名标准化为小写以符合Nodejs 最佳实践 https devcenter heroku com articles node best practices stic
  • 如何将更改提交到另一个预先存在的分支

    我刚刚对一个分支进行了更改 如何将更改提交到另一个分支 我正在尝试使用 git checkout the commmit to the changed branch b the other branch 但是 我认为这不是正确的做法 因为在
  • git update-index --no-assume-unchanged 不起作用

    我设置了assume unchanged咬了几个文件 现在我想取消它们 但这不起作用 gt git update index no assume unchanged Gemfile gt git ls files v grep Gemfil
  • 警告:引用名称“xxx”不明确

    我想知道为什么我收到 refname is ambigeous 的警告 这是否意味着名称以该字符串开头的分支不超过两个 但这里没有 Thanks git checkout B03799 warning refname B03799 is a
  • git 从存储中删除文件

    我有一个藏匿处 里面有一堆文件 但由于文件冲突 我无法应用我的存储 我已经在我的存储中发现了有问题的文件 我想将其删除 如何从存储中删除单个文件而不破坏整个文件 存储是一次提交 或者实际上是两次甚至有时是三次提交 并且您无法更改提交 那么
  • 将主分支的提交合并到另一个分支,但不合并两个分支

    我有 git 存储库和一个主分支 我决定开发新功能 并且创建了新分支 new branch 我已经在 new branch 中创建了一些提交 但我还没有完成新功能 我决定修复 master 分支中的一些错误 因此我切换到 master 分支

随机推荐

  • Blender基本使用(个人笔记)

    界面移动 按住鼠标滚轮以一点为中心进行视图旋转 同时按住shift和鼠标滚轮可平移视图 滚动鼠标滚轮进行视图的缩放 按下小键盘1 3 7进入前视图 右视图 俯视图 以及CTRL 1 CTRL 3 CTRL 7查看后视图 左视图 底视图 AL
  • Wireshark抓包——IP协议分析

    一 实验目的 通过本次实验 掌握使用Wireshark抓取TCP IP协议数据包的技能 能够深入分析IP帧格式 通过抓包和分析数据包来理解TCP IP协议 进一步提高理论联系实践的能力 二 实验内容 1 本次实验重点 利用Wireshark
  • 浏览器(Microsoft Edge)主页被360劫持的终极解决办法

    今天开启Microsoft Edge发现主页变成了360搜索的主页 心里很膈应 我的电脑里没有安装任何360的软件 不知道是怎么被改动了 可能是装其他软件时被篡改了 尝试一 更改edge浏览器的设置 即使设置了打开特定网址 再次打开依然是3
  • 笔记本电脑亮度突然无法用快捷键调节

    重装系统后 笔记本的亮度无法调节始终为最高亮度 一度以为是系统问题 重装了显卡驱动也无效 该问题困扰了我半年之久 今天终于解决了 1 故障现象 笔记本的屏幕亮度无法调节 快捷键 失效 重装显卡驱动 无效 2 原因分析 这是因为电脑安装了某个
  • char和varchar简单比较

    区别 char varchar 最大长度 255字符 65535字符 长度设置 定长 变长 空间使用 浪费空间 节省空间 查找效率 较高 较低 解读varchar 20 字段最多存放20个字符 varchar 20 和varchar 200
  • 基于http协议的Web服务器

    原理 由HTTP客户端发起一个请求 建立一个到服务器指定端口 默认端口 80 的TCP连接 HTTP在此端口监听客户端发送过来的请求 一旦收到请求 服务器向客户端回复一个状态行 比如 HTTP 1 0 200 OK 和响应消息 HTTP协议
  • 微服务项目实战 - 电商平台 项目框架及多模块开发

    本项目会被分为多个文章去讲解实现 目录 1 项目简介 项目模式 1 B2B模式 B2B Business to Business 2 B2C 模式 B2C Business to Consumer 3 C2B模式 C2B Customert
  • 【Word】学习笔记|批量解决文档中公式编号不居中的问题

    1 问题描述 当你将一个Word中内容 包含公式 复制到另外一个Ward里 发现MathType公式编号未居中 如上图所示 如果你公式较少 可以参考官方教程解决 就是将段落 中文版式 文本对齐方式中设置为居中就行 官方解决方法 MathTy
  • 一个Chen系统的激活控制同步——MATLAB实现

    对于 C h e n Chen Chen系统 驱动系统定义为
  • Linux下lt8911exb调试总结

    调试lt8911exb花了两天时间 总结下 ic功能介绍 mipi转eDP http cn lontiumsemi com UploadFiles pdf LT8911EXB Product Brief pdf github下有驱动源码 可
  • c++11~c++20 -05-thread_local

    目录 一 thread local简介 二 示例 2 1 全局变量 2 2 局部变量 2 3 类对象 2 4 类成员变量 一 thread local简介 thread local变量是C 11新引入的一种存储类型 它会影响变量的存储周期
  • 深入了解Java队列接口

    队列接口 队列接口是 Java 集合框架的一个重要部分 它扩展了 Collection 接口 队列接口表示遵循 先进先出 FIFO 原则的元素集合 队列允许存储重复值 队列的基本特征是元素按特定顺序存储 类似于等待轮流的人群 主要通过添加元
  • 服务器文件怎么删,怎么删除服务器文件

    怎么删除服务器文件 内容精选 换一换 执行chmod R 777 导致CentOS云服务器根目录权限设置成777 系统中的大部分服务以及命令无法使用 此时可通过系统自带的getfacl命令来拷贝和还原系统权限 本节操作介绍误操作导致根目录设
  • Android 12应用适配指南

    Android 12应用适配指南 1 Android 12上的主要变更 1 1 兼容性 1 1 1 前台服务启动限制 1 1 2 前台服务通知延迟 1 1 3 待处理 intent 必须声明可变性 1 1 4 非SDK接口名单更新 1 2
  • vue 通过逻辑控制el-dropdown组件展开和收起

    el dropdown在element ui中应用场景并不少 有些时候 我们下拉的内容并不是他本来的选项 用户选择后就没有关闭 这个时候 就需要我们在逻辑层开启或关闭他的菜单
  • 通过JVM深入理解Java异常机制

    JVM内部结构 要深入理解JVM异常处理机制 需要从JVM内部结构开始 下图描述的主要是Java程序在执行时 由JVM管理的运行时数据区 包括方法区 Java堆 Java虚拟机栈 PC寄存器 本地方法栈 还有常量池 它们又被分为两大类 线程
  • matlab-基础 plot xlabel 图像加上x,y轴的标签

    2019独角兽企业重金招聘Python工程师标准 gt gt gt matlab R2018a 64bit OS Windows 10 x64typesetting Markdown blog my oschina net zhicheng
  • 2014百度校招笔试题之动态链接库&静态链接库详解

    1 什么是静态连接库 什么是动态链接库 静态链接库用通俗的话讲 静态库就是将代码编译到一个二进制文件下 通常扩展名为 LIB 然后客户端调用程序 只需要包含相关的 h文件及LIB库文件一起链接到exe文件中 可执行程序发布后 不再需要该 l
  • cookie默认有效期多长_惊艳面试官的 Cookie 介绍

    关注在看 以后更多干货分享在头条 Cookie 是什么 Cookie 是用户浏览器保存在本地的一小块数据 它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上 Cookie 主要用于以下三个方面 会话状态管理 如用户登录状态 购物
  • 亲测GO环境搭建,理解go build、go install、go get

    前言 秉承着作为一个新人 要有着 指哪打哪 的觉悟 在老大的需求下 顶上前端的空缺先干阵子前端 当然 在工作之余还是要好好朝着既定的方向努力的 实习结束后还了电脑 这次毕业再来换了新Mac 重新搭下Go的环境 顺便好好总结下 以后随着学习的