731 words
4 minutes
Go语言教程:深入理解接口与结构体 2
介绍
在Go语言中,接口(interface)和结构体(struct)是构建灵活和可扩展程序的基础。接口定义了一组方法,而结构体可以实现这些方法,从而实现接口。
示例代码
以下是一个完整的Go语言代码示例,展示了如何定义接口、结构体以及实现接口的方法:
package main
import "fmt"
type Pet interface {
SetName(name string)
Name() string
Category() string
}
type Dog struct {
name string // 名字。
}
func (dog *Dog) SetName(name string) {
dog.name = name
}
func (dog Dog) Name() string {
return dog.name
}
func (dog Dog) Category() string {
return "dog"
}
func main() {
// 示例1。
dog := Dog{"little pig"}
_, ok := interface{}(dog).(Pet)
fmt.Printf("Dog implements interface Pet: %v\\n", ok)
_, ok = interface{}(&dog).(Pet)
fmt.Printf("*Dog implements interface Pet: %v\\n", ok)
fmt.Println()
// 示例2。
var pet Pet = &dog
fmt.Printf("This pet is a %s, the name is %q.\\n",
pet.Category(), pet.Name())
}
代码解析
定义接口
首先,我们定义了一个 Pet
接口,接口中包含三个方法:SetName
、Name
和 Category
。
type Pet interface {
SetName(name string)
Name() string
Category() string
}
定义结构体
接下来,我们定义了一个 Dog
结构体,用于表示狗的基本信息,包括名字。
type Dog struct {
name string // 名字。
}
实现接口方法
我们为 Dog
结构体实现了 Pet
接口中的方法。需要注意的是,SetName
方法接收一个指向 Dog
结构体的指针,这意味着它可以修改原始结构体的内容。
func (dog *Dog) SetName(name string) {
dog.name = name
}
func (dog Dog) Name() string {
return dog.name
}
func (dog Dog) Category() string {
return "dog"
}
主函数
在 main
函数中,我们创建了一个 Dog
实例,并检查 Dog
结构体和 *Dog
指针是否实现了 Pet
接口。
func main() {
// 示例1。
dog := Dog{"little pig"}
_, ok := interface{}(dog).(Pet)
fmt.Printf("Dog implements interface Pet: %v\\n", ok)
_, ok = interface{}(&dog).(Pet)
fmt.Printf("*Dog implements interface Pet: %v\\n", ok)
fmt.Println()
// 示例2。
var pet Pet = &dog
fmt.Printf("This pet is a %s, the name is %q.\\n",
pet.Category(), pet.Name())
}
运行结果
运行上述代码,输出结果如下:
Dog implements interface Pet: false
*Dog implements interface Pet: true
This pet is a dog, the name is "little pig".
举一反三
通过这个示例,我们可以举一反三地应用这些概念。例如,我们可以定义一个 Cat
结构体,并实现类似的方法和接口:
type Cat struct {
name string
}
func (cat *Cat) SetName(name string) {
cat.name = name
}
func (cat Cat) Name() string {
return cat.name
}
func (cat Cat) Category() string {
return "cat"
}
然后,我们可以在 main
函数中创建 Cat
实例,并检查其行为:
func main() {
// 示例1。
cat := Cat{"whiskers"}
_, ok := interface{}(cat).(Pet)
fmt.Printf("Cat implements interface Pet: %v\\n", ok)
_, ok = interface{}(&cat).(Pet)
fmt.Printf("*Cat implements interface Pet: %v\\n", ok)
fmt.Println()
// 示例2。
var pet Pet = &cat
fmt.Printf("This pet is a %s, the name is %q.\\n",
pet.Category(), pet.Name())
}
总结
通过这个教程,我们深入探讨了Go语言中的接口和结构体,并展示了如何举一反三地应用这些概念。理解这些基础知识将帮助你在Go语言中构建更复杂和灵活的程序。
Go语言教程:深入理解接口与结构体 2
https://blog.ithuo.net/posts/go-tutorial-interface-struct-2/