Go语言Hello world(GOPATH和Go Module版)

本文是「vangoleo的Go语言学习笔记」系列文章之一。
官网: http://www.vangoleo.com/go/go-hello-world-02/

往期回顾:

上一篇文章Go语言入门:Hello world中,我们在Golang Playground中体验了Go语言,编写并运行了一个简单的Hello World,相信大家对Go语言的语法有了一些了解。

学习一种编程语言,除了基本的语法,更重要的是要了解如何在实际的工程中使用它。本文中,我会和大家一起,从零开始,安装Go语言,配置环境,安装IDE,开发一个Hello World程序。这个Hello World版我会编写两个版本:GOPATH和Go Module版本。

Q:
本教程为什么会编写两个版本?
A:
网上大部分Go语言Hello World都只简单地介绍了GOPATH版本。但是从Go的1.11版本之后,已不再推荐使用GOPATH来构建应用了。也就是说GOPATH被认为是废弃的,错误的做法。
正确的做法是使用Go Module。所以,有必要在教程中将这个信息告诉初学者,引导大家使用推荐的最佳实践方式Go Module。
或许这也是本Hello World教程和网上大部分教程的区别吧。会从开发者的实际使用出发。介绍Go语言的发展历史和最佳实践。

安装Go

使用Go语言开发,第一步肯定是安装Go啦。

第一步:进入Go语言的官网https://golang.org。点击”Download Go”。是的,就是那个傻傻的土拨鼠_

Go语言Hello world(GOPATH和Go Module版)
第二步:根据操作系统下载对应的软件包进行安装。
Golang对主流的操作系统都有支持,比如Windows,MacOS和Linux等。
本系列教程中,我会使用MacOS操作系统,所以选择下载”Apple macOS”。大家要根据自己的操作系统进行下载。
Go语言Hello world(GOPATH和Go Module版)
第三步:安装Go。
在MacOS下安装Go很简单,就是标准的DMG文件安装,直接”下一步”就可以了。
第四步:确认Go是否安装成功。
运行命令”go version”,会输出类似于”go version go1.12.9 darwin/amd64″的内容。请确保包没有任何错误发生。

配置环境

和其他开发语言类似,安装了Go之后,还需要对开发环境进行相应的配置。比如在Java中,需要配置JAVA_HOME,MAVEN等。
Go开发相关的环境变量如下:

  • GOROOT:GOROOT就是Go的安装目录。
  • GOPATH:GOPATH保存go项目代码。

GOROOT

GOROOT是Go的安装路径。Mac中安装Go会自动配置好GOROOT,路径为 /usr/local/go。GOROOT在绝大多数情况下都不需要修改。以下是GOROOT目录的内容(已省略了一些无关信息):

tree -L 2 /usr/local/go

./
├── bin
│   ├── go
│   └── gofmt
├── doc
│   ├── articles
│   └── docs.html
├── src
│   ├── errors
│   ├── fmt
│   ├── log
│   └── os

可以看到GOROOT下有bin,doc和src目录。bin目录下有我们熟悉的go和gofmt工具。可以认为GOOROOT和Java里的JDK目录类似。

GOPATH

GOPATH是开发时的工作目录。用于:

  • 保存编译后的二进制文件。
  • go getgo install命令会下载go代码到GOPATH。
  • import包时的搜索路径。

关于GOPATH需要特别注意。在GO的1.11版本之前,GOPATH是必需的,且所有的Go项目代码都要保存在GOPATH目录下。Go的1.11版本之后,GO官方引入了Go Module。使用Go Module管理的项目可以放在GOPATH目录外面。

使用GOPATH时,GO会在以下目录中搜索包:

  1. GOROOT/src:该目录保存了Go标准库代码。
  2. GOPATH/src:该目录保存了应用自身的代码和第三方依赖的代码。

假设程序中引入了如下的包:

import "github.com/tom/hello-go/foo/bar"

第一步:Go会先去GOROOT的scr目录中查找,很显然它不是标准库的包,没找到。
第二步:继续在GOPATH的src目录去找,准确说是 GOPATH/src/github.com/tom/hello-go/foo/bar这个目录。如果该目录不存在,会报错找不到package。在使用GOPATH管理项目时,需要按照GO寻找package的规范来合理地保存和组织Go代码。

