第六届字节跳动青训营第一课 | 青训营

89 阅读4分钟

第一节课之Go语言上手

前言

Go语言是一款常用于后端开发的编程语言,具有如下几点特性:

  1. 高性能、高并发 Go语言不仅性能媲美C语言与C++,并且开发者可以仅仅使用标准库,便能在后端开发的场景中实现更为高效的处理,这对于高并发场景的开发非常高效。Go语言比较轻量级,能够通过简短语句启动新协程GoRoutine,且并发模型基于channel通信。
  2. 语法简单 语法风格与C语言相似,但省略了许多繁杂内容,可读性也更强。
  3. 标准库极其丰富 Go语言与python相似,拥有极为丰富的标准库,它们都运行稳定功能强大,可以省略许多基础的函数实现。
  4. 工具链完善 Go语言拥有包括代码格式化、包管理、单元测试等一系列实用工具。
  5. 静态链接 Go语言所有的编译结构都默认为静态链接,编译产生的二进制文件可以直接运行,无需关注环境依赖。且对工程的推导基于文件夹结构,链接过程不易出错且不太繁琐。
  6. 快速编译 在静态语言中几乎最快的编译速度。
  7. 跨平台 强大的可移植性和适应多种设备。
  8. 垃圾回收 在写代码时可以无需考虑内存的分配释放,其自带垃圾回收功能。

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
        }