package mainimport "fmt"// 定义一个存储器接口:支持mysql存储、redis存储
type StorageManager interface {insert(data string) int // 增加update(id int, data string) int // 更新
}// 实现一个Mysql存储器
type Mysql struct{}func (mysql *Mysql) insert(data string) int {fmt.Println("写入Mysql:", mysql)return 1
}func (mysql *Mysql) update(id int, data string) int {fmt.Println("更新Mysql:", id, data)return 1
}// 实现一个Redis存储器
type Redis struct {address stringport int
}func (redis Redis) insert(data string) int {fmt.Println(redis.address, ":", redis.port)fmt.Println("写入Redis:", data)return 1
}func (redis Redis) update(id int, data string) int {fmt.Println(redis.address, ":", redis.port)fmt.Println("更新Redis:", id, data)return 1
}func insertData(s StorageManager, data string) {s.insert(data)
}func updateData(s StorageManager, id int, data string) {s.update(id, data)
}func main() {r := Redis{"192.168.2.220", 6379}insertData(r, "111")updateData(r, 1, "222")
}
值得注意的是,为什么 r := Redis{"192.168.2.220", 6379},这里的 r 可以作为 StorageManager 类型传入 insertData 和 updateData 函数?
因为 Redis 类型实现了 StorageManager 接口中定义的所有方法(记住,是所有方法都必须实现定义)。在Go语言中,如果一个类型包含了接口中定义的所有方法,那么该类型就隐式地实现了该接口。
在这里,Redis 类型实现了 insertData 和 updateData 方法,因此它可以被当做 StorageManager 类型使用。