第一个 Go 程序"hello,world" 与 main 函数
文章目录
- 第一个 Go 程序"hello,world" 与 main 函数
- 一.创建“hello,world”示例程序
- 二. “hello,world” 程序结构拆解
- 三、main 函数
- 四、Go 语言中程序是怎么编译的?
一.创建“hello,world”示例程序
创建一个叫做 main
的 go
文件。
mkdir syntax/helloworld // 创建存储helloworld示例的文件夹
啰嗦一下 Go 的命名规则。Go 源文件总是用全小写字母形式的短小单词命名,并且以.go 扩展名结尾。以下是Go文件命名规则的主要要点:
- 使用小写字母:Go文件名应该使用小写字母,不推荐使用大写字母或驼峰命名法。这是因为Go的命名约定中,使用大写字母开头的标识符是公有的,而使用小写字母开头的标识符是私有的。
- 下划线不推荐:虽然Go允许在文件名中使用下划线字符(
_
),但不推荐在文件名中使用下划线。通常,Go文件名应该是简单的单词,以描述文件内容或包功能为主。 - 使用有意义的文件名:文件名应该能够清晰地表达文件的用途和内容。这有助于提高代码的可读性和维护性。
- 避免特殊字符和空格:文件名中不应包含特殊字符、空格或其他不允许的字符。
- 避免关键字:文件名不应与Go的关键字(例如
if
、else
、for
等)冲突。
如果要在源文件的名字中使用多个单词,我们通常直接是将多个单词连接起来作为源文件名,而不是使用其他分隔符,比如下划线。也就是说,我们通常使用 helloworld.go 作为文件名而不是 hello_world.go。
因为下划线这种分隔符,在 Go 源文件命名中有特殊作用,在Go语言中使用下划线作为源文件命名的分隔符,主要是为了进行包范围控制,避免命名冲突。
这里我们创建一个名为 main.go 的源文件
touch syntax/helloworld/main.go
打开刚刚创建的 main.go 文件,键入下面这些代码:
package mainimport "fmt"func main() {fmt.Println("hello, world")
}
写完后,我们保存文件并回到终端窗口,然后在 Linux 或 macOS 系统中,你就可以通过输入下面这个命令来编译和运行这个文件了:
go build main.go
./main
如果是在 Windows 系统中呢,你需要把上面命令中的./main
替换为.\main.exe
。
go build main.go
main.exe
输出结果如下:
二. “hello,world” 程序结构拆解
首先,第一个值得注意的部分是这个:
package main
这行代码定义了 Go 中的一个包 package
。包是 Go
语言的基本组成单元,通常使用单个的小写单词命名,一个 Go 程序本质上就是一组包的集合。所有 Go 代码都有自己隶属的包,在这里我们的“hello,world”示例的所有代码都在一个名为 main 的包中。main 包在 Go 中是一个特殊的包,整个 Go 程序中仅允许存在一个名为 main 的包。
**主程序函数:**main 包中的主要代码是 main 函数:
func main() {fmt.Println("hello, world")
}
main入口:
- 这里的 main 函数就是当你运行一个可执行的 Go 程序的时候,所有的代码都会从这个入口函数开始运行。
- 这段代码的第一行声明了一个名为 main 的、没有任何参数和返回值的函数。如果你需要给函数声明参数的话,那么就必须把它们放置在圆括号 () 中。
导入包
import "fmt"
在 main 函数体中,通过 fmt 这个限定标识符(Qualified Identifier)调用 Println 函数。虽然两处都使用了“fmt”这个字面值,但在这两处“fmt”字面值所代表的含义却是不一样的:
- import “fmt” 一行中“fmt”代表的是包的导入路径(Import),它表示的是标准库下的 fmt 目录,整个 import 声明语句的含义是导入标准库 fmt 目录下的包;
- fmt.Println 函数调用一行中的“fmt”代表的则是包名。
通常导入路径的最后一个分段名与包名是相同的,这里很容易让人误解 import 声明语句中的“fmt”指的是包名,其实并不是这样的,只有 fmt.Println 函数调用一行中的“fmt”代表的则是包名。
main 函数体中之所以可以调用 fmt 包的 Println 函数,还有最后一个原因,那就是 Println 函数名的首字母是大写的。在 Go 语言中,只有首字母为大写的标识符才是导出的(Exported),才能对包外的代码可见;如果首字母是小写的,那么就说明这个标识符仅限于在声明它的包内可见。
三、main 函数
- Go语言程序的默认入口函数(主函数):
func main()
- main函数只能用于main包中,且只能定义一个。
四、Go 语言中程序是怎么编译的?
刚刚我在运行"hello, world"程序之前,输入了 go build 命令,还有它附带的源文件名参数来编译它:
$go build main.go
打开终端,可以通过输入下面这个 ls 命令看到刚刚生成的可执行文件:
$ls
main main.go
和python 等其他语言不通的是,最终将mian
运行在没有安装 Go 的环境中。如果是python 项目的话还需要安装python解释器和项目依赖等。
Go 是一种编译型语言,这意味着只有你编译完 Go 程序之后,才可以将生成的可执行文件交付于其他人吗,Go程序的编译过程可以总结为以下几个关键步骤:
- 词法与语法分析:编译器首先解析源代码文件 , 将代码转换成Token序列 , 然后按照语言定义的文法规则生成抽象语法树(AST) 。
- 类型检查:编译器对AST进行类型检查 , 验证变量 、 常量 、 函数等的类型正确性 , 同时对一些内置函数进行展开和处理 。
- 中间代码生成:经过类型检查后 , 编译器将AST转换成中间代码 , 使用了SSA(Static Single Assignment Form)特性 , 有助于代码优化 。
- 机器码生成:最后 , 编译器根据目标机器的架构(如amd64 、 arm 、 x86等)生成相应的机器码 , 使程序可以在不同的硬件上运行 。
具体请参考链接:Go程序是如何编译运行的