阅读本文前,建议已掌握基本C语言语法及规范,本文将更加侧重Go语言和C系列语言的区别以达到快速上手的目的
Go(Golang)语言是谷歌开发的一款和C语言非常类似的静态强类型语言,同样具有编译型特点。但与C系语言不同的是,Go语言具有CSP-style并发运算和GC垃圾回收机制。
关于静态/动态和强类型/弱类型的区别可参考: 动态语言、静态语言、强类型语言、弱类型语言的区别 (biancheng.net)
本文主要参考《Go语言圣经(中文版)》及个人实践撰写,具体可参考: Go语言圣经
本文作为该系列第一篇,将简单介绍基本构成元素
/编译执行方法
/基本输入输出
Go语言基本构成元素
Go的基础语言结构主要包含包声明(及引入)、函数、变量、表达式(及语句)、注释,较为重要的是Go语言中的标识符作用域规范。
以下代码是世界上第一个Go语言程序:
package main
import "fmt"
func main() {
fmt.Println("Hello World!")
}
包声明:上述代码中package main
为包声明。Go语言中的包(package)和C语言中的库(libraries)、Verilog语言中的模块(modules)具有类似的作用,是程序代码的组织形式。
一个包由所处单目录下的多个.go后缀源文件组成,每个源文件都以package xxx
声明语句开始,说明该文件所在的包。
其中main
包最为特殊,定义了独立可执行程序,main包中的main函数是程序执行的入口(相当于C语言中的main函数)。可以简单理解为“main包中所做的事情就是该程序的任务”。
包引入:上述代码中import "fmt"
为包引入。Go语言源程序文件中,包引入通常直接跟在包申明之后,表示以下代码需要用到其他某些包的内容。import语法和python相同,直接加包名,使用原理和C语言中添加头文件类似,例如C++在main函数中进行调用sort函数进行排序,需要加上头文件#include <alogrithm>
引入stl标准库。
fmt
包是Go语言中最基础的引入包,含有格式化输出、接收输入的函数,如本段代码中的Println
标准输出函数,将字符串输出到控制台(关于fmt包中具体的输出控制函数如Println/Printf等后续输入输出章节详细介绍)。
函数:上述代码中func main(){...}
定义了主函数,同样可定义其他函数,函数之间可以互相调用,具体详见后续函数章节。
变量:Go语言中同样可以定义变量var
和常量const
,用于数据的运算。上面的Println函数同样可以以变量作为参数,输出变量值。具体内容见后续常量变量章节。
注释:和C语言注释完全相同,单行注释使用//注释内容
,多行注释使用/*注释内容*/
。
标识符规范
Go语言中常见的标识符(如变量名、函数名等)如果以大写字母开头(如Cnt),则当该包被外部包引用时,可以直接访问并修改变量值,称为“导出”;当以小写字母开头(如cnt),则外部不可见。这两种使用方法类似于oop中的public和private,有效保证包的封装性。
编译执行方法
打开任意编辑器书写.go后缀的源文件代码段,和C语言一样,Go也是一门编译型语言,故依托静态编译的方法使用工具链将源代码及其依赖转换成计算机的机器指令。
命令行编译执行可以使用简单的go run
命令将源文件编译、链接库文件、执行可执行文件:
go run xxx.go
若想后续多次使用编译执行的结果,可以使用go build
构建.exe后缀的二进制可执行文件,且得益于静态编译,即使系统库更新也不会影响exe文件中的运行效果。构建方式如下:
go build xxx.go
生成可执行文件后可以直接使用命令行打开运行:
xxx.exe 或 xxx 即可运行
基本输入输出
输入
Gofmt
包下有以下三个标准输入函数:
函数名 | 使用方法 |
---|---|
fmt.scan | 直接获取输入,以空格或换行作为输入结束 |
fmt.Scanf | 指定格式获取获取输入,Go语言会根据格式解析参数 |
fmt.Scanln | 获取一行输入,以回车符结束输入 |
以下代码段为例:
package main
import "fmt"
func main() {
var a, b, c, d string
fmt.Scan(&a)
fmt.Scanf("%s %s", &b, &c)
fmt.Scanln(&d)
fmt.Println(a, " and ", b, " and ", c, " are good friends.\nHowever ", d, " is not")
}
运行结果为:
输出
函数名 | 使用方法 |
---|---|
fmt.Print | 直接输出 |
fmt.Printf | 格式化输出 |
fmt.Println | 输出并换行 |
fmt.Sprintf | 格式化字符串,返回字符串 |
以下代码段为例: |
package main
import "fmt"
func main() {
var str1 = "Hello"
var str2 = "World"
var num = 2023
var goal = "%s %s into %d"
var result = fmt.Sprintf(goal, str1, str2, num)
fmt.Println(result)
fmt.Printf(goal, str1, str2, num)
}
运行结果:
本篇主要涉及Go语言的基本构成、编译链接执行的流程方法以及基本的输入输出方法。后续章节将涉及Go语言的数据类型、数据结构等知识