Go 编程 | 连载 01 - Go Quickstart

1,149 阅读5分钟

一、Go 语言

Go 语言概览

Go(Golang) 是由 Google 开源的、静态、强类型的编程语言,Go 语言最初的设计目的是用来替代 C++。

Go 语言具有以下特点:

  • 开发效率高
  • 执行性能高
  • 并发编程性能高
  • 编译速度快

Go 语言既有动态语言如Python的语法简单、开发效率高的特性,有具有静态语言如 C 的高性能。Go 语言代码可以直接编译成二进制文件,可以直接执行,不同于 Java 要先编译成 class 文件给到 JVM,再编译成二进制文件。

image.png

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 版本信息。

image.png

二、第一个 Go 程序

Go Hello World

makedir go-file
cd go-file
vim alpha.go

image.png

Go 程序的第一行是 package main,要在第一行声明所在的包,main 函数是 Go 程序的入口函数,类似 Java 中的 main 函数,可以将主要的逻辑放在 main 函数中。

fmt.Println 就是 Go 中 fmt 包下的打印的函数,可以将指定信息打印到控制台并换行。

运行 Go Hello World

在 Go 程序同级目录下执行 go run filename.go

image.png

也可以通过 go build 命令将程序编译成可执行的二进制文件

image.png

image.png

执行编译后的二进制文件

image.png

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

image.png

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")
}

执行上述代码,输出结果如下:

image.png

很明显 println() 函数输出的信息是红色的,根据其他语言的使用经验红色的信息一般都是 ERROR 信息。

查看 println() 和 fmt.Println() 的源码,选中这两个函数,按住 COMMAND 并使用鼠标点击就可以查看源码

image.png

image.png

根据官方的注释可以明确 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

我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