# Go 语言中的 Interface 和 Struct
```go
package mainimport ("fmt"
)// Girl 是一个接口,定义了所有"女性"类型都应该实现的方法
type Girl interface {call()introduce()
}// Wife 结构体代表妻子
type wife struct {name stringage intyearsWed int
}// call 方法的 wife 实现
func (w wife) call() {fmt.Println("I am wife, I can call you!")
}// introduce 方法的 wife 实现
func (w wife) introduce() {fmt.Printf("Hello, I'm %s, %d years old, and we've been married for %d years.\n", w.name, w.age, w.yearsWed)
}// Girlfriend 结构体代表女朋友
type girlfriend struct {name stringage intmonthsDating int
}// call 方法的 girlfriend 实现
func (g girlfriend) call() {fmt.Println("I am girlfriend, I can call you!")
}// introduce 方法的 girlfriend 实现
func (g girlfriend) introduce() {fmt.Printf("Hi, I'm %s, %d years old, and we've been dating for %d months.\n", g.name, g.age, g.monthsDating)
}func main() {// 声明一个 Girl 接口类型的变量var partner Girl// 创建一个 wife 实例并赋值给 partnerpartner = wife{name: "Alice", age: 30, yearsWed: 5}// 调用 wife 的方法partner.call()partner.introduce()// 创建一个 girlfriend 实例并赋值给 partnerpartner = girlfriend{name: "Bob", age: 25, monthsDating: 6}// 调用 girlfriend 的方法partner.call()partner.introduce()
}
返回结果:
I am wife, I can call you!
Hello, I’m Alice, 30 years old, and we’ve been married for 5 years.
I am girlfriend, I can call you!
Hi, I’m Bob, 25 years old, and we’ve been dating for 6 months.
Go 语言中的 Interface 和 Struct
引言
Go 语言以其简洁而强大的特性而闻名,其中 interface 和 struct 是两个核心概念。本文将通过一个简单的例子来解释这两个概念的使用和重要性。
Struct(结构体)
定义和用途
在 Go 中,struct 用于创建自定义类型,类似于其他语言中的类。
示例代码
type wife struct {// 这里可以添加 wife 的特定属性
}type girlfriend struct {// 这里可以添加 girlfriend 的特定属性
}
解释
wife
和girlfriend
是两个不同的 struct。- 它们可以包含各自的属性,尽管在这个例子中没有定义具体的属性。
Interface(接口)
定义和用途
Interface 在 Go 中定义了一组方法签名,任何类型只要实现了这些方法,就被认为实现了该接口。
示例代码
type Wife interface {call()
}
解释
Wife
接口定义了一个call()
方法。- 任何实现了
call()
方法的类型都被视为实现了Wife
接口。
方法实现
为 Struct 实现方法
在 Go 中,我们可以为 struct 定义方法,使其实现接口。
示例代码
func (w wife) call() {fmt.Println("I am wife, I can call you!")
}func (g girlfriend) call() {fmt.Println("I am girlfriend, I can call you!")
}
解释
- 这两个方法使
wife
和girlfriend
结构体都实现了Wife
接口。 - 每个结构体有自己的
call()
方法实现。
多态性
使用接口实现多态
Go 通过接口实现多态,允许不同类型的对象对同一消息做出响应。
示例代码
func main() {var partner Wifepartner = new(wife)partner.call()partner = new(girlfriend)partner.call()
}
解释
partner
变量的类型是Wife
接口。- 它可以存储任何实现了
Wife
接口的类型的值。 - 根据
partner
实际引用的对象,call()
方法会有不同的行为。
总结
通过这个简单的例子,我们可以看到:
- Struct 用于定义自定义类型。
- Interface 定义了一组方法签名。
- 通过为 struct 实现方法,可以使其满足接口的要求。
- 接口允许不同类型的对象以多态的方式被处理。
这种设计使得 Go 语言在保持简洁的同时,提供了强大的面向对象编程能力。