在学习任何新的编程语言时,编写一个 “Hello, World” 程序通常是最初的入门步骤。这不仅是一个传统,也是一种快速了解语言基本语法和运行机制的有效方法。对于 Go 语言,这个过程不仅可以帮助新手快速入门,还提供了一个窗口,通过它可以深入了解 Go 的一些核心概念,如包管理、函数声明、以及其他语言结构。

本文旨在通过实现一个简单的 “Hello, World” 程序,展示如何使用 Go 语言。我们不仅会逐行分析代码,还会探讨 Go 的编译和执行流程,以及如何使用标准库中的功能。通过这种方式,我们可以清楚地看到 Go 程序的基本构成,以及它为什么能够在软件开发中提供高效率和高性能。



1、Hello World

程序员这个职业虽然历史不长,但它继承了一项悠久的编程传统:几乎每种编程语言的学习都从一个名为"hello, world"的示例程序开始。这一传统始于 20 世纪 70 年代,由布莱恩·科尼根(Brian W. Kernighan)和 C 语言之父丹尼斯·里奇(Dennis M. Ritchie)合著的著名书籍《C 程序设计语言》。

接下来,我们将遵循这一传统,使用 Go 语言编写一个打印"hello, world"的示例程序,开启我们的 Go 编程之旅。希望通过这个示例,你能对 Go 程序的结构有一个直观且清晰的理解。在正式开始之前,请注意,对于开发 Go 程序所使用的编辑器工具,我们没有任何具体的要求。

1.1、创建示例程序文件夹

在 Go 语言中编写一个打印"hello, world"的程序是一个简单且经典的入门练习,整个过程只需要两步:创建文件夹和编写及运行代码。首先,我们需要创建一个文件夹来存储我们的 Go 代码。

现在,我们可以打开终端并使用以下命令来创建一个名为 “helloworld” 的文件夹,这个文件夹将用来存储我们的 “hello, world” 示例程序。无论是在 Linux 系统、macOS 系统,还是在 Windows 系统的 PowerShell 终端,这个命令都是相同的:

$ mkdir helloworld
$ cd helloworld

这个命令会在当前目录下创建一个新的名为 “helloworld” 的文件夹。

2.2、编写并运行第一个 Go 程序

首先,我们需要创建一个名为 main.go 的源文件。

在这里,需要说明一下 Go 的命名规则。Go 源文件总是用全小写字母形式的短小单词命名,并以 .go 扩展名结尾。如果要在源文件名中使用多个单词,我们通常将多个单词直接连接起来作为源文件名,而不使用其他分隔符,比如下划线。也就是说,我们通常使用 helloworld.go 作为文件名而不是 hello_world.go。这是因为下划线在 Go 源文件命名中有特殊的作用。总的来说,我们尽量避免使用超过两个单词的组合作为文件名,以免造成混淆。

现在,我们打开刚刚创建的 main.go 文件,输入以下代码:

package main

import "fmt"

func main() {
    fmt.Println("hello, world")
}

写完后,我们保存文件并回到终端窗口。接下来,在 Linux 或 macOS 系统中,可以通过输入下面这个命令来编译和运行这个文件了:

go build main.go
./main

输出应该是:

hello, world

如果是在 Windows 系统中,我们需要把上面命令中的 ./main 替换为 .\main.exe

go build main.go
.\main.exe

无论你使用哪种操作系统,到这里你都应该能看到终端输出的 “hello, world” 字符串了。

如果你没有看到这个输出结果,那可能是 Go 安装过程的问题,或者源文件编辑出现了问题,需要你再次仔细确认。

如果一切顺利,那么恭喜你!你已经完成了第一个 Go 程序,并正式成为了 Go 开发者!


2、“hello,world” 示例程序的结构

现在,让我们回过头来仔细看看"hello,world"示例程序中到底发生了什么。

2.1、包声明与 main 包

第一个值得注意的部分是这个:

package main

在 Go 语言中,package main 这行代码非常关键,它标识了文件所属的包。在 Go 中,包是代码组织和模块化的基本单元。通常,一个包由单个小写单词命名,以简洁明了的方式描述其功能或内容。

包的角色和重要性:

  1. 代码封装:包用于封装相关的功能,使代码更加模块化。通过封装,开发者可以将具有相似功能的代码组织在一起,使得维护和理解代码更加容易;
  2. 命名空间:每个包提供了一个命名空间,帮助避免名称冲突。例如,两个不同的包可以有函数或变量名相同,因为它们的包名不同,它们实际上是隔离的;
  3. 重用性:包可以被不同的程序重用。标准库中的包如 fmtmath,以及社区贡献的包,都是可被多个项目共同使用的资源,增强了代码的复用性。

main 包的特殊性:

main 包在 Go 程序中具有特别的地位,因为它定义了可执行程序的入口:

  • 入口点:main 包必须包含一个无参数、无返回值的 main 函数,程序执行从这里开始;
  • 唯一性:在一个可执行程序中,main 包是必须的,并且一个项目中只能有一个这样的包。如果存在多个 main 包,程序将无法编译;
  • 执行性质:仅当程序需要生成一个可执行文件时,main 包才是必需的。库代码通常位于非 main 包中,因为它们不是独立运行的程序,而是作为模块被其他程序调用。
2.2、导入语句

在 Go 语言中,import 语句用于导入所需的包,以便在程序中使用包内定义的函数、类型等。以下是几种使用 import 语句的不同方式及其意义:

接下来我们看一下,示例程序中的导入语句:

import "fmt" 

这条语句告诉 Go 编译器程序需要使用 fmt 包,该包提供了格式化输入/输出的功能。在 Go 中,推荐使用包的绝对路径进行导入,这通常以项目的根目录为起点。

2.3、主函数

在 Go 语言中,main 包内的 main 函数是非常关键的,因为它是每个可执行程序的起点。当你运行一个可执行的 Go 程序时,程序的执行始于 main 函数。这个函数具有独特的结构特点:

func main() {
    fmt.Println("hello, world")
}

函数结构详解:

  • 函数声明:func main() 表示声明了一个名为 main 的函数,它没有参数并且不返回任何值。如果将来需要给函数添加参数,它们必须放在圆括号 () 中。
  • 函数体:函数体由花括号 {} 包围。在 Go 中,所有函数的实现都必须包含在花括号内。按照 Go 语言的惯例,左花括号 { 放置在函数声明的同一行,后面跟一个空格。
  • 函数题内容:fmt.Println("hello, world") 这一行代码已经完成了整个示例程序的所有工作了:将字符串输出到终端的标准输出(stdout)上。

Logo

欢迎加入西安开发者社区!我们致力于为西安地区的开发者提供学习、合作和成长的机会。参与我们的活动,与专家分享最新技术趋势,解决挑战,探索创新。加入我们,共同打造技术社区!

更多推荐