Hello Go,认识 Go 程序

第一个 Hello Go 程序

我们的第一个 Go 语言程序。

Go 项目目录

创建一个目录,用于管理我们全部的 Go 示例源代码,例如: d:\projects\go

并在其中创建 src 源文件目录,存储全部的源文件,go/src

创建 Go 源码文件

在项目原文件目录创建文件 src/hello-go.go,建议使用编辑器创建。

编写代码

代码内容如下:hello-go.go

//定义包
package main
//导入包
import "fmt"
//定义 main 函数
func main() {
  //定义变量,字符串类型
  var name string
  //在终端输出
  fmt.Println("请输入你的名字:")
  //接收用户输入
  fmt.Scanln(&name)
  //输出
  fmt.Println("Hello ", name)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

代码编写完毕,准备运行!

运行Go程序

概述

Go 语言是编译型语言,需要编译后再执行。典型的编译运行方式为使用 run 和 build 命令。

  • go run,编译,不形成可执行性文件,执行。主要用于测试阶段。
  • go build,编译,形成可执行性文件,运行可执行性文件。用于生产发布阶段。

go run,运行

使用 shell 工具(windows 中使用的是 powershell),进入项目目录,运行:

> go run .\src\hello-go.go
请输入你的名字:
Hank
Hello  Hank
1
2
3
4

当我们输入了 RebBullMooc 后,程序输出了:Hello RedBullMooc。

go build,构建

进入项目目录,运行:

> go build .\src\hello-go.go
1

此时,会在项目源码目录形成文件 hello-go.exe 可执行性文件。执行该可执行性文件:

> .\src\hello-go.exe
请输入你的名字:
Hank
Hello  Hank
1
2
3
4

效果与 go run 一致。

生成的 hello-go.exe 可以快速反复执行,在生产阶段使用可执行性文件。

至此,我们的第一个 Go 应用程序就编写运行成功了。一个好的开始,让我们进入 Go 语言的世界......

语法要素

源代码和源文件

  • 源代码:source code,也称源程序),是指一系列计算机语言指令集合。
  • 源文件:source file,源代码的载体。

hello-go 的例子中,文件 hello-go.go 就是源文件,内部的 Go 代码就是源代码。

语句和语句块

语句,statement,是构成源程序的基本要素。多条语句在一起构成了语句块,通常使用大括号包裹。

语句通常具有结束符分号(;)。但在 Go 语言中,建议每条语句独立成行,并省略语句结束符。若语句过长,可以在运算符后折行编写。

建议的源代码格式:

func main() {
  var name string
  fmt.Println("请输入你的名字:")
  fmt.Scanln(&name)
  fmt.Println("Hello ", 
              name)
}
1
2
3
4
5
6
7

若多条语句在一行,则必须使用语句结束符。

省略语句结束符分号的实现,是基于 Go 语言编译器会把特定符号后的换行符转换为分号来实现的。这里说的特定符号包括:

  • 关键字 breakcontinuefallthroughreturn
  • 运算符和分隔符 ++--)]}
  • 标识符、整数、浮点数、虚数、字符、字符串

因此,上面的列子中:

fmt.Println("Hello ", 
              name)
1
2

可以在逗号后另起一行,因为逗号后的换行符不会被替换为分号。

而:

func main() {	
1

中,main() 后的左大括号不能另起一行,以为若以 ) 结尾,则会被替换为分号,就变成了:

func main();
{	
1
2

这样,就出现了语法错误。因此在 Go 语言中,语句块左大括号应该与函数定义在一行(也包括 ifswitchfor 语句块)。

标识符

标识符,identifier,是用来标识某个实体的符号,也就是给变量、常量、函数、包、类型等其的名字。

标识符遵循如下的命名规则:

  • 以字母(Unicode字母)或下划线开头。
  • 后面跟任意数量的字母、数字或下划线。
  • 大小写字母敏感。
  • 不能使用 Go 语言关键字。
  • 不建议使用 Go 语言预定义标识符。
  • 推荐使用简洁、清晰的命名。
  • 推荐使用驼峰式命名,例如 helloWorld。
  • 推荐保持缩写词大写,例如 escapeHTML。

关键字列表如下,共 25 个:

关键字
break case chan const continue
default defer else fallthrough for
func go goto if import
interface map package range return
select struct switch type var

预定义的标识符列表如下,有预定义常量、类型、函数:

预定义常量
true false iota nil
预定义类型
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
float32 float64
complex128 complex64
bool byte rune string error
预定义函数
make new append copy close delete
len cap
complex real image
panic recover

注意,预先定义的标识符并不是关键字,理论上可以重新使用。但为了避免引起语义混乱,我们强烈推荐避开这些预定义的标识符。

标识符的作用域限制,在某个语句块内定义就仅在该语句块内有效,例如语句或函数中定义的标识符,仅仅在该语句或函数内有效。若在函数外定义,则标识符在包内有效。

标识符的可见性限制,基于标识符首字母大小写区分。包中首字母大写的标识符可以被导出,反之首字母小写的标识符不会被导出。

操作符

操作符,oprerator,用于实现特定语句的符号。

Go 语言中支持如下操作符:

操作符
算术 + - * / % ++ --
关系 > < == >= <= !=
逻辑 && || !
& | ^ &^ << >>
指针 * &
赋值 = += -= *= /= %= <<=
>>= &= ^= |= &^=
剩余|展开 ...
成员访问 . :
元素访问 [] :
函数 () {}
信道 <-

字面量

字面量,literal,用于源代码中一个固定值的表示方法。例如:整数、浮点数和字符串,部分展示为:

  • 42
  • 3.14,3.14E2
  • "Hank"
  • [2]int{42, 1024}
  • []int{42, 1024}

Go 语言中的几乎每种类型都有对应的字面量语法。

注释

注释,annotation,就是对代码的解释和说明,其目的是让程序开发者能够更加轻松地了解代码。

Go 语言支持两种注释风格:

  • 行注释,// 注释内容
  • 块注释,/* 注释内容 */

包,package,Go 语言的源代码通过包组织管理,类似于其它语言的命名空间或模块。

一个包由位于单个目录下的一个或多个 .go 源代码文件组成, 目录定义包的作用域。每个 .go 源文件都以一条 package 声明语句开始。

若程序需要其他包,需要使用 import 进行导入。

main 包比较特殊,是程序的入口包。它用于定义一个独立可执行的程序,而不是一个具体的功能模块。

main.main() 函数

和 C 语言一致,在 main 包里的 main 是整个程序执行时的入口。main 函数的运行周期,就是整个程序的运行周期。

gofmt(go fmt) Go 源码格式化工具