INTERFACE · REGISTRY Cơ bản CA 03 / 07

Thêm một cổng thanh toán mới

Hệ thống có interface PaymentProvider. Mỗi nhà cung cấp nằm trong một file riêng và tự đăng ký vào registry ngay khi package được nạp:

type PaymentProvider interface {
    Name() string
    Charge(ctx context.Context, amount int) error
}

var registry = map[string]PaymentProvider{}
func register(p PaymentProvider) { registry[p.Name()] = p }

// stripe.go — một file, một provider
type stripe struct{}
func (stripe) Name() string { return "stripe" }
func (stripe) Charge(ctx context.Context, amount int) error { return nil }
func init() { register(stripe{}) } // tự gắn mình vào registry

Sếp yêu cầu thêm cổng “VNPay”. Bạn phải đụng vào bao nhiêu chỗ để nó chạy trong hệ thống?