首页 Go语言介绍
文章
取消

Go语言介绍

Go是编译型的语言,Go的工具链将程序的源文件转变成机器相关的原生二进制指令。 这些工具可以通过单一的go命令配合其子命令进行使用。最简单的子命令是run,它将一个或多个以.go为后缀的源文件进行编译、链接,然后运行生成的可执行文件;

1
go run helloworld.go    # 一次性完成编译链接过程,然后运行

与之相对应的,我们也可以将将之编译输出为一个可复用的程序;

1
2
go build helloworld.go  # 仅有编译的过程
./helloworld    # 执行程序

Go代码是使用包来组织的,我们称之为Go语言包,要与Python函数中的包概念做分区,并不完全一致;一个包由一个或多个go源文件组成,放在一个文件夹中,该文件夹的名字描述了包的作用。每一个源文件的开始都用package声明,例如package main,指明了这个文件属于main包。

  • 概念上来说,package是组织和重用代码的基本单位,并实现命名空间的管理;
  • 每个Go语言程序必须属于一个包,即每个Go程序的开头要写上package <pkg_name>
  • 包的名称可以与目录名不同,但建议保持一致。
  • 一个Go语言程序有且只有一个main函数,它是Go语言程序的入口函数,必须属于main包。
  • 包的导入格式常见有四种:标准引用、设置别名引用、省略方式的引用和仅执行包的初始化函数。
  • 包中的标识符(如结构体、变量、函数等)需要首字母大写才能被包外访问。

后面跟着它通过关键字import导入的其他包的列表,然后是存储在文件中的程序声明。

  • 也就是说,import用于导入其他包的代码;

Go的标准库中有100多个包用来完成输入、输出、排序、文本处理等常规任务。例如fmt包中的函数用来格式化输出和扫描输入。Printlnfmt中的一个基本的输出函数,它输出一个或多个用空格分隔的值,结尾使用一个换行符,这样看起来这些值是单行输出。

  • import概念上的包才是类似于Python中的包概念;

名为main的包比较特殊,它用来定义一个独立的可执行程序,而不是库。在main包中,函数main也是特殊的,不管在什么程序中,main做什么事情 ,它总是程序开始执行的地方。 当然,main通常调用其他包中的函数来做更多的事情,比如fmt.Println

我们需要告诉编译器源文件需要哪些包,用package声明后面的import来导入这些包。

  • 必须精确地导入需要的包。在缺失导入或存在不需要的包的情况下,编译会失败,这种严格的要求可以防止程序演化中引用不需要的包。
1
2
3
4
5
import (
	"bufio"
	"fmt"
	"os"
)

import声明必须跟在package声明之后。import导入声明后面,是组成程序的函数、变量、常量、类型(以func、var、const、type开头的)声明,大部分情况下,声明的顺序是没有关系的。示例中的程序足够短,因为它只声明了一个函数,这个函数又仅仅调用了一个其他的函数。为了节省空间,在处理示例的时候,我们有时不展示packageimport声明,但是它们存在于源文件中,并且编译时必不可少。

一个函数的声明由func关键字、函数名、参数列表(main函数为空)、返回值列表(可以为空)、放在大括号内的函数体组成,函数体定义函数是用来做什么的。

Go不需要在语句或声明后面使用分号结尾,除非有多个语句或声明出现在同一行。

  • 跟在特定符号后面的换行符被转换为分号,换行操作会影响对Go代码的解析。

例如,{符号必须和关键字func在同一行,不能独自成行,并且在x+y这个表达式中,换行符可以在操作符的后面,但是不能在操作符的前面。

Go对于代码的格式化要求非常严格。gofmt工具将代码以标准格式重写,go工具的fmt子命令使用gofmt工具来格式化指定包里的所有文件或者当前文件夹中的文件(默认情况下),使用方式:

  • 命令行: 在终端或命令提示符中运行 gofmt 命令,后跟要格式化的源文件路径。
  • IDE集成: 许多 Go IDE 和编辑器都集成了 gofmt,允许用户一键格式化代码。

许多文本编辑器可以配置为每次在保存文件时自动运行gofmt,因此源文件总可以保持正确的形式。此外,一个相关的工具goimports可以按需管理导入声明的插入和移除。它不是标准发布版的一部分,可以通过执行下面的命令获取到:

1
go get golang.org/x/tools/cmd/goimports

对大多数用户来说,按照常规方式下载、编译包,执行自带的测试,查看文档等操作,使用go工具都可以实现。

本文由作者按照 CC BY 4.0 进行授权

Go的入门与程序结构

Go的基本数据类型