GO语言第一个程序Hello world

编写一个hello world程序, 并可以运行它

工作目录

go语言有2种工程结构:

  • GOPATH工程结构
  • GO MODULE工程结构

我们这里先讲解GOPATH工程结构, 等后面引入包的概念后再开始使用GO MODULE工程结构, 而Go1.16默认使用的GO MODULE工程结构, 因此我们需要修改下设置

go env -w GO111MODULE=auto

工作目录是一个工程开发的相对参考目录, GOPATH工程结构中的工作目录就是GOPATH变量指向的目录 我们可以通过GOPATH这个变量查看当前设置的工作目录

go env GOPATH // 通过go env 可以查看go语言设置相关的所有变量

/Users/ligz01/Documents/goProjects // 这是我的工作目录

Go语言规定了工作目录($GOPATH )的目录结构:

  • src 存放源代码(比如:.go .c .h .s等)
  • pkg 编译后生成的静态库(比如:.a), 多个静态库文件通过连接器连接 最终构成我们要得目标文件
  • bin 编译后生成的可执行文件(为了方便,可以把此目录加入到 PATH变量中,如果有多个gopath,那么使用{GOPATH//://bin:}/bin添加所有的bin目录)

如果你的这3个目录不存在请提前创建

mkdir bin pkg src

编写程序

使用vscode打开你的工作目录

我们在src下编写我们的第一个Go程序: hello.go

package main

import "fmt"

func main() {
        fmt.Println("hello world, this is my first golang program!")
}

解读:

  • package: Go源文件开头必须使用 package 声明代码所属包,包是 Go 代码分发的最基本单位。若程序需要运行包名必须为 main。
  • import: 用于导入程序依赖的所有的包。此程序依赖于 fmt 包。
  • func: 用于定义函数。main 函数是程序的入口,若程序需要运行必须声明 main 函数,main 函数无参数也无返回值
  • fmt.Println 调用 fmt.Println 函数将参数信息打印到控制台

运行程序

快速运行

go run src/day1/hello.go

hello world, this is my first golang program!

go run:用于直接运行程序, 编译和运行一个Go的main包

编译运行

go build -o day1/hello day1/hello.go   // 编译hello.go, 输出二进制目标文件hello
./day1/hello     // 运行编译好的hello
hello world, this is my first golang program!  // 输出的内容

go build: 用于编译&链接程序或包
常用参数说明:

  • -x: 打印编译过程执行的命令,并完成编译或运行
  • -n: 只打印编译过程执行命令
  • -work:打印编译过程的临时目录
  • -o: 指定编译结果文件

扩展知识

go env

我们可以通过go env 打印当前Go运行的所有环境变量配置

# go env // 执行命令
GO111MODULE="auto"
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/ligz01/Library/Caches/go-build"
GOENV="/Users/ligz01/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/ligz01/Documents/goProjects/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/ligz01/Documents/goProjects"
GOPRIVATE=""
GOPROXY="https://goproxy.io"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GOVCS=""
GOVERSION="go1.16.4"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/Users/ligz01/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -arch x86_64 -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/b2/tj_h9hcj78l8j9x61l1d9ps80000gn/T/go-build2916647555=/tmp/go-build -gno-record-gcc-switches -fno-common"#

读取环境变量的值: go env <ENV_NAME>

go env GO111MODULE

设置环境变量的值: go env -w <ENV_NAME>=<ENV_VALUE>

go env -w GO111MODULE=auto
# 共三种参数
auto  # GOPATH 或 GO model 2中方法自动选择 但是我的环境下 不使用module时就报错 错误是说在GOROOT下未找到,目前还不知道什么原因导致的

go tool

go tool 是一组工具集, 支持很多子命令:

go tool # 命令
addr2line
api
asm
buildid
cgo
compile   // 编译源代码, 生成静态库或者目标文件
cover
dist
doc
fix
go_bootstrap
link     // 链接目标文件和目标文件依赖的静态库 生成最终的可执行二进制文件
nm
objdump
pack
pprof
test2json
trace   
vet

我们使用go tool 提供的 compile 和 link 来手动编译一个程序, 这有助于你更好的理解编译的过程

  1. 首先我们需要写一个这样一个样例程序
    我们在day1下面创建一个compile目录, 用于存放我们这次演示的项目代码

mkdir day1/compile

然后我们先编写pkg包: day1/compile/pkg/demo.go

package pkg

import "fmt"

func Demo() {
        fmt.Println("This is demo for go install")
}

接下来我们需要编写我们的mian包(程序入口): day1/compile/main.go

package main

import "day1/compile/pkg"

func main() {
        pkg.Demo()
}
  1. 编译并安装我们的pkg包

go env -w GO111MODULE=auto // 为了让go install 命令能正常生成静态库到pkg目录下, 我们首先需要关闭go mod auto时我这里失败了 改成off 就没问题
go install day1/compile/pkg // 使用go install 安装依赖包, 安装过后静态库会放置到GOPATH下的pkg/<platform>下

  1. 编译main.go

cd /day1/compile // 切换到compile目录下 进行编译与链接
go tool compile -I ~/Documents/goProjects/pkg/darwin_amd64 // 编译原文件, 指定静态库搜索目录

  1. 链接main.o

go tool link -o main -L ~/Documents/goProjects/pkg/darwin_amd64 main.o // 将目标文件和静态库链接成一个二进制可执行文件

  1. 运行我们连接生成的二进制可执行文件

./main

go get 与 go install

go get 用于拉去外部依赖的包或者工具, 如果是Mod项目, 并将依赖添加至 go.mod中

go get 相当于执行了如下命令:

  1. git clone <PKG_PATH>
  2. cd /<PKG_PATH> && go install

关键参数: -d: 只拉去源码, 不执行 go install <在未来的版本中 该选项默认开启>
外部依赖的包的源码会放置到GOPATH的src下面, 而可执行文件将会编译安装到GOPATH的bin下面
我们之前在安装vscode go的扩展工具时安装了gopls

go get -v golang.org/x/tools/gopls

go install 用于编译和安装二进制文件

  1. 如果有main包, 将直接build, 将build好的二进制文件放到GOPATH的bin目录下
  2. 如果不是main包, 将编译静态库, 放到GOPATH/pkg/目录下面

在Go Module模式下

go clean

这个命令是用来移除当前源码包和关联源码包里面编译生成的文件

ls ~/Documents/goProjects/pkg/windows_amd64/demo
go clean -i -n

go fmt

代码格式化

go vet

语法静态检查

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容