如何在Go中使用接口

2023-12-14 07:45:32

引言

编写灵活、可重用和模块化的代码对于开发通用程序至关重要。这种工作方式避免了在多个地方做相同的修改,从而确保代码更易于维护。如何做到这一点因语言而异。例如,继承是在Java、C++、C#等语言中使用的一种常见方法。

开发者也可以通过组合来达到相同的设计目标。组合是一种将对象或数据类型组合成更复杂的对象或数据类型的方法。这是Go用来促进代码重用、模块化和灵活性的方法。Go中的接口提供了一种组织复杂组合的方法,学习如何使用它们将允许您创建通用的、可重用的代码。

在本文中,我们将学习如何组合具有共同行为的自定义类型,这将允许我们重用我们的代码。我们还将学习如何为我们自己的自定义类型实现接口,以满足从另一个包定义的接口。

定义行为

组合的核心实现之一是使用接口。接口定义了类型的行为。Go标准库中最常用的接口之一是fmt.Stringer接口:

type Stringer interface {
   
    String() string
}

第一行代码定义了一个名为Stringertype。然后声明它是一个interface。就像定义结构体一样,Go使用大括号({})来包围接口的定义。与定义结构体相比,我们只定义接口的行为;也就是说,“这种类型能做什么”。

Stringer接口的情况下,唯一的行为就是String()方法。这个方法没有参数,返回一个字符串。

接下来,让我们看一些具有fmt.Stringer行为的代码:

main.go

package main

import "fmt"

type Article struct {
   
	Title string
	Author string
}

func (a Article) String() string {
   
	return fmt.Sprintf("The %q article was written by %s.", a.Title, a.Author)
}

func main() {
   
	a := Article{
   
		Title: "Understanding Interfaces in Go",
		Author: "Sammy Shark",
	}
	fmt.Println(a.String())
}

我们要做的第一件事是创建一个名为Article的新类型。这个类型有一个Title和一个Author字段,两者都是字符串数据类型

main.go

...
type Article struct {
   
	Title string
	Author string
}
...

接下来,我们在Article类型上定义一个名为String的[method]。String方法将返回一个表示Article类型的字符串:

main.go

...
func (a Article) String() string {
   
	return fmt.Sprintf("The %q article was written by %s.", a.Title, a.Author)
}
...

然后,在我们的main[函数]中,我们创建一个Article类型的实例,并将它赋值给名为a的[变量]。我们为Title字段提供了"Understanding Interfaces in Go"的值,为Author字段提供了"Sammy Shark"的值:

main.go

...
a := Article{
   
	Title: "Understanding Interfaces in Go",
	Author: "Sammy Shark",
}
...

然后,我们通过调用fmt.Println并传入a.String()方法调用的结果来打印String方法的结果:

main.go

...
fmt.Println(a.String())

运行该程序后,你将看到以下输出:

OutputThe "Understanding Interfaces in Go" article was written by Sammy Shark.

到目前为止,我们还没有使用接口,但已经创建了一个具有行为的类型。这种行为与fmt.Stringer接口相匹配。接下来,让我们看看如何使用这种行为来提高代码的可重用性。

定义接口

现在我们已经定义了具有所需行为的类型,我们可以看看如何使用该行为。

然而,在我们这么做之前,让我们看看如果我们想在函数中调用Article类型的String方法,我们需要做什么:

main.go

package main

import "fmt"

type Articl

文章来源:https://blog.csdn.net/QIU176161650/article/details/134972540
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。