1. 多态的定义
多态是一种允许不同类型的对象通过同一接口进行操作的能力。多态性使得程序可以处理不同类型的对象,而不需要知道对象的具体类型。Go语言通过接口来实现多态。
2. 使用接口实现多态
接口类型的变量可以存储任何实现了该接口的实例。
1 2 3 4 5 6 7 8 9 10 11 12
| func PrintShapeInfo(s Shape) { fmt.Printf("Area: %f\n", s.Area()) fmt.Printf("Perimeter: %f\n", s.Perimeter()) }
func main() { r := Rectangle{Width: 3, Height: 4} c := Circle{Radius: 5}
PrintShapeInfo(r) PrintShapeInfo(c) }
|
在上面的例子中,PrintShapeInfo函数接受一个Shape类型的参数,可以传入任何实现了Shape接口的对象,例如Rectangle和Circle。
3. 空接口
空接口(interface{})是一个不包含任何方法的接口,因此所有类型都实现了空接口。空接口常用于处理未知类型的数据。
1 2 3 4 5 6 7 8 9
| func PrintAnything(i interface{}) { fmt.Println(i) }
func main() { PrintAnything(123) PrintAnything("hello") PrintAnything(true) }
|
4. 类型断言和类型转换
类型断言用于将接口类型的变量转换为具体类型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| func Describe(i interface{}) { switch v := i.(type) { case int: fmt.Println("Integer:", v) case string: fmt.Println("String:", v) default: fmt.Println("Unknown type") } }
func main() { var i interface{} = "hello" Describe(i) }
|
5. 示例
以下示例展示了如何使用接口和多态来定义不同类型的银行账户,并实现存款和取款操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| package main
import "fmt"
type Account interface { Deposit(amount float64) Withdraw(amount float64) error GetBalance() float64 }
type SavingsAccount struct { balance float64 }
func (a *SavingsAccount) Deposit(amount float64) { a.balance += amount }
func (a *SavingsAccount) Withdraw(amount float64) error { if amount > a.balance { return fmt.Errorf("insufficient funds") } a.balance -= amount return nil }
func (a *SavingsAccount) GetBalance() float64 { return a.balance }
type CheckingAccount struct { balance float64 }
func (a *CheckingAccount) Deposit(amount float64) { a.balance += amount }
func (a *CheckingAccount) Withdraw(amount float64) error { if amount > a.balance { return fmt.Errorf("insufficient funds") } a.balance -= amount return nil }
func (a *CheckingAccount) GetBalance() float64 { return a.balance }
func main() { var acc1 Account = &SavingsAccount{} var acc2 Account = &CheckingAccount{}
acc1.Deposit(100) acc2.Deposit(200)
fmt.Println("Savings Account Balance:", acc1.GetBalance()) fmt.Println("Checking Account Balance:", acc2.GetBalance())
acc1.Withdraw(50) acc2.Withdraw(150)
fmt.Println("Savings Account Balance:", acc1.GetBalance()) fmt.Println("Checking Account Balance:", acc2.GetBalance()) }
|