Golang入门程序

486 阅读7分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

前言

在执行GO语言时需要先安装一个SDK

Windows系统只需要下载对应版本的以.msi后缀结尾的文件即可。安装完成后自动加入环境变量,不需要手动配置。

安装过程很简单本文就不在赘述。

安装完成后打开cmd查看是否安装成功

go version

一、第一个GO程序

需求:在控制台输出"Hello World!"

package main	// 声明 main 包

import "fmt"	// 导入 fmt 包,打印字符串时需要用到

func main() {	// 声明 main 主函数
	fmt.Println("Hello World!")	// 打印 Hello World!
}

大家也许不明白这些代码的含义,没关系,下面就来一一介绍。

1.1 package(创建包)

Go语言以“包”作为管理单位,每个 Go 源文件必须先声明它所属的包,所以我们会看到每个 Go 源文件的开头都是一个 package 声明。

格式如下:

package name	//package 是声明包名的关键字,name 为包的名字。

Go语言的包与文件夹是一一对应的,它具有以下几点特性:

  • 一个目录下的同级文件属于同一个包。
  • 包名可以与其目录名不同。
  • main 包是Go语言程序的入口包,一个Go语言程序必须有且仅有一个 main 包。如果一个程序没有 main 包,那么编译时将会出错,无法生成可执行文件。

1.2 import(导入包)

在包声明之后,是 import 语句,用于导入程序中所依赖的包,导入的包名使用双引号""包围,格式如下:

import "name"	// import 是导入包的关键字,name 为所导入包的名字。

上方示例代码中导入了 fmt 包,这行代码会告诉 Go 编译器,我们需要用到 fmt 包中的函数或者变量等,fmt 包是Go语言标准库为我们提供的,用于格式化输入输出的内容(类似于C语言中的 stdio.h 头文件),类似的还有 os 包、io 包等。

另外有一点需要注意,导入的包中不能含有代码中没有使用到的包,否则Go编译器会报编译错误,例如 imported and not used: "xxx","xxx" 表示包名。

也可以使用一个 import 关键字导入多个包,此时需要用括号( )将包的名字包围起来,并且每个包名占用一行,也就是写成下面的样子:

import(
    "name1"
    "name2"
)

代码的第三行创建了一个 main 函数,它是Go语言程序的入口函数,也即程序启动后运行的第一个函数。

main 函数只能声明在 main 包中,不能声明在其他包中,并且,一个 main 包中也必须有且仅有一个 main 函数。

main 函数是自定义函数的一种,在Go语言中,所有函数都以关键字 func 开头的,定义格式如下所示:

func 函数名 (参数列表) (返回值列表){
    函数体
}

格式说明如下:

  • 函数名:由字母、数字、下画线_组成,其中,函数名的第一个字母不能为数字,并且,在同一个包内,函数名称不能重名。
  • 参数列表:一个参数由参数变量和参数类型组成,例如func foo( a int, b string )
  • 返回值列表:可以是返回值类型列表,也可以是参数列表那样变量名与类型的组合,函数有返回值时,必须在函数体中使用 return 语句返回。
  • 函数体:能够被重复调用的代码片段。

注意:Go语言函数的左大括号{必须和函数名称在同一行,否则会报错。

1.3 打印 Hello World

代码fmt.Println("Hello World!")中,Println 是 fmt 包中的一个函数,它用来格式化输出数据,比如字符串、整数、小数等,类似于C语言中的 printf 函数。

这里我们使用 Println 函数来打印字符串,也就是( )里面使用""包裹的部分。

注意,Println 函数打印完成后会自动换行,ln是 line 的缩写。

另外,代码fmt.Println("Hello World!")的结尾,不需要使用;来作为结束符,Go 编译器会自动帮我们添加,当然,在这里加上;也是可以的。

二、编译与运行

Go语言是编译型的静态语言(和C语言一样),所以在运行Go语言程序之前,先要将其编译成二进制的可执行文件。

可以通过Go语言提供的go build或者go run命令对Go语言程序进行编译:

  • go build命令可以将Go语言程序代码编译成二进制的可执行文件,但是需要我们手动运行该二进制文件;

    02.GO语言入门程序02.jpg

  • go run命令则更加方便,它会在编译后直接运行Go语言程序,编译过程中会产生一个临时文件,但不会生成可执行文件,这个特点很适合用来调试程序。

    02.GO语言入门程序03.jpg

2.1 go build命令

go build命令用来启动编译,它可以将Go语言程序与相关依赖编译成一个可执行文件,其语法格式如下。

go build fileName
  • fileName:为所需要的参数,可以是一个或者多个 Go 源文件名(当有多个参数时需要使用空格将两个相邻的参数隔开),也可以省略不写。

使用 go build 命令进行编译时,不同参数的执行结果也是不同的。

(1)当参数不为空时

  • 如果 fileName 为同一 main 包下的所有源文件名(可能有一个或者多个),编译器将生成一个与第一个 fileName 同名的可执行文件(如执行go build abc.go def.go ...会生成一个 abc.exe 文件);
  • 如果 fileName 为非 main 包下的源文件名,编译器将只对该包进行语法检查,不生成可执行文件。

(2)当参数为空时

  • 如果当前目录下存在 main 包,则会生成一个与当前目录名同名的“目录名.exe”可执行文件(如在 hello 目录中执行go build命令时,会生成 hello.exe 文件);
  • 如果不存在 main 包,则只对当前目录下的程序源码进行语法检查,不会生成可执行文件。

附加参数

参数备注
-o指定编译后生成的文件名
-v编译时显示包名
-p n开启并发编译,默认情况下该值为CPU逻辑核数
-a强制重新构建
-n打印编译时会用到的所有命令,但不真正执行
-x打印编译时会用到的所有命令
-race开启竞态检测

2.2 go run 命令

除了使用go build命令外,Go语言还为我们提供了go run命令,go run命令将编译和执行指令合二为一,会在编译之后立即执行Go语言程序,但是不会生成可执行文件。

go run命令的语法格式如下:

go run fileName

其中 fileName 为所需要的参数,参数必须是同一 main 包下的所有源文件名,并且不能为空。

附加参数

参数备注
-a强制编译相关代码,无论编译结果是否是最新的
-n打印编译过程中所需运行的命令,但并不会真正执行它们
-x打印编译过程中所需运行的命令并执行
-p n并行编译,n为并行数量,通常为CPU逻辑核心数量
-v打印被编译的代码包名称
--work打印编译时创建的临时工作目录路径且不删除

三、执行代码

2.1 go build执行

(1)windows系统cmd窗口进入到main.go目录

D:\Go_Codes\base_demo\base01>go build main.go

在当前目录下生成一个main.exe可执行文件。

在windows系统下执行生成main.exe文件,在Linux系统下执行生成main可执行文件,没有.exe后缀。

(2)执行该文件

D:\Go_Codes\base_demo\base01>main.exe
Hello World!

注意:在执行main.exe时前面不需要加./,否则会报错。

2.2 go run执行

D:\Go_Codes\base_demo\base01>go run main.go
Hello World!

没有生成可执行文件main.exe,直接输出结果。