Go 语言入门 | 豆包MarsCode AI 刷题

57 阅读3分钟

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

方向三

引言

Go(又称 Golang)是一种静态类型、编译型的编程语言,由 Google 在 2007 年开发并于 2009 年首次发布。Go 语言的设计目标是提高开发效率,同时保持程序的高性能。它结合了 C 和 Python 的一些特性,具有简洁的语法和强大的标准库。Go 特别适合于构建网络服务和分布式系统。

基础语法

1. 安装和环境配置

首先,你需要安装 Go 语言环境。你可以从 Go 官方网站 下载并安装最新版本的 Go。安装完成后,设置好环境变量 GOPATHGOROOT,然后创建一个新的工作区目录。

2. 第一个 Go 程序

创建一个名为 main.go 的文件,并编写以下代码:

package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

保存文件后,在命令行中运行:

go run main.go

你将看到输出:

Hello, World!

3. 变量声明与使用

Go 语言中变量可以通过多种方式声明:

  • 显式声明:使用 var 关键字声明变量并指定类型。

    var age int = 25
    
  • 隐式声明:使用简短声明操作符 := 自动推断类型。

    name := "Alice"
    
  • 多变量声明:可以在一行中声明多个变量。

    var (
        firstName string = "Alice"
        lastName  string = "Smith"
    )
    

4. 数据类型

Go 语言支持多种数据类型,包括基本类型和复合类型:

  • 基本类型

    • 整型:intint8int16int32int64uintuint8uint16uint32uint64
    • 浮点型:float32float64
    • 布尔型:bool
    • 字符串:string
    • 字节型:byte(等同于 uint8
  • 复合类型

    • 数组:固定长度的序列。

      var arr [5]int
      
    • 切片:动态长度的数组。

      slice := []int{1, 2, 3, 4, 5}
      
    • 映射(字典):键值对集合。

      map := make(map[string]int)
      map["apple"] = 10
      
    • 结构体:用户定义的数据类型。

      type Person struct {
          Name string
          Age  int
      }
      

5. 控制结构

Go 语言提供了多种控制结构,用于控制程序的流程:

  • 条件语句ifswitch 语句。

    if age < 18 {
        fmt.Println("未成年")
    } else {
        fmt.Println("已成年")
    }
    
    switch day {
    case "Monday":
        fmt.Println("今天是周一")
    case "Tuesday":
        fmt.Println("今天是周二")
    default:
        fmt.Println("今天是其他日子")
    }
    
  • 循环语句for 循环。

    for i := 0; i < 5; i++ {
        fmt.Println(i)
    }
    
    // 遍历切片
    for index, value := range slice {
        fmt.Printf("Index: %d, Value: %d\n", index, value)
    }
    

6. 函数定义

函数是 Go 编程中的基本构建块。可以定义带有或不带参数的函数,并且可以指定返回值类型:

func add(x int, y int) int {
    return x + y
}

func greet(name string) {
    fmt.Printf("Hello, %s!\n", name)
}

func main() {
    result := add(3, 5)
    fmt.Println(result) // 输出 8

    greet("Alice") // 输出 Hello, Alice!
}

7. 指针

指针是一个存储变量内存地址的变量。使用指针可以修改变量的值:

func modifyValue(x *int) {
    *x = 10
}

func main() {
    num := 5
    modifyValue(&num)
    fmt.Println(num) // 输出 10
}

8. 方法

方法是绑定到特定类型上的函数。可以为结构体定义方法:

type Person struct {
    Name string
    Age  int
}

func (p Person) SayHello() {
    fmt.Printf("Hello, my name is %s and I am %d years old.\n", p.Name, p.Age)
}

func main() {
    person := Person{Name: "Alice", Age: 25}
    person.SayHello() // 输出 Hello, my name is Alice and I am 25 years old.
}

常用特性

1. 包管理

Go 使用包来组织代码,每个文件都属于一个包。你可以导入其他包来使用其功能:

import (
    "fmt"
    "os"
)

func main() {
    fmt.Println("Hello, World!")
    os.Exit(0)
}

2. 并发编程

并发是 Go 的一大特色,通过 goroutines 实现轻量级线程。goroutines 的启动非常简单,只需在函数调用前加上 go 关键字即可:

func printNumber(num int) {
    fmt.Printf("Number: %d\n", num)
}

func main() {
    go printNumber(1)
    go printNumber(2)
    time.Sleep(time.Second) // 确保主线程等待子 goroutine 完成
}

3. 错误处理

Go 不像某些语言那样使用异常来处理错误,而是倾向于显式地返回错误值。函数通常会返回一个额外的错误值,调用者需要检查这个错误值以确定操作是否成功:

func openFile(filename string) (*os.File, error) {
    file, err := os.Open(filename)
    if err != nil {
        return nil, err
    }
    return file, nil
}

func main() {
    file, err := openFile("filename.txt")
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    defer file.Close()
    fmt.Println("File opened successfully")
}