package main import "fmt" // ========== 接口定义 ========== // 支付接口 - 定义支付行为契约 type Payment interface { Pay(amount float64) bool Refund(amount float64) bool GetBalance() float64 GetProviderName() string } // ========== 结构体定义 ========== // 支付宝支付 type Alipay struct { Account string Balance float64 } // 微信支付 type WechatPay struct { OpenID string Balance float64 Frozen float64 // 冻结金额 } // 银行卡支付 type BankCard struct { CardNumber string Balance float64 BankName string } // ========== 方法实现 - Alipay ========== func (a *Alipay) Pay(amount float64) bool { if amount <= 0 || amount > a.Balance { fmt.Printf("支付宝支付失败!金额: %.2f, 余额: %.2f\n", amount, a.Balance) return false } a.Balance -= amount fmt.Printf("支付宝支付成功!扣款: %.2f, 剩余余额: %.2f\n", amount, a.Balance) return true } func (a *Alipay) Refund(amount float64) bool { if amount <= 0 { return false } a.Balance += amount fmt.Printf("支付宝退款成功!退款: %.2f, 当前余额: %.2f\n", amount, a.Balance) return true } func (a Alipay) GetBalance() float64 { return a.Balance } func (a Alipay) GetProviderName() string { return "支付宝" } // ========== 方法实现 - WechatPay ========== func (w *WechatPay) Pay(amount float64) bool { available := w.Balance - w.Frozen if amount <= 0 || amount > available { fmt.Printf("微信支付失败!金额: %.2f, 可用余额: %.2f\n", amount, available) return false } w.Balance -= amount fmt.Printf("微信支付成功!扣款: %.2f, 剩余余额: %.2f\n", amount, w.Balance) return true } func (w *WechatPay) Refund(amount float64) bool { if amount <= 0 { return false } w.Balance += amount fmt.Printf("微信退款成功!退款: %.2f, 当前余额: %.2f\n", amount, w.Balance) return true } func (w WechatPay) GetBalance() float64 { return w.Balance } func (w WechatPay) GetProviderName() string { return "微信支付" } // 微信特有方法(不在接口中) func (w *WechatPay) FreezeAmount(amount float64) { w.Frozen += amount fmt.Printf("冻结金额: %.2f, 总冻结: %.2f\n", amount, w.Frozen) } func (w *WechatPay) UnfreezeAmount(amount float64) { if amount <= w.Frozen { w.Frozen -= amount fmt.Printf("解冻金额: %.2f, 剩余冻结: %.2f\n", amount, w.Frozen) } } // ========== 方法实现 - BankCard ========== func (b *BankCard) Pay(amount float64) bool { if amount <= 0 || amount > b.Balance { fmt.Printf("银行卡支付失败!金额: %.2f, 余额: %.2f\n", amount, b.Balance) return false } b.Balance -= amount fmt.Printf("银行卡支付成功!扣款: %.2f, 剩余余额: %.2f\n", amount, b.Balance) return true } func (b *BankCard) Refund(amount float64) bool { if amount <= 0 { return false } b.Balance += amount fmt.Printf("银行卡退款成功!退款: %.2f, 当前余额: %.2f\n", amount, b.Balance) return true } func (b BankCard) GetBalance() float64 { return b.Balance } func (b BankCard) GetProviderName() string { return b.BankName + "银行卡" } // ========== 工具函数(使用接口) ========== // 处理支付 - 接受任何实现 Payment 接口的类型 func ProcessPayment(p Payment, amount float64) bool { fmt.Printf("\n开始处理支付...\n") fmt.Printf("支付方式: %s\n", p.GetProviderName()) fmt.Printf("当前余额: %.2f\n", p.GetBalance()) success := p.Pay(amount) if success { fmt.Printf("✅ 支付处理完成\n") } else { fmt.Printf("❌ 支付处理失败\n") } return success } // 批量支付处理 func ProcessBatchPayments(payments []Payment, amount float64) { fmt.Printf("\n=== 批量支付处理 ===\n") successCount := 0 for i, payment := range payments { fmt.Printf("\n第 %d 笔支付:\n", i+1) if ProcessPayment(payment, amount) { successCount++ } } fmt.Printf("\n批量支付结果: 成功 %d/%d\n", successCount, len(payments)) } // 检查支付方式状态 func CheckPaymentStatus(payments []Payment) { fmt.Printf("\n=== 支付方式状态检查 ===\n") for i, payment := range payments { fmt.Printf("%d. %s - 余额: %.2f\n", i+1, payment.GetProviderName(), payment.GetBalance()) } } func main() { fmt.Println("=== 支付系统演示 ===\n") // 创建不同的支付实例 alipay := &Alipay{Account: "zhangsan@alipay.com", Balance: 1000.0} wechat := &WechatPay{OpenID: "wx123456", Balance: 800.0} bankcard := &BankCard{CardNumber: "622588******1234", Balance: 5000.0, BankName: "招商银行"} // 演示微信特有方法 wechat.FreezeAmount(200.0) // 将不同支付方式放入接口切片(多态) payments := []Payment{alipay, wechat, bankcard} // 1. 检查状态 CheckPaymentStatus(payments) // 2. 单笔支付处理 fmt.Println("\n=== 单笔支付演示 ===") ProcessPayment(alipay, 150.0) ProcessPayment(wechat, 100.0) // 注意:微信有冻结金额 // 3. 批量支付处理 ProcessBatchPayments(payments, 50.0) // 4. 退款演示 fmt.Println("\n=== 退款演示 ===") alipay.Refund(50.0) wechat.Refund(30.0) // 5. 最终状态检查 CheckPaymentStatus(payments) // 6. 类型断言演示:访问具体类型的特有方法 fmt.Println("\n=== 类型断言访问特有方法 ===") for _, payment := range payments { // 检查是否是 WechatPay 类型 if wechatPay, ok := payment.(*WechatPay); ok { fmt.Printf("发现微信支付,冻结金额: %.2f\n", wechatPay.Frozen) wechatPay.UnfreezeAmount(100.0) // 解冻部分金额 } } // 7. 类型切换演示 fmt.Println("\n=== 类型切换演示 ===") for i, payment := range payments { switch p := payment.(type) { case *Alipay: fmt.Printf("%d. 支付宝账户: %s\n", i+1, p.Account) case *WechatPay: fmt.Printf("%d. 微信OpenID: %s, 冻结金额: %.2f\n", i+1, p.OpenID, p.Frozen) case *BankCard: fmt.Printf("%d. 银行卡号: %s\n", i+1, p.CardNumber) default: fmt.Printf("%d. 未知支付类型\n", i+1) } } }