Go的这个”将所有代码都放置在GOPATH中”的设计,的确是和其他主流语言很不一样。不管Go官方是出于什么考虑,这个设计在实际使用中,的确给开发者造成了很大的不便和理解上的困难。甚至直接劝退了很多Go的初学者。
万幸的是,Go Module正式发布了。Go Module的发布解决了困扰Go语言长达十年的代码组织,依赖管理问题。

说明:关于GOPATH和Go Module的历史渊源,详细使用,会在另一篇进行说明。本文还是聚焦在Hello World入门。

另外,由于某些原因,Go的某些托管在Google仓库中的代码在国内是无法访问的。如果使用Go Module,我们可以设置GOPROXY,让Go从GOPROXY下载Go代码,速度更快。国内用户可以设置GOPROXY为https://goproxy.cn,使用如下命令来设置GOPROXY:

export GOPROXY=https://goproxy.cn

关于环境配置,总结下来就是:

  • 如果使用Go Module(推荐的),设置export GOPROXY=https://goproxy.cn。
  • 如果使用GOPATH(遗留的,被废弃的),需要设置GOPATH到本地的某个目录。

安装IDE

目前比较常用的IDE有:

  • Visual Studio Code
  • GoLand

Visual Studio Code是微软开发的一款开源的,轻量级的文本编辑器。通过安装Go插件,可以用于Go语言的开发。GoLand是JetBrains公司开发的,专业的Go语言开发IDE。

推荐使用GoLand。很多人都说Visual Studio Code更轻量级,但作为一款每天都要重度使用的,需要靠它吃饭的工具,我们需要的是功能全面。尤其是当你需要完备的调试,需要强大的IDE智能辅助功能时,相信你会选择更专业的GoLand。

GoLand的官方主页为https://www.jetbrains.com/go/,点击”Download”即可下载

注意
GoLand使用的是和IntelliJ IDEA一样的框架,是用Java语言开发的。你需要安装Java环境才可以运行GoLand哦。
GoLand是收费软件,只有30天的试用期。试用期结束后,需要购买授权。当然在天朝,我们都习惯不花钱用软件。大家可以自行百度或google搜索一下。

Hello World(GOPATH版)

第一步:设置GOPATH
首先设置GOPATH,假设GOPATH设置为 $HOME/worspace/go
第二步:创建子目录
进入 $HOME/workspace/go目录。新建子目录src。然后再src中新建子目录hello。在hello目录,新建一个hello-world.go文件:
目录结构应该如下所示:

$HOME
  workspace
    go
      src
        hello
          hello-world.go

第三步:创建hello-world.go文件:

package main
import "fmt"
func main() {
    fmt.Println("hello world")
}

第四步:执行go build
$HOME/workspace/go目录执行命令:

go build

会生成一个可执行二进制文件:hello。如果是Windows系统,会生成hello.exe文件。
第五步:运行hello文件:

./hello

hello world

输出”hello world”。

Hello World(GO Module版)

第一步:创建项目的根目录
任意创建一个目录(可以不在GOPATH中),假设是$HOME/tmp/hello。
第二步:初始化Go模块
执行命令:

go mod init github.com/vangoleo/hello

该命令会将hello目录初始化为一个Go module,并生成一个 $HOME/tmp/hello/go.mod文件。内容如下:

module github.com/vangoleo/hello

go 1.12

第三步:编写hello.go文件
编写文件 $HOME/tmp/hello/hello.go:

package main

import (
    "fmt"
    "rsc.io/quote"
)

func main() {
    fmt.Println(quote.Hello())
}

第四步:编辑go.mod文件:
在实际项目中,都会使用到第三方库。可以在Go Module中添加项目的依赖。本例中,我们会添加一个quote依赖,该依赖会打印当前语言的”Hello World”,比如,如果是中文环境,会打印”你好,世界”。
编辑go.mod文件,添加quote依赖:

module github.com/vangoleo/hello

go 1.12

require rsc.io/quote v1.5.2

第五步:执行go build
执行go build,会生成可执行文件 $HOME/tmp/hello/hello
第六步:执行hello文件
执行hello文件,输出”你好,世界”。

最后

本文中,我们从下载安装,配置Go环境开始,并完成了GOPATH和Go Module两个版本的Hello World应用。如果你跟着我一步一步完成了这些步骤,恭喜你!!!已经完成了第一个真正的Go应用,并且使用了正确的Go Module来管理Go程序。

接下来,我们可以开始学习Go语言的语法部分(基本数据类型,判断,循环等)了。咋们下期见。

Go语言Hello world(GOPATH和Go Module版)

本文由 www.vangoleo.com 发布

Original: https://www.cnblogs.com/leiwei/p/11886486.html
Author: Leo_Lei
Title: Go语言Hello world(GOPATH和Go Module版)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/584361/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 算法竞赛进阶指南 0x21 树与图的遍历

    这算是总结性的文章,比较简略,不太适合初学者 深度优先搜索 //所有的有向边经过一次(无向边经过两次) void dfs(int x) { v[x] = true; for(int…

    数据结构和算法 2023年6月12日
    0105
  • 机器学习—神经网络

    BP神经网络的综述 1.1神经网络的定义 神经网络(neural network) 是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所做…

    数据结构和算法 2023年6月8日
    0131
  • Java 线程常用操作

    继Java线程生命周期继续学习Java线程其他常用操作 线程的常用操作 设置线程名字:setName() 获取线程名称:getName() 线程唯一Id:getId() // 自定…

    数据结构和算法 2023年6月16日
    081
  • linux多路转接select—服务器代码

    一、linux多路转接select—服务器代码 #include #include #include #include<string.h> #include…

    数据结构和算法 2023年6月8日
    094
  • java中的log

    slf4j的全称是: Simple Logging Facade for Java (SLF4J)。 SLF4J不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法…

    数据结构和算法 2023年6月7日
    093
  • MOOC高级语言程序设计第五章课后作业

    题目描述 找出一个二维数组(以三行四列的数组为例)中的鞍点,即该位置上的元素在该行上值最大,在该列上值最小(也可能没有鞍点) 标准输入:二维数组(以三行四列的数组为例)9 80 2…

    数据结构和算法 2023年6月16日
    0107
  • 主席树(区间第k小的数)

    题目链接: https://www.luogu.org/problem/P3834 首先要离散化,然后主席树模板。 1 #include 2 #include 3 #include…

    数据结构和算法 2023年6月7日
    071
  • java多线程之自定义线程池

    1.背景 线程池…..大家常用…. 自己搞一个,顺便练习一下多线程编程 2.自定义线程代码 2.1.拒绝策略接口 @FunctionalInterface …

    数据结构和算法 2023年6月12日
    074
  • 排序算法二

    讲两种nlogn时间复杂度的排序算法,一个归并排序,一个快速排序。这两种算法都采用了分治的思想,将大问题转换为很多个小问题来处理,所以实现上一般采用递归的编程技巧。 归并排序的处理…

    数据结构和算法 2023年6月16日
    0109
  • redis/nginx/memcached等网络编程模型

    说到网络编程,就要把下面四个方面处理好。 第一是网络连接,来自客户端的连接,监听accept有收到EPOLLIN事件,或者当前服务器连接上游服务器,进行connect时返回-1,e…

    数据结构和算法 2023年6月16日
    082
  • SPOJ QTREE-Query on a tree

    简要题意 给出一个 (n) 个节点的树,树边上有权值,支持以下操作: CHANGE i ti 将(i) 号边(即,第(i) 个输入的边)的权赋值为(t_i)。 QUERY a b …

    数据结构和算法 2023年6月12日
    081
  • MySQL建表语句生成Golang代码

    1. 背景 对于后台开发新的需求时,一般会先进行各种表的设计,写各个表的建表语句 然后根据建立的表,写对应的model代码、基础的增删改查代码(基础的增删改查服务可以划入DAO(D…

    数据结构和算法 2023年6月8日
    078
  • leecode每日刷题2

    leecode每日刷题2 leecode每日刷题2 题目描述 移动零 &#x7ED9;&#x5B9A;&#x4E00;&#x4E2A;&#x…

    数据结构和算法 2023年6月7日
    089
  • 图论学习笔记·$Floyd$ $Warshall$

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据结构和算法 2023年6月8日
    089
  • 网课期间 の 总结

    7.19 T1 又是空间问题(养成看空间限制的习惯啊!!!),那个一前一后看成二元组也挺巧妙的。 T3: 有个 坐标旋转 的优化,感觉很妙诶,这样就可以避免一些特殊的数据点。 一个…

    数据结构和算法 2023年6月7日
    080
  • 数据结构笔记汇总

    1.逻辑结构:线性和非线性 线性:线性(1:1)、栈、队、数组 非线性:树形(1:多)、图形(多:多) 存储结构:顺序(数组)、链式(指针) 2.逻辑结构与元素相对位置无关 链式存…

    数据结构和算法 2023年6月12日
    092
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球