關(guān)于Golang面試寶典
最近幾年,Go的熱度持續(xù)飆升絮重,國內(nèi)外很多大公司都在大規(guī)模的使用Go冤寿。Google是Go語言誕生的地方,其他公司如Facebook青伤、騰訊督怜、阿里、字節(jié)跳動潮模、百度亮蛔、京東、小米等都在擁抱和轉(zhuǎn)向Go擎厢。Go語言的開源項目也非常多究流,如kubernetes辣吃、docker、etcd芬探。
隨著市場對Go語言人才需求的增長神得,很多開發(fā)者都投入了Go語言的懷抱。本系列文章將以第一視角與大家一同開始Golang的面試之路偷仿,希望大家能夠有所收獲哩簿,拿下心儀的offer。
使用Go實現(xiàn)23種設(shè)計模式——結(jié)構(gòu)型模式(下)
外觀模式
隱藏系統(tǒng)的復(fù)雜性酝静,并向客戶端提供了一個客戶端可以訪問系統(tǒng)的接口节榜,使得這一子系統(tǒng)更加容易使用
適用場景
- 為一個復(fù)雜子系統(tǒng)提供一個簡單接口供外界訪問
Go語言實現(xiàn)
type Animal struct {
dog *Dog
cat *Cat
}
func NewAnimal() *Animal {
return &Animal{
dog: &Dog{},
cat: &Cat{},
}
}
func (a *Animal) Speak() {
a.dog.Speak()
a.cat.Speak()
}
type Dog struct {}
func (a *Dog) Speak() {
fmt.Println("汪汪汪")
}
type Cat struct {}
func (a *Cat) Speak() {
fmt.Println("喵喵喵")
}
func main() {
a := NewAnimal()
a.Speak()
}
外觀模式優(yōu)點
- 降低了子系統(tǒng)與客戶端之間的耦合度肥照,子系統(tǒng)的變化不影響調(diào)用它的客戶端
- 對客戶屏蔽了子系統(tǒng)組件耕陷,減少了客戶端處理對象的數(shù)目并使得子系統(tǒng)使用更加方便
外觀模式缺點
- 不能很好的限制客戶使用子系統(tǒng)類桩匪,容易帶來未知風(fēng)險
- 增加新的子系統(tǒng)可能需要修改外觀類坑律,違背了"開閉原則"
享元模式
運用共享技術(shù)有效的支持大量細(xì)粒度的對象
適用場景
- 如果程序中使用了大量的對象,且這些對象造成了很大的儲存開銷
- 如果對象的大多數(shù)狀態(tài)可以給外部狀態(tài)锰悼,如果刪除對象的外部狀態(tài)勒极,可以用相對較少的共享對象取代很多對象
Go語言實現(xiàn)
type IFlyWeight interface {
Run()
}
type FlyWeight struct {
key string
}
func (f FlyWeight) Run() {
fmt.Println(f.key)
}
type FactoryFlyWeight struct {
flyWeight map[string]FlyWeight
}
func NewFactoryFlyWeight() *FactoryFlyWeight {
return &FactoryFlyWeight{flyWeight: make(map[string]FlyWeight)}
}
func (f *FactoryFlyWeight) GetFlyWeight(key string) (fly FlyWeight) {
var ok bool
if fly, ok = f.flyWeight[key]; !ok {
fly = FlyWeight{key: key}
f.flyWeight[key] = fly
}
return fly
}
func (f *FactoryFlyWeight) Count() int {
return len(f.flyWeight)
}
func main() {
a := NewFactoryFlyWeight()
a.GetFlyWeight("A").Run()
a.GetFlyWeight("A").Run()
a.GetFlyWeight("B").Run()
fmt.Println(a.Count())
}
享元模式優(yōu)點
- 減少對象的創(chuàng)建饲帅,提高效率
- 縮小內(nèi)存中對象的數(shù)量
享元模式缺點
- 使系統(tǒng)更加復(fù)雜敞恋,需要分離出內(nèi)部狀態(tài)和外部狀態(tài)丽啡,使得程序的邏輯更加復(fù)雜
- 享元對象狀態(tài)外部化,使運行時間變長
代理模式
為其他對象提供一種代理以控制對這個對象的訪問
適用場景
- 監(jiān)控硬猫、統(tǒng)計补箍、鑒權(quán)、限流等
Go語言實現(xiàn)
type IExecutor interface {
RunFunc()
}
type SyncExecutor struct {
}
func (e SyncExecutor) RunFunc() {
time.Sleep(time.Second)
}
type ExecutorProxy struct {
executor IExecutor
}
func NewExecutorProxy(e IExecutor) *ExecutorProxy {
return &ExecutorProxy{executor: e}
}
func (e *ExecutorProxy) RunFunc() {
start := time.Now()
e.executor.RunFunc()
fmt.Printf("運行用時: %+v", time.Since(start))
}
func main() {
a := NewExecutorProxy(proxy.SyncExecutor{})
a.RunFunc()
}
代理模式優(yōu)點
- 在客戶端和目標(biāo)對象間起到一個中介作用浦徊,保護目標(biāo)對象
- 可以擴展目標(biāo)對象的功能
- 將客戶端和目標(biāo)對象分離馏予,降低了系統(tǒng)耦合度,增加了程序的可擴展性
代理模式缺點
- 使系統(tǒng)設(shè)計中類的數(shù)量增多盔性,增加了系統(tǒng)的復(fù)雜度
- 在客戶端和目標(biāo)對象間增加一個代理對象,請求速度變慢