Go语言基础总结 | 豆包MarsCode AI刷题

159 阅读5分钟

安装Go

首先,你需要在你的计算机上安装Go。你可以从Go语言官方网站下载适合你操作系统的安装包。安装步骤通常包括:

  1. 下载安装包并解压到指定目录。
  2. 设置环境变量,将Go的bin目录添加到PATH中。
  3. 打开终端或命令提示符,输入go version来验证安装是否成功。

go语言依赖管理

补充一下go语言的依赖管理方式,即Go Modules。Go Modules是Go语言从1.11版本开始引入的依赖管理工具,它使得依赖版本信息变得显式和易于管理。一个模块是一组Go包的集合,存储在一个文件树中,其根目录包含一个go.mod文件。

与之前版本的需要添加GOROOTGOPATH环境变量的依赖管理方式相比,Go Modules的主要优点包括:

  • 支持在项目中独立管理依赖包,不受GOPATH限制。
  • 自动管理依赖包的版本。
  • 支持版本回滚、升级和降级等操作。
  • 提供更加灵活的包管理方式,方便多人协作开发。

初始化Go Modules项目

要使用Go Modules,首先需要初始化一个Go Modules项目。执行以下命令即可:

go mod init <module-name>

其中<module-name>通常是你的项目名或项目的导入路径。如果你没有指定模块名,它会根据当前目录名称自动生成一个模块名。

go.mod文件

go mod init命令执行后,会生成一个go.mod文件,它记录了模块名称和依赖包的版本信息。文件内容大致如下:

module example.com/myproject
go 1.21
  • module表示模块的名称,可以是任何名称,常见的是项目的导入路径。
  • go表示Go语言的版本号。

当你在项目中导入新的依赖包时,Go会自动将依赖信息添加到go.mod文件中,并记录依赖的版本。

go.sum文件

除了go.mod,Go Modules还会生成一个go.sum文件,它记录了依赖包的精确版本和校验和(checksum),用来确保包的内容不被篡改或修改。

使用Go Modules管理依赖

添加依赖

当你在项目中导入新的第三方包时,Go Modules会自动下载该包并将其版本记录到go.modgo.sum文件中。例如,导入一个github.com/sirupsen/logrus的日志库:

import "github.com/sirupsen/logrus"

然后在终端中运行Go的构建命令(如go buildgo rungo test等),Go Modules会自动下载这个库及其依赖并更新go.mod文件。

升级依赖

你可以使用go get命令来升级或添加依赖:

go get -u github.com/pkg/errors@v0.9.0

这会将指定的依赖升级到指定的版本。

清理无用依赖

go mod tidy命令可以清理go.mod中不再需要的依赖:

go mod tidy

这个命令会移除不再被项目中的任何Go文件引用的依赖。

查看依赖

使用go list -m all命令可以查看当前模块下的所有依赖:

go list -m all

这会列出所有直接和间接依赖,以及它们当前的版本。

变量和常量

在Go中,变量的声明使用var关键字,类型在变量名之后。例如:

var a int
var b = 1
c := 2

常量则是使用const关键字声明,常量的值在编译时确定,不可更改。

控制结构

Go提供了基本的条件和循环控制结构:

  • if-else 结构用于条件判断。
  • for 结构是Go中唯一的循环结构,用于循环控制。
  • switch 结构用于多条件分支。

函数

函数在Go中用于封装可重用的代码块。定义函数使用func关键字:

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

数组和切片

Go中的数组和切片是处理同类型元素集合的数据结构:

  • 数组有固定长度,而切片则是动态的,可以增长和缩小。
  • 切片通过make函数创建,或者通过数组的切片操作获得。

Map和结构体

  • Map是Go中内置的键值对数据结构,用于快速查找、插入和删除操作。
  • 结构体是自定义数据类型,用于将多个字段组合成一个单一的数据结构。

结构体(Struct)

结构体是Go语言中一种自定义的数据类型,它允许你将多个不同类型的数据组合成一个单一的类型。结构体通过struct关键字定义:

type Person struct {
    Name string
    Age  int
}

你可以创建结构体的实例,并访问其字段:

p := Person{Name: "xiaoming", Age: 30}
fmt.Println(p.Name) 

结构体方法(Methods)

在Go中,你可以为结构体添加方法,这些方法类似于其他面向对象语言中的对象方法。方法定义时需要指定接收者(receiver),即结构体的实例:

func (p *Person) Greet() string {
    return "Hello, " + p.Name
}

p := Person{Name: "xiaoming"}
fmt.Println(p.Greet()) 

Error

error是Go语言中一个内建的接口类型,用于错误处理。任何实现了error接口的类型都可以用来表示错误:

type MyError struct{}

func (e *MyError) Error() string {
    return "something bad happened"
}

func someFunction() error {
    return &MyError{}
}

err := someFunction()
if err != nil {
    fmt.Println(err.Error()) 
}

String

string是Go语言中表示文本数据的类型。它是一个UTF-8编码的字节序列。你可以使用+运算符来连接字符串:

s := "Hello, " + "world!"
fmt.Println(s) // 输出: Hello, world!

Fmt

fmt包提供了格式化I/O的功能,类似于C语言中的printfscanf。它可以用来打印格式化的字符串到标准输出:

fmt.Printf("Name: %s, Age: %d\n", "xiaoming", 30)

Json

json包用于处理JSON数据。你可以使用json.Marshal将Go数据结构编码为JSON,使用json.Unmarshal将JSON解码为Go数据结构:

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

p := Person{Name: "xiaoming", Age: 30}
jsonData, _ := json.Marshal(p)
fmt.Println(string(jsonData)) 

var newPerson Person
json.Unmarshal(jsonData, &newPerson)
fmt.Println(newPerson.Name) 

Time

time包提供了时间相关的操作。你可以创建时间对象,计算时间差,以及格式化和解析时间:

t := time.Now()
fmt.Println("Current time:", t)

// 等待1秒
time.Sleep(1 * time.Second)

// 计算时间差
duration := time.Since(t)
fmt.Println("Duration:", duration)

Strconv

strconv包提供了字符串与其他基本数据类型之间的转换功能:

// 字符串转整数
i, err := strconv.Atoi("42")
if err != nil {
    fmt.Println("转换错误:", err)
}
fmt.Println("整数:", i)

// 整数转字符串
s := strconv.Itoa(42)
fmt.Println("字符串:", s)

Env

os包中的GetenvSetenv函数可以用来读取和设置环境变量:

// 设置环境变量
os.Setenv("GOPATH", "/my/go/path")

// 获取环境变量
path := os.Getenv("GOPATH")
fmt.Println("GOPATH:", path)