一、Go 语言
Go 语言概览
Go(Golang) 是由 Google 开源的、静态、强类型
的编程语言,Go 语言最初的设计目的是用来替代 C++。
Go 语言具有以下特点:
- 开发效率高
- 执行性能高
- 并发编程性能高
- 编译速度快
Go 语言既有动态语言如Python的语法简单、开发效率高的特性,有具有静态语言如 C 的高性能。Go 语言代码可以直接编译成二进制文件,可以直接执行,不同于 Java 要先编译成 class 文件给到 JVM,再编译成二进制文件。
Go 语言最火爆的项目莫过于 Docker 和 K8S,所以 Go 语言也被成为云原生时代的编程语言,除此之外,Go 还可以进行 Web 开发,基于 Go 的 http 包诞生许多优秀的 Web 框架,如 Gin、Beego、Echo 和 Iris 等。
Go 语言在微服务上应用广泛,有许多开发的基于 Go 语言的 RPC 框架,如 kit、go-micro、kratos等;Go 语言还应用于中间件,etcd、influxdb、nsq 等都是基于 Go 开发的,
Go 安装
Go 语言的安装非常简单,可以直接通过 Go 官网的 Downloads 页面下载稳定版安装包安装既可,MacOS 或者 Linux 也可以通过命令行进行安装,安装完成之后可以通过 go version
查看安装的 Go 版本信息。
二、第一个 Go 程序
Go Hello World
makedir go-file cd go-file vim alpha.go 复制代码
Go 程序的第一行是 package main
,要在第一行声明所在的包,main 函数是 Go 程序的入口函数,类似 Java 中的 main 函数,可以将主要的逻辑放在 main 函数中。
fmt.Println
就是 Go 中 fmt 包下的打印的函数,可以将指定信息打印到控制台并换行。
运行 Go Hello World
在 Go 程序同级目录下执行 go run filename.go
也可以通过 go build
命令将程序编译成可执行的二进制文件
执行编译后的二进制文件
Go IDE
Go 的 IDE 有非常多的选择,如 Vscode、Atom 以及 Goland 等,这里选择的是 Goland 2019.3。
在初始化 Go 环境配置时,在 Goland 上配置 Go SDK的最新版本(截止目前,最新版本是 1.18.4)可能会出现 ”The select directory is not a valid home for Go SDK“ 的报错,解决这个问题可以在 Go 安装目录下的 /go/src/runtime/internal/sys/zversion.go
文件中添加 Go 的版本信息
const TheVersion = `go1.18.4` 复制代码
在 package sys
这行下面添加版本信息,不要在顶行添加,否则执行 Go 代码时会出错。可以通过 go env
来查看 Go 安装目录以及环境配置信息。
创建项目的两种方式
第一种方式是创建文件夹 go-basic, 进入文件夹执行 init
命令
// 在 go 项目目录中执行 go mod init go-basic 复制代码
命令执行完会多出一个 go.mod 文件,该文件为 go 程序的依赖文件,类似 Maven 项目的 pom.xml 文件。
Go mod 是 Go 1.11 提出的开发包管理工具,在此之前go发布过许多包管理方案,但都强依赖于环境变量GOPATH,存在诸多缺点,不易于项目管理。
当项目包含较多依赖时,在运行前推荐使用 go mod tidy
整理项目依赖,否则运行时可能会出现 missing ... package
缺少包之类的报错。
第二种方式是使用 Goland 创建项目,选择 Go Modules
IDE 会自动创建 go.mod 文件,不需要手动执行 init
命令。
println 和 fmt.Println
fmt.Println() 和 println() 两个函数都可以将指定信息输出到控制台
package main import "fmt" func main() { println("println() 函数输出的信息:Hello, Go") fmt.Println("fmt.Println() 函数输出的信息:Hello, Go") } 复制代码
执行上述代码,输出结果如下:
很明显 println() 函数输出的信息是红色的,根据其他语言的使用经验红色的信息一般都是 ERROR 信息。
查看 println() 和 fmt.Println() 的源码,选中这两个函数,按住 COMMAND 并使用鼠标点击就可以查看源码
根据官方的注释可以明确 println()
是内置函数,结果写入标准错误且没有返回值;而 fmt.Println()
函数是 fmt 包下的函数,用于将结果写入标准输出,且有两个返回值。
It returns the number of bytes written and any write error encountered.
返回的两个值分别是:
- 写入的 bytes 数量,这里的 byte 的得是
byte
类型,表示ASCII
码的一个字符,bytes 数量既字符串转换成字符数组的长度。 - 写入时遇到的错误,如果没有写入错误则输出空对象
nil
func main() { var a = "Go" println(a) res, err := fmt.Println(a) fmt.Println(res, err) // 获取字符串的字节数组长度,这里要算上换行符。 var bytes_list = []byte("Go\n") fmt.Println("'Go\n'字符串转换为字节数组的长度为:", len(bytes_list)) } 复制代码
执行上述代码,输出结果如下:
Go Go 3 <nil> 'Go\n'字符串转换为字节数组的长度为: 3 复制代码
当然 fmt 标准包中也包含了多个输出函数,常用的有:
fmt.Print
函数:标准输出,不换行,输出多个非字符串类型变量时会添加空格fmt.Println
函数:标准输出,换行,多个变量值之间会添加空格fmt.Printf
函数:格式化输出,不换行
格式化输出常用的占位符有:
占位符 | 占位符说明 |
%v | 以默认的方式打印变量的值,Go 会自动识别变量类型 |
%T | 打印变量的类型 |
%+v | 在打印结构体时,会添加字段名 |
%#v | 在打印结构体时,会添加字段名和包名 |
%s | 正常输出字符串 |
%q | 字符串带双引号,字符串中的引号带转义符 |
%t | 打印true或false |