青训营X豆包MarsCode 技术训练营第一课 | Go 语言入门指南:基础语法和常用特性解析

155 阅读5分钟

Go 语言入门指南:基础语法和常用特性解析

如何运行 Go 代码

在 Go 语言中运行代码非常简单,主要有两种方法:

  1. 直接运行:可以直接使用 go run 命令来运行代码,这个命令会自动编译并运行代码,非常适合快速测试和调试代码。
    go run main.go
    
  2. 编译后运行:可以先用 go build 命令将代码编译为二进制文件,然后运行生成的文件。这种方式适合用于正式发布的程序,因为编译后的文件独立运行,不再依赖源代码。
    go build main.go
    ./main
    

这样,Go 的编译和运行方式就很容易上手,无需复杂的配置。


2. 基础语法

2.1 变量和类型

在 Go 语言中,变量的定义和使用非常灵活,但 Go 是一门静态类型语言,这意味着变量的类型在编译时确定。

  • 变量声明:有两种主要的声明方式——使用 var 关键字显式声明变量,或者使用 := 符号让编译器自动推断类型。const 关键字用于声明常量。

    var a int = 10         // 使用 var 声明并指定类型
    b := 20                // 使用 := 自动推断类型
    const pi = 3.14        // 声明常量
    
  • 基本数据类型:Go 支持多种常见的数据类型,如整数类型(intuint)、浮点数类型(float32float64)、布尔类型(bool)、字符串类型(string)等。每种类型都可以满足不同的需求。

  • 类型转换:Go 语言不支持隐式类型转换,这意味着不同类型的变量在计算前需要手动转换。

    var i int = 42
    var f float64 = float64(i)  // int 转换为 float64
    

小贴士:在 Go 中,变量未使用会导致编译错误,这是因为 Go 强调代码的简洁和清晰,不允许存在未使用的变量。

2.2 控制结构

Go 的控制结构简单直接,语法规则很容易记住,下面是几种常用的控制结构:

  • 条件语句 (if):Go 的 if 语句语法简洁,不需要括号,甚至可以在 if 条件前声明变量。例子如下:

    if x := 10; x > 5 {
        fmt.Println("x 大于 5")
    }
    
  • 循环语句 (for):Go 语言只提供一种循环结构——for,没有 whiledo-whilefor 循环可以实现所有常见的循环模式,如经典的计数循环、条件循环和无限循环:

    // 计数循环
    for i := 0; i < 5; i++ {
        fmt.Println(i)
    }
    
    // 条件循环
    i := 0
    for i < 5 {
        fmt.Println(i)
        i++
    }
    
    // 无限循环
    for {
        fmt.Println("无限循环")
        break  // 使用 break 跳出循环
    }
    

提示:Go 中没有 while,因为 for 循环已经可以实现所有的循环功能,这让语言更加简洁。

2.3 函数和 defer

函数在 Go 中通过 func 关键字定义,Go 函数支持多个返回值,还提供 defer 关键字,用于在函数结束时执行一些清理操作。

  • 函数声明:函数可以接受多个参数,并返回单个或多个值。

    func add(a int, b int) int {
        return a + b
    }
    
  • 多返回值:Go 函数可以返回多个值,这在错误处理上尤其方便。例如,下面的 divide 函数返回两个值,一个是结果,一个是错误信息。

    func divide(a, b int) (int, error) {
        if b == 0 {
            return 0, fmt.Errorf("除数不能为零")
        }
        return a / b, nil
    }
    
  • defer 语句defer 用于延迟执行某些操作,通常用于资源的释放,例如文件关闭或连接的释放。

    func main() {
        defer fmt.Println("程序结束")  // main 函数结束时才会执行
        fmt.Println("程序开始")
    }
    

2.4 结构体和接口

结构体和接口是 Go 语言实现面向对象特性的关键组件。

  • 结构体 (struct):结构体是自定义的数据类型,可以包含多个字段,用于组织和管理数据。

    type Person struct {
        Name string
        Age  int
    }
    
  • 接口 (interface):接口定义了行为的集合,任何实现了接口定义的方法的类型都可以被视为该接口类型。接口在 Go 中用于实现多态。

    type Speaker interface {
        Speak() string
    }
    

提示:Go 不支持传统的类继承,但通过组合和接口实现了面向对象的特性,让代码更加灵活和模块化。


3. 标准库 (常用功能)

Go 的标准库非常强大,涵盖了许多常用的功能。这里列出几个常用的包和功能:

  • 输入与输出 (I/O)fmt 包提供了格式化输出和输入的函数。

    fmt.Println("请输入一个数字:")
    var num int
    fmt.Scan(&num)
    
  • 错误处理:Go 使用返回值而不是异常来处理错误,常用 if err != nil 的方式判断是否出错。

    func readFile(filename string) error {
        _, err := os.Open(filename)
        if err != nil {
            return err
        }
        return nil
    }
    
  • 常用标准库

    • 网络库 (net/http):用于构建 HTTP 服务器和处理 HTTP 请求。
    • 文件处理 (os, io/ioutil):用于文件的创建、读写操作。
    • 时间处理 (time):处理日期和时间。
  • 示例:简单 HTTP 服务器:下面是一个简单的 HTTP 服务器示例,启动后可以访问 http://localhost:8080,会返回 “Hello, 世界!”。

    package main
    import (
        "fmt"
        "net/http"
    )
    
    func handler(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello, world!")
    }
    
    func main() {
        http.HandleFunc("/", handler)
        http.ListenAndServe(":8080", nil)
    }
    

这个示例展示了如何使用 Go 的标准库 net/http 包来快速构建一个 Web 服务。通过以上例子,你可以感受到 Go 语言设计的简洁和高效,特别是在网络编程方面的优势。