本文是「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”。是的,就是那个傻傻的土拨鼠_



第二步:根据操作系统下载对应的软件包进行安装。

Golang对主流的操作系统都有支持,比如Windows,MacOS和Linux等。

本系列教程中,我会使用MacOS操作系统,所以选择下载“Apple macOS”。大家要根据自己的操作系统进行下载。



第三步:安装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语言的语法部分(基本数据类型,判断,循环等)了。咋们下期见。

本文由 www.vangoleo.com 发布

Go语言Hello world(GOPATH和Go Module版)的更多相关文章

  1. 《程序设计语言——实践之路(英文第三版)》【PDF】下载

    <程序设计语言--实践之路(英文第三版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382234 内容简介 <程序设计语 ...

  2. C语言与数据库操作入门(Win版)

    C语言与数据库操作入门(Win版) 2017年12月10日 17:30:17 阅读数:1387 数据库,DataBase,学C语言的是不是想说,很想爱她却并不容易呢?不用着急,C语言也可以操作数据库的 ...

  3. 数据结构与算法分析:C语言描述(原书第2版 简体中文版!!!) PDF+源代码+习题答案

    转自:http://www.linuxidc.com/Linux/2014-04/99735.htm 数据结构与算法分析:C语言描述(原书第2版中文版!!!) PDF+源代码+习题答案 数据结构与算法 ...

  4. C语言学习推荐《C语言参考手册(原书第5版)》下载

  5. go语言-工作区和gopath

    工作区是放置Go源码文件的目录;一般情况下,Go源码文件都需要存放到工作区中;但是对于命令源码文件来说,这不是必须的. 每一个工作区的结构都类似下图所示:/home/hypermind/golib: ...

  6. go 语言开发中 GOPATH问题 与 go语言linux 开发环境 教程

    https://github.com/rubyhan1314/Golang-100-Days/blob/master/Day01-15(Go%E8%AF%AD%E8%A8%80%E5%9F%BA%E7 ...

  7. IntelliJ IDEA for Mac(Java 语言开发的集成环境)破解版安装

    1.软件简介    IntelliJ IDEA 是 macOS 系统上一款 java 语言开发的集成环境,IntelliJ 在业界被公认为最好的 java 开发工具之一,尤其在智能代码助手.代码自动提 ...

  8. C语言--第1次作业2.0版

    1.本章学习总结 1.1思维导图 1.2本章学习体会及代码量学习体会 1.2.1学习体会 经过一周C语言的正式课堂学习,不同于暑期时扒视频囫囵吞枣式学习,林丽老师的讲解详细异常,尽管已经学习了一部分内 ...

  9. c语言程序设计案例教程(第2版)笔记(四)—指针、分配存储空间、文件

    零散知识点: 指针类型:每个变量占用的首单元地址称为这个变量的存储地址. “&”为“取地址运算符”.格式:&  变量名.功能:返回指定变量的存储地址. “*”为“取内容运算”.格式:* ...

随机推荐

  1. 算法学习之剑指offer(十二)

    一 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩 ...

  2. 怎么将ETL技术落地

    ETL概述 ETL(Extraction-Transformation-Loading)是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程,目的是将企业中的分散.零乱.标准不统一的数据整合到 ...

  3. 让你如“老”绅士般编写 Python 命令行工具的开源项目:docopt

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  4. msf之hash攻击

    使用hashdump抓取密码(需要系统管理权限) 另外一个更强大的模块 smart_hashdump 如果目标是win7 就需要先绕过UAC 还可以使用msf内置的mimikatz抓取hash msv ...

  5. #10056. 「一本通 2.3 练习 5」The XOR-longest Path

    题目描述 有一棵带权树,求这些边组成的路径的最大异或和. Solution 考场 SPFA 神奇 70 分代码 #include<cstdio> #include<cstdlib&g ...

  6. std::is_same

    两个一样的类型会返回true bool isInt = std::is_same<int, int>::value; //为true std::cout << std::is_ ...

  7. 惊人!Spring5 AOP 默认使用Cglib ?从现象到源码深度分析

    Spring5 AOP 默认使用 Cglib 了?我第一次听到这个说法是在一个微信群里: 真的假的?查阅文档 刚看到这个说法的时候,我是保持怀疑态度的. 大家都知道 Spring5 之前的版本 AOP ...

  8. 【Go】高效截取字符串的一些思考

    原文链接:https://blog.thinkeridea.com/201910/go/efficient_string_truncation.html 最近我在 Go Forum 中发现了 [SOL ...

  9. 现在Java 桌面应用程序能做到什么程度(Spring Boot+JavaFX2开发)

    Spring Boot - JavaFX 2.0应用 很多人对Java开发native程序第一反应还停留在暗灰色单一风格的Java GUI界面,开发方式还停留在AWT或者Swing.本文主要基于Spr ...

  10. SpringBoot2.X整合Actuator

    一 说明 Actuator 的定义 actuator 是一个制造术语,指的是用于移动或控制某物的机械装置.执行器可以通过一个小的变化产生大量的运动. 要将 actuator 添加到基于 Maven 的 ...