Golang快速入门(3) | 青训营

81 阅读4分钟

Golang快速入门(3)| 青训营

1. 包(package)

Golang 的包(package)是组织和管理代码的基本单元,其有助于将代码分解为可管理的模块,并提高代码的可维护性和复用性。 Golang包这一概念的灵感主要来自于Pascal语言和Modula-2语言,和Python的模块有点类似,但比python的模块更加强大,并且Golang把包给强制应用了,而python的模块是可选的。

下面我来介绍Golang包的特点和基本应用。

1. 包的定义

Go包是一个目录,包含一个或多个Go源文件。包的名称通常与目录名一致,在包里的每个go文件第一行都应该是package 包名

2. 包的导入

要在Go程序中使用一个包,你需要使用import语句将其导入。例如: go import "fmt" //引入单个包

```go
import (
"fmt"
"net/http"
) //批量引入
```

批量引入时,包的顺序决定着包init函数的执行顺序。

3. 包的可见性

Go中的标识符(变量、函数、结构体等)的可见性由其首字母的大小写决定。以大写字母开头的标识符是可导出的,可以被其他包访问。小写字母开头的标识符是私有的,只能在同一个包内部访问。

4. main包

程序的入口是main函数,而main函数应该是在main包里,一个项目只能有一个main包。

5.包的初始化

Go中的包可以有一个特殊的init函数,它会在包被导入时自动执行。init函数通常用于初始化包内的变量或执行一些初始化逻辑。

2. 模块(Go Module)

在从Go 1.11版本开始,Go引入了Go module这一依赖管理方案,用于更好地管理和解决包的依赖关系问题。在Go 1.16版本之后默认开启。

下面是go module的基本使用

  • 初始化模块:在项目根目录下执行go mod init <module-name>,会创建一个go.mod文件,记录项目的模块信息和依赖。
  • 添加依赖:使用go get命令来添加新的依赖。例如,go get github.com/example/package
  • 更新依赖:使用go get -u来更新依赖包的版本。
  • 移除依赖:使用go mod tidy来移除不再使用的依赖。

3. 接口(Interface)

在 Go 语言中,接口是一种抽象的类型,用于定义一组方法的签名,但并不提供实际的实现。接口描述了对象的行为,而不关心对象的具体类型,从而实现了面向接口编程的思想,赋予了 Go 语言强大的多态性能力。

1. 定义接口

在 Go 语言中,我们使用 type 关键字来定义接口,随后跟着一组方法的签名。下面是一个简单的接口定义示例:

type Animal interface {
    Eat()
    Sleep()
}

这里我们定义了一个名为 Animal 的接口,要求实现该接口的类型必须拥有 Eat()Sleep() 方法。

2. 实现接口

在 Go 语言中,任何类型只要实现了接口中定义的所有方法,就被认为是实现了该接口。接口的实现是隐式的,不需要明确声明。以下是一个实现 Animal 接口的 Dog 类型示例:

type Dog struct {
    Name string
}
​
func (d Dog) Eat() {
    fmt.Println(d.Name, "正在享受美食")
}
​
func (d Dog) Sleep() {
    fmt.Println(d.Name, "进入梦乡")
}

在此示例中,Dog 类型实现了 Animal 接口中的 Eat()Sleep() 方法。

3. 接口变量

您可以创建接口类型的变量,然后将实现了该接口的具体类型的实例赋值给这些变量。例如:

var a Animal
a = Dog{Name: "旺财"}

在这里,变量 a 是一个 Animal 接口类型的变量,可以存储任何实现了 Animal 接口的类型的值。

4. 实现多态性

借助接口,我们可以实现多态性。多态性使得我们可以使用相同的接口变量来调用不同类型对象的方法,而不需要关心对象的具体类型。例如:

func Feed(a Animal) {
    a.Eat()
}
​
d := Dog{Name: "小黑"}
Feed(d) // 调用 Feed 函数,传入 Dog 类型实例

在这里,Feed 函数接受一个 Animal 接口类型的参数,能够接收任何实现了 Animal 接口的类型的值。

5. 空接口

Go 语言还提供了特殊的空接口(interface{}),它不要求实现任何方法。因此,空接口可以表示任何类型的值。空接口在需要处理多种类型数据时非常有用,但在使用时需要小心,因为它失去了类型检查。

var emptyInterface interface{}
emptyInterface = 42
fmt.Println(emptyInterface)
emptyInterface = "Hello, World"
fmt.Println(emptyInterface)

在这里,emptyInterface 可以存储整数、字符串等任何类型的值。

通过接口,Go 语言实现了一种灵活的方式来编写可扩展、可维护和可重用的代码。您可以定义通用的行为规范,并让不同类型的对象去实现这些规范,从而实现了多态性和面向接口编程的思想。无论是实现抽象概念还是构建强大的代码结构,接口都是 Go 语言的重要工具之一。