第一节课之Go语言上手
前言
Go语言是一款常用于后端开发的编程语言,具有如下几点特性:
- 高性能、高并发 Go语言不仅性能媲美C语言与C++,并且开发者可以仅仅使用标准库,便能在后端开发的场景中实现更为高效的处理,这对于高并发场景的开发非常高效。Go语言比较轻量级,能够通过简短语句启动新协程GoRoutine,且并发模型基于channel通信。
- 语法简单 语法风格与C语言相似,但省略了许多繁杂内容,可读性也更强。
- 标准库极其丰富 Go语言与python相似,拥有极为丰富的标准库,它们都运行稳定功能强大,可以省略许多基础的函数实现。
- 工具链完善 Go语言拥有包括代码格式化、包管理、单元测试等一系列实用工具。
- 静态链接 Go语言所有的编译结构都默认为静态链接,编译产生的二进制文件可以直接运行,无需关注环境依赖。且对工程的推导基于文件夹结构,链接过程不易出错且不太繁琐。
- 快速编译 在静态语言中几乎最快的编译速度。
- 跨平台 强大的可移植性和适应多种设备。
- 垃圾回收 在写代码时可以无需考虑内存的分配释放,其自带垃圾回收功能。
Go语言基础知识
以下将以课程中的猜数游戏的程序为例,简单记录Go语言的基础知识。
首先在程序的开头定义了包名,这是因为Go语言要求在源文件中非注释的第一行指明这个文件属于哪个包。 package main 表示一个可独立执行的程序,每个Go语言开发的应用程序都包含一个名为 main 的包。
package main
紧接着是包的导入,需要使用 import 语句。导入的包在后续程序中用到,譬如常见的 fmt 包就包含了格式化的输入与输出函数。
import (
"bufio"
"fmt"
"math/rand"
"os"
"strconv"
"strings"
"time"
)
最为重要的,也是程序的主体部分,便是 func main 函数,这是程序开始执行的函数(在有 init() 函数时则会先执行该函数再进入主函数)。
但是为了解释清楚Go语言的语法,我们将拆解开来分析。
func main() {
// ...
}
第一部分是随机数的设置。其中变量的声明采取简化的措施,直接使用 := 运算符来进行声明与初始化,其中默认了 maxNum 变量是一个整型变量。之后则是使用 rand 包内的函数分别设置随机数种子和返回一个随机数。
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
第二部分是输入输出的交互。先通过 fmt.Println() 函数输出提示语句,再通过 bufio.NewReader() 函数从标准输入中读取字符串。
fmt.Println("Please input your guess")
reader := bufio.NewReader(os.Stdin)
第三部分则是猜数游戏的循环。这一部分我们也拆开来看。
for {
// ...
}
-
第一部分是获取一行,以换行符作为字符串的行结尾。注意Go语言的函数可以有多个返回值。通过返回的
err信息我们可以判断是否出现了异常,再决定是否继续执行程序。input, err := reader.ReadString('\n') if err != nil { fmt.Println("An error occured while reading input. Please try again", err) continue } -
第二部分我们需要从读取的一行中删除无用的字符。
input = strings.Trim(input, "\r\n") -
第三部分我们利用
strconv.Atoi()函数将读入的字符串转化为整数。注意每次调用函数我们最好都能够保持判断是否出现异常的习惯,即利用返回的err信息做if err != nil的条件语句。Go语言的条件语句省略了括号,相比于C语言是一项不错的简化。// 3.3 change into an integer guess, err := strconv.Atoi(input) if err != nil { fmt.Println("Invalid input. Please enter an integer value") continue } -
最后是对读入的数字进行判断,需要使用到一组条件语句,其条件语句的相关语法与C语言相似。
fmt.Println("You guess is", guess) if guess > secretNumber { fmt.Println("Your guess is bigger than the secret number. Please try again") } else if guess < secretNumber { fmt.Println("Your guess is smaller than the secret number. Please try again") } else { fmt.Println("Correct, you Legend!") break }