当前位置: 首页 > news >正文

Go语言基础学习01-Liunx下Go开发环境配置;源码组织方式;go build/install/get详解

目录

  • Linux环境下配置安装VScode并配置Go语言开发环境
  • Go语言源码的组织方式
  • Go语言源码安装后的结果
  • Go程序构建和安装的过程
  • go build扩展
  • go get 命令详解

之前学习过Go语言,学习的时候没有记录笔记,最近找了个极客时间的Go语言36讲,打算时间学习并记录学习过程。
自己抽空看了一点内容,发现这个内容对于0基础解除Go语言的同学不是很友好,更适用与有一点Go基础,随后想深入了解一下Go语言基本特性的人群学习。

Linux环境下配置安装VScode并配置Go语言开发环境

在Linux开发我目前适用的编译器是VScode,如果考虑使用VScode的话可以考虑参考我之前写过的文章安装。
对于Go开发环境的配置在Linux环境下配置Go开发环境,之前有非常多的前辈已经做过了,在这里就不在赘述,感觉简单写一遍也没有实际意义,提供下面几个链接供参考

  • 主要包含内容:下载Go源码、配置环境变量GOPATH、GOROOT、GOPROXY、VScode中安装对应的插件:(参考下述链接:如果适用Goland作为编译器,只需要参考下述链接1即可完成Linux下开发环境配置、如果使用使用VScode作为编辑器,在安装完VSCode后需要配置Go插件,参考第二篇文章
    • 链接1
    • 链接2
    • 链接3
    • 链接4

Go语言源码的组织方式

  Go 语言的源码是以代码包为基本组织单位的。在文件系统中,这些代码包其实是与目录一一对应的。目录可以有子目录,所以代码包也可以有子包。
 一个代码包中可以包含任意个以.go 为扩展名的源码文件,这些源码文件都需要被声明为属于同一个代码包。代码包的名称一般会与这些源码文件所在的目录同名。如果不同名,那么在构建、安装的过程中会以代码包名称为准。 每个代码包都会有导入路径。代码包的导入路径是其他代码在使用该包中的程序实体时需要引入的路径。在实际使用程序实体之前,我们必须先导入其所在的代码包。具体的方式就是import
 该代码包的导入路径。就像这样:

import "github.com/labstack/echo"

 在工作区中,一个代码包的导入路径实际上就是从 src 子目录,到该包的实际存储位置的相对路径。所以说,Go 语言源码的组织方式就是以环境变量 GOPATH、工作区、src 目录和代码包为主线的。一般情况下,Go 语言的源码文件都需要被存放在环境变量 GOPATH 包含的某个工作区(目录)中的 src 目录下的某个代码包(目录)中。

适用Go语言开发项目时,如果按照上述参考链接配置GOPATH,项目源码的存放路径在GOPATH路径下的src目录中,GOPATH对应的每一个文件路径都是工作区,如果后续需要讲新的源码路径作为工作区,只需要编辑对应的GOPATH即可,在其中添加对应路径。

打开终端查看GOPATH

  • go env | grep GOPATH
    在这里插入图片描述
    此时项目源码路径组织如下:
    在这里插入图片描述
    src目录: 存放源码文件。
    pkg目录: 如果安装过程中产生了归档文件(库文件:在Linux下也就是.a文件,就是archive文件,是程序编译成功后生成的静态库文件),就会将归档文件放到工作区的pkg目录。
    bin目录: 如果安装过程中产生了可执行文件,就会将可执行文件放到工作去的bin目录。

Go语言源码安装后的结果

 源码文件以及安装后的结果文件都会放到哪里呢?我们都知道,源码文件通常会被放在某个工作
区的 src 子目录下。那么在安装后如果产生了归档文件,就会放进该工作区的 pkg 子目录;如果产生了可执行文件,就可能会放进该工作区的 bin 子目录。
归档文件存放的具体位置和规则。
 源码文件会以代码包的形式组织起来,一个代码包其实就对应一个目录。安装某个代码包而产生
的归档文件是与这个代码包同名的。放置它的相对目录就是该代码包的导入路径的直接父级。比如,一个已存在的代码包的导入路径是:
 github.com/labstack/echo
 那么执行命令
 go install github.com/labstack/echo
 生成的归档文件的相对目录就是 github.com/labstack, 文件名为 echo.a。
 顺便说一下,上面这个代码包导入路径还有另外一层含义,那就是:该代码包的源码文件存在于GitHub 网站的 labstack 组的代码仓库 echo 中。
 再说回来,归档文件的相对目录与 pkg 目录之间还有一级目录,叫做平台相关目录。平台相关目录的名称是由 build(也称“构建”)的目标操作系统、下划线和目标计算架构的代号组成的。比如,构建某个代码包时的目标操作系统是 Linux,目标计算架构是 64 位的,那么对应的平台相关目录就是 linux_amd64。
 因此,上述代码包的归档文件就会被放置在当前工作区的子目录
pkg/linux_amd64/github.com/labstack 中。
 总之,你需要记住的是,某个工作区的 src 子目录下的源码文件在安装后一般会被放置到当前工
作区的 pkg 子目录下对应的目录中,或者被直接放置到该工作区的 bin 子目录中。

Go程序构建和安装的过程

构建使用命令go build,安装使用命令go install。 构建和安装代码包的时候都会执行编译、打包等操作,并且这些操作生成的任何文件都会先被保存到某个临时的目录中。
如果构建的是库源码文件,那么操作的结果文件只会存在于临时目录中。这里的构建的主要意义
在于检查和验证。
如果构建的是命令源码文件,那么操作的结果文件会被搬运到那个源码文件所在的目录中。安装操作会先执行构建,然后还会进行链接操作,并且把结果文件搬运到指定目录。进一步说,
如果安装的是库源码文件, 那么结果文件会被搬运到它所在工作区的 pkg 目录下的某个子目录中。如果安装的是命令源码文件,那么结果文件会被搬运到它所在工作区的 bin 目录中,或者环境变量GOBIN指向的目录中(一般不需要配置GOBIN)。

go build扩展

 在运行go build命令的时候,默认不会编译目标代码包所依赖的那些代码包。当然,如果被依赖的代码包的归档文件不存在,或者源码文件有了变化,那它还是会被编译。如果要强制编译它们,可以在执行命令的时候加入标记-a。 此时,不但目标代码包总是会被编译,它依赖的代码包也总会被编译,即使依赖的是标准库中的代码包也是如此。
 另外,如果不但要编译依赖的代码包,还要安装它们的归档文件,那么可以加入标记-i。
那么我们怎么确定哪些代码包被编译了呢?有两种方法。

  1. 运行go build命令时加入标记-x ,这样可以看到go build命令具体都执行了哪些操作。另外也可以加入标记-n ,这样可以只查看具体操作而不执行它们。
  2. 运行go build命令时加入标记-v ,这样可以看到go build命令编译的代码包的名称。它在与-a标记搭配使用时很有用。

go get 命令详解

命令go get会自动从一些主流公用代码仓库(比如 GitHub)下载目标代码包,并把它们安装到环境变量GOPATH包含的第 1 工作区的相应目录中。如果存在环境变量GOBIN,那么仅包含命令源码文件的代码包会被安装到GOBIN指向的那个目录。

命令go get常见的几个命令参数:

  • -u:下载并安装代码包,不论工作区中是否已存在它们。
  • -d:只下载代码包,不安装代码包。
  • -fix:在下载代码包后先运行一个用于根据当前 Go 语言版本修正代码的工具,然后再安装代码包。
  • -t:同时下载测试所需的代码包。
  • -insecure:允许通过非安全的网络协议下载和安装代码包。HTTP 就是这样的协议。

工作区是值: 存放go的源码的目录。
GOPATH是指: 指向工作去的路径。Go语言中设置GOPATH简单来讲就是为了集中组织代码以及代码互相引用。类似与Java中的Maven的作用。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux Shell: 使用 Expect 自动化 SCP 和 SSH 连接的 Shell 脚本详解
  • 【Java】注解与单元测试的使用【主线学习笔记】
  • MySQL高阶1965-丢失信息的雇员
  • Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 新一代垃圾回收器 ZGC 收集器
  • MICS:PythonJail沙箱逃逸(持续更新中)
  • 初识C#(二)- 流程控制
  • 模拟自然的本质:与IBM量子计算研究的问答
  • Redis存储原理
  • 3、等保1.0 与 2.0 的区别
  • Mac强制停止应用
  • 数据结构总结
  • 学习记录:js算法(四十一): 基于时间的键值存储
  • Qt --- 常用控件的介绍 --- 其他控件
  • Vscode Run Code Py中文乱码问题
  • 市面第一款 C++ 版本的U盘装机软件(即将上线)
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 【刷算法】求1+2+3+...+n
  • 2017 前端面试准备 - 收藏集 - 掘金
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Android交互
  • chrome扩展demo1-小时钟
  • echarts的各种常用效果展示
  • Kibana配置logstash,报表一体化
  • Linux各目录及每个目录的详细介绍
  • Promise初体验
  • Protobuf3语言指南
  • Python 基础起步 (十) 什么叫函数?
  • scala基础语法(二)
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 批量截取pdf文件
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 前端之Sass/Scss实战笔记
  • 小试R空间处理新库sf
  • # Redis 入门到精通(七)-- redis 删除策略
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (23)Linux的软硬连接
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (JS基础)String 类型
  • (python)数据结构---字典
  • (补充)IDEA项目结构
  • (二)WCF的Binding模型
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (转)iOS字体
  • (转)Oracle存储过程编写经验和优化措施
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)Sql Server 保留几位小数的两种做法
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .cfg\.dat\.mak(持续补充)
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .Net Core中Quartz的使用方法
  • .NET delegate 委托 、 Event 事件,接口回调
  • .net 怎么循环得到数组里的值_关于js数组