精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從 Kubernetes 學習 Go 接口封裝

開發 后端
本文將介紹幾種常見的封裝策略,包括使用接口隱藏輸入參數細節、方便 Mock 測試的接口抽象、多種底層實現的接口封裝,以及對協程異常處理、WaitGroup 使用和基于信號量觸發邏輯的封裝實踐。

在 Go 項目開發中,為了提高代碼的可讀性、可維護性和可測試性,合理的封裝和抽象至關重要。本文將介紹幾種常見的封裝策略,包括使用接口隱藏輸入參數細節、方便 Mock 測試的接口抽象、多種底層實現的接口封裝,以及對協程異常處理、WaitGroup 使用和基于信號量觸發邏輯的封裝實踐。通過這些技巧,可以讓各層代碼只關注自身職責,實現低耦合、高復用的設計。

使用接口隱藏輸入參數細節

當一個方法的輸入參數是結構體時,內部調用會暴露過多的細節。此時,可以將輸入隱式轉換為接口,使內部實現僅能看到所需的方法。

type Kubelet struct{}

func (kl *Kubelet) HandlePodAdditions(pods []*Pod) {
  for _, pod := range pods {
    fmt.Printf("create pods : %s\n", pod.Status)
  }
}

func (kl *Kubelet) Run(updates <-chan Pod) {
  fmt.Println(" run kubelet")
  go kl.syncLoop(updates, kl)
}

func (kl *Kubelet) syncLoop(updates <-chan Pod, handler SyncHandler) {
  for {
    select {
    case pod := <-updates:
      handler.HandlePodAdditions([]*Pod{&pod})
    }
  }
}

type SyncHandler interface {
  HandlePodAdditions(pods []*Pod)
}

在這里,Kubelet 本身有多個方法:

  • syncLoop:用于狀態同步的循環;
  • Run:啟動監聽循環;
  • HandlePodAdditions:處理 Pod 添加的邏輯。

由于 syncLoop 并不需要訪問 kubelet 的其他方法,我們定義了 SyncHandler 接口,讓 kubelet 實現該接口,并將 kubelet 作為 SyncHandler 傳入 syncLoop,這樣 kubelet 會被類型轉換為 SyncHandler。

轉換后,syncLoop 的參數中將不再暴露 kubelet 的其他方法,使你在編寫 syncLoop 時更專注于內部邏輯。

但這種做法也可能帶來問題:初始抽象可能能滿足第一版需求,但隨著需求增長,如果需要在 syncLoop 中調用接口未包含的 kubelet 方法,就必須要么顯式傳入 kubelet,要么擴展接口,這兩種方式都會增加編碼成本并破壞原有封裝。

分層封裝與隱藏是設計目標,讓代碼的每一部分只關注自身職責。

便于 Mock 測試的接口封裝

通過接口抽象,我們可以在測試時直接實例化 mock 結構體,用于無需關注的部分。

type OrderAPI interface {
  GetOrderId() string
}

type realOrderImpl struct{}

func (r *realOrderImpl) GetOrderId() string {
  return ""
}

type mockOrderImpl struct{}

func (m *mockOrderImpl) GetOrderId() string {
  return "mock"
}

這里如果在測試時不關心 GetOrderId 是否正常工作,就可以直接用 mockOrderImpl 初始化 OrderAPI,且 mock 中的邏輯可根據需要任意復雜化。

func TestGetOrderId(t *testing.T) {
  orderAPI := &mockOrderImpl{} // 如果我們需要獲取訂單 ID,但這不是測試的重點,只需用 mock 結構體初始化
  fmt.Println(orderAPI.GetOrderId())
}

gomonkey 也可以用于測試注入,因此即使現有代碼沒有通過接口封裝,我們仍能實現 mock,而且這種方式更為強大。

patches := gomonkey.ApplyFunc(GetOrder, func(orderId string) Order {
    return Order{
      OrderId:    orderId,
      OrderState: delivering,
    }
  })
  return func() {
    patches.Reset()
  }

使用 gomonkey 可以實現更靈活的 mock,因為它可以直接設置函數的返回值,而接口抽象只能處理由結構體實例化的內容。

多種底層實現的接口封裝

像 iptables 和 ipvs 這樣的實現是通過接口抽象來完成的,因為所有網絡設置都需要同時處理 Service 和 Endpoint。因此,它們抽象出了 ServiceHandler 和 EndpointSliceHandler:

// ServiceHandler 是用于接收 Service 對象變更通知的抽象接口
type ServiceHandler interface {
    // 當檢測到新的 Service 對象被創建時調用
    OnServiceAdd(service *v1.Service)
    // 當檢測到已有 Service 對象被修改時調用
    OnServiceUpdate(oldService, service *v1.Service)
    // 當檢測到已有 Service 對象被刪除時調用
    OnServiceDelete(service *v1.Service)
    // 當所有初始事件處理完成且狀態已完全同步到本地緩存后調用
    OnServiceSynced()
}

// EndpointSliceHandler 是用于接收 EndpointSlice 對象變更通知的抽象接口
type EndpointSliceHandler interface {
    // 當檢測到新的 EndpointSlice 對象被創建時調用
    OnEndpointSliceAdd(endpointSlice *discoveryv1.EndpointSlice)
    // 當檢測到已有 EndpointSlice 對象被修改時調用
    OnEndpointSliceUpdate(oldEndpointSlice, newEndpointSlice *discoveryv1.EndpointSlice)
    // 當檢測到已有 EndpointSlice 對象被刪除時調用
    OnEndpointSliceDelete(endpointSlice *discoveryv1.EndpointSlice)
    // 當所有初始事件處理完成且狀態已完全同步到本地緩存后調用
    OnEndpointSlicesSynced()
}

然后可以通過 Provider 注入:

type Provider interface {
  config.EndpointSliceHandler
  config.ServiceHandler
}

這也是我在編寫組件時最常用的編碼技巧:通過對相似操作的抽象,上層代碼在替換底層實現后無需做任何改動。

封裝異常處理

如果我們在啟動 goroutine 后不捕獲異常,異常會導致該 goroutine 直接 panic。但是每次都寫全局的 recover 邏輯并不優雅,因此我們可以使用封裝好的 HandleCrash 方法:

package runtime

var (
  ReallyCrash = true
)

// 默認的全局 Panic 處理器
var PanicHandlers = []func(interface{}){logPanic}

// 支持從外部傳入額外的自定義 panic 處理器
func HandleCrash(additionalHandlers ...func(interface{})) {
  if r := recover(); r != nil {
    for _, fn := range PanicHandlers {
      fn(r)
    }
    for _, fn := range additionalHandlers {
      fn(r)
    }
    if ReallyCrash {
      panic(r)
    }
  }
}

這既支持內部異常處理,也支持外部注入額外的處理器。如果不想讓程序崩潰,可以根據需要修改邏輯。

package runtime

func Go(fn func()) {
  go func() {
    defer HandleCrash()
    fn()
  }()
}

在啟動 goroutine 時,可以使用 Go 方法,這樣也能避免忘記添加 panic 處理。

封裝 WaitGroup

import "sync"

type Group struct {
  wg sync.WaitGroup
}

func (g *Group) Wait() {
  g.wg.Wait()
}

func (g *Group) Start(f func()) {
  g.wg.Add(1)
  go func() {
    defer g.wg.Done()
    f()
  }()
}

這里最重要的是 Start 方法,它在內部封裝了 Add 和 Done。雖然只有幾行代碼,但它確保每次使用 WaitGroup 時,都不會忘記增加或完成計數器。

封裝由信號量觸發的邏輯

type BoundedFrequencyRunner struct {
  sync.Mutex

  // Actively triggered
  run chan struct{}

  // Timer limit
  timer *time.Timer

  // The actual logic to execute
  fn func()
}

func NewBoundedFrequencyRunner(fn func()) *BoundedFrequencyRunner {
  return &BoundedFrequencyRunner{
    run:   make(chan struct{}, 1),
    fn:    fn,
    timer: time.NewTimer(0),
  }
}

// Run triggers execution; only one signal can be written here, additional signals are discarded without blocking. You can increase the queue size as needed.
func (b *BoundedFrequencyRunner) Run() {
  select {
  case b.run <- struct{}{}:
    fmt.Println("Signal written successfully")
  default:
    fmt.Println("Signal already triggered once, discarding")
  }
}

func (b *BoundedFrequencyRunner) Loop() {
  b.timer.Reset(time.Second * 1)
  for {
    select {
    case <-b.run:
      fmt.Println("Run signal triggered")
      b.tryRun()
    case <-b.timer.C:
      fmt.Println("Timer triggered execution")
      b.tryRun()
    }
  }
}

func (b *BoundedFrequencyRunner) tryRun() {
  b.Lock()
  defer b.Unlock()
  // You can add logic here such as rate limiting
  b.timer.Reset(time.Second * 1)
  b.fn()
}
責任編輯:趙寧寧 來源: 令飛編程
相關推薦

2025-06-09 10:08:00

KubernetesGo容器

2022-12-15 08:30:35

Flannel網絡磁盤

2020-12-30 08:00:00

Kubernetes開發機器學習

2024-01-02 10:46:14

2021-02-03 15:10:38

GoKubernetesLinux

2020-04-28 10:28:30

Kubernetes操作系統運維

2020-05-21 08:58:34

Kubernetes操作系統運維

2022-09-19 08:07:28

Goweb 程序

2023-12-27 06:48:49

KubernetesDevOpsHTTP

2023-10-28 15:37:39

Go編程語言

2022-10-17 08:07:13

Go 語言并發編程

2024-01-15 06:45:29

Go編程代碼

2024-01-07 13:25:32

Go編程代碼

2021-10-23 06:42:14

Go語言接口

2023-08-03 07:34:34

格式化字符串參數

2023-08-29 08:20:35

Kubernete跨云容器

2025-07-25 11:00:00

云計算云原生數據

2009-08-24 14:30:49

C# WMI封裝

2021-01-06 09:47:51

內存Go語言

2021-10-31 15:46:34

Go語言進程
點贊
收藏

51CTO技術棧公眾號

婷婷伊人五月天| 国产黄色片免费在线观看| 一区二区视频在线免费观看| 日本女优一区| 欧美电影在线免费观看| 免费极品av一视觉盛宴| 日韩一级免费视频| 青娱乐精品视频| 亚洲人成电影网站| 中文字幕第100页| 91麻豆一二三四在线| 成人黄色综合网站| 国产精品人成电影在线观看| 欧美 日韩 国产 一区二区三区| 最新精品在线| 欧美中文字幕一区二区三区| 国产欧美自拍视频| 欧美 日韩 国产 成人 在线| 香蕉久久夜色精品| 久久天天躁狠狠躁夜夜躁2014| 日日干夜夜操s8| 国内在线视频| 国产精品乱码人人做人人爱| 国产高清不卡av| 中文字幕在线观看高清| 亚洲婷婷在线| 最近2019中文字幕mv免费看 | 神马久久久久久久久久| 裸体素人女欧美日韩| 欧美另类xxx| 强伦人妻一区二区三区| 77成人影视| 欧美麻豆精品久久久久久| 玩弄中年熟妇正在播放| www.久久ai| 中文字幕不卡三区| 精品不卡在线| 国产aⅴ一区二区三区| 久久电影一区| 久久久久久久久中文字幕| 超碰人人人人人人人| 精品国产导航| 欧美一区二区三区影视| 美女少妇一区二区| 伊人久久综合一区二区| 亚洲国产精品久久久男人的天堂| 中文字幕av日韩精品| 免费在线视频你懂得| 丁香婷婷深情五月亚洲| 国产日韩欧美日韩大片| 精品成人无码久久久久久| 亚洲福利专区| 欧美激情一区二区三区久久久| 国产精品18在线| 综合综合综合综合综合网| 日韩欧美你懂的| 免费精品99久久国产综合精品应用| 欧美艳星kaydenkross| 午夜精品久久久久久久久久| 日本中文字幕一级片| 国产最新视频在线| 久久这里只有精品6| 动漫3d精品一区二区三区| 亚洲风情第一页| 从欧美一区二区三区| 精品欧美日韩在线| 国产一级网站视频在线| 国产精品久久久久久妇女6080| 亚洲精品一区二区三| 麻豆传媒在线免费| 一区二区三区色| 霍思燕三级露全乳照| 2022成人影院| 欧美日韩成人综合在线一区二区| 亚洲制服在线观看| 成功精品影院| 亚洲人成电影网| 久久久久人妻一区精品色| 欧美日本一区二区高清播放视频| 久久久久久有精品国产| 在线永久看片免费的视频| 免费人成在线不卡| 亚洲最大的成人网| 亚洲伦理在线观看| 国产欧美在线观看一区| 无码人妻aⅴ一区二区三区日本| 丁香花在线高清完整版视频 | 波多野结衣家庭教师在线| av资源亚洲| 51午夜精品国产| 中文成人无字幕乱码精品区| 国产成人精品三级高清久久91| 色777狠狠综合秋免鲁丝| 久一视频在线观看| 欧美aaa在线| 懂色一区二区三区av片| 国产三级视频在线| 亚洲一区二区三区在线播放| 热久久精品国产| 久久gogo国模啪啪裸体| 亚洲精品在线不卡| 欧美黄色一级网站| 日韩有码一区二区三区| 99国产在线观看| 成年人在线观看| 亚洲va欧美va人人爽午夜| chinese少妇国语对白| youjizz亚洲| 最近日韩中文字幕中文| 国产黄色片免费看| 国产激情偷乱视频一区二区三区 | 美女黄色一级视频| 久久高清免费| 国产成人97精品免费看片| 亚洲第一天堂网| 一区在线观看视频| 欧美牲交a欧美牲交aⅴ免费真| 麻豆精品一区| 色偷偷综合社区| 91视频在线视频| 成人av在线网| 国产内射老熟女aaaa| 日本.亚洲电影| 亚洲欧美精品一区二区| 国产一级在线播放| 国产精品12区| 男女h黄动漫啪啪无遮挡软件| 高清不卡av| 日韩av中文字幕在线播放| 国产一级做a爱免费视频| 韩国三级在线一区| 一区二区三视频| 成人黄色毛片| 在线亚洲午夜片av大片| www.色国产| 久久亚洲春色中文字幕久久久| 国产真人做爰毛片视频直播| 视频一区中文字幕精品| 久久精品99久久香蕉国产色戒| 国产99久久久| 99精品在线免费| 国产aaa免费视频| 综合欧美亚洲| 久久久久久久久久久免费| 精品国产无码AV| 玉足女爽爽91| 免费在线观看日韩av| 精品动漫3d一区二区三区免费版| 亚洲sss综合天堂久久| av在线麻豆| 日韩午夜在线观看| 久久综合亚洲色hezyo国产| 国产成人在线影院| 屁屁影院ccyy国产第一页| 91夜夜蜜桃臀一区二区三区| 久久久久久久久久婷婷| 特黄aaaaaaaaa真人毛片| 午夜影视日本亚洲欧洲精品| 艳妇乳肉豪妇荡乳xxx| 99热免费精品在线观看| 开心色怡人综合网站| 欧美韩国亚洲| 日韩一区二区三区国产| a级片在线免费看| 亚洲成人免费看| 亚洲久久久久久| 亚洲一区国产| 亚洲成色最大综合在线| 9999精品视频| 欧美精品xxx| 免费黄网站在线观看| 欧美亚洲国产一区在线观看网站 | 福利在线播放| 欧美日韩成人综合在线一区二区 | 日韩欧美在线观看视频| 草草影院第一页| 另类小说视频一区二区| 国产精品av免费观看| 99久久香蕉| 国产97在线|日韩| 1769免费视频在线观看| 亚洲第一区第一页| 五月婷婷丁香在线| 一区二区久久久久久| 黄色性生活一级片| 久久99精品国产麻豆婷婷洗澡| 国产女主播自拍| 激情婷婷综合| 国产精品乱码视频| 99久久综合国产精品二区| 欧美另类极品videosbestfree| 日韩av成人| 日韩欧美一区二区免费| 香蕉影院在线观看| 亚洲伦理在线精品| 精品无码人妻一区| 国产精品一级片在线观看| 成年人网站大全| 国产精品av久久久久久麻豆网| 免费在线一区二区| 日韩三级精品| 国产精品久久久久9999| 欧美日韩国产观看视频| 久久久精品久久| 国产在线观看精品一区| 精品国产三级a在线观看| 中文在线免费观看| 午夜国产精品一区| 动漫性做爰视频| 国产亚洲精久久久久久| chinese麻豆新拍video| 国产精品99久久久久久有的能看| 久久9精品区-无套内射无码| 午夜精品网站| 综合国产精品久久久| 精品香蕉视频| 麻豆蜜桃91| 国产香蕉精品| 99在线免费观看视频| 在线观看欧美| 国产精品人成电影| 亚洲综合在线电影| 欧美在线视频一区二区| 黄页网站在线| 欧美刺激性大交免费视频| 在线观看黄色av| 中文字幕欧美在线| 精品乱码一区二区三四区视频 | 在线观看不卡视频| www.国产高清| 福利精品视频在线| 日韩精品――中文字幕| 亚洲自拍偷拍网站| 精品97人妻无码中文永久在线| 国产精品国产精品国产专区不蜜| 魔女鞋交玉足榨精调教| 久久久亚洲欧洲日产国码αv| www.88av| 久久综合狠狠综合| 蜜桃无码一区二区三区| 国产亚洲综合av| 久久久久无码精品国产sm果冻 | 亚洲成人一区二区三区| 欧洲杯半决赛直播| 亚洲乱码一区二区三区| 欧美gvvideo网站| 综合久久国产| 欧美1区视频| 轻点好疼好大好爽视频| 伊人久久亚洲热| 国产在线精品91| 免费亚洲网站| 欧美精品aaaa| 久久99热国产| 人妻体体内射精一区二区| 国产成人福利片| jjzzjjzz欧美69巨大| 成人99免费视频| www.中文字幕av| 欧美激情在线看| 一级性生活免费视频| 亚洲久草在线视频| 国产在线视频二区| 一道本成人在线| 中文字幕欧美人妻精品| 91精品国产免费久久综合| 国内精品久久久久久久久久久| 日韩欧美高清dvd碟片| 婷婷在线观看视频| 亚洲网站视频福利| 久久久久久久久免费视频| 欧美另类极品videosbestfree| 欧亚在线中文字幕免费| 国产精品爽爽爽爽爽爽在线观看| 日韩在线亚洲| 欧美高清视频一区二区三区在线观看| 国产探花一区| 女同性恋一区二区| 亚洲综合日韩| 在线观看免费的av| 成人午夜又粗又硬又大| 免费看黄色的视频| 尤物在线观看一区| 欧美a视频在线观看| 777色狠狠一区二区三区| 日韩在线视频免费| 国产一区二区欧美日韩| 日本大胆在线观看| 日产精品99久久久久久| 精品91福利视频| 欧美日韩日本网| 午夜欧美精品久久久久久久| 国产精品无码av无码| 国产成人免费视| 免费看黄色三级| 亚洲成人午夜影院| 一卡二卡在线观看| 精品亚洲一区二区三区| 制服丝袜在线播放| 国产精品久久久久99| 欧美性生活一级片| 路边理发店露脸熟妇泻火| 丝袜美腿亚洲一区| 一区二区免费在线观看视频| 1区2区3区欧美| 日韩精选在线观看| 亚洲国产日韩欧美在线图片| 老司机在线看片网av| 日本一区二区在线免费播放| 999国产精品一区| 黄色一级视频播放| 免费成人在线网站| 亚洲av片不卡无码久久| 洋洋av久久久久久久一区| 中文字幕日本人妻久久久免费| 亚洲加勒比久久88色综合| 最新国产在线拍揄自揄视频| 国产欧美日韩视频| 国产精选一区| av天堂永久资源网| 成年人午夜久久久| 久久久.www| 日韩午夜av一区| 国内精品不卡| 成人伊人精品色xxxx视频| 精品国产午夜| 久久午夜夜伦鲁鲁一区二区| 久久综合久久99| 日日夜夜综合网| 亚洲黄色在线看| 国产精品xx| 精品久久中出| 国产视频一区在线观看一区免费| 无码人妻丰满熟妇区毛片蜜桃精品 | 在线这里只有精品| 男人天堂网在线观看| 欧美一级电影免费在线观看| 卡通动漫精品一区二区三区| 久青草视频在线播放| 成人丝袜高跟foot| 久久久久久久久艹| 精品91自产拍在线观看一区| 免费在线观看av电影| 国产福利久久| 国产毛片一区| 国产熟妇久久777777| 在线视频国产一区| av中文字幕在线| 国产欧美久久一区二区| 久久精品国产大片免费观看| 色哟哟精品视频| 国产精品久久久久婷婷二区次| 亚洲无码精品在线观看| 久久精品国产精品| 视频成人永久免费视频| 女人帮男人橹视频播放| aaa亚洲精品| 无码一区二区三区| 最新国产精品拍自在线播放| 久久久久久亚洲精品美女| 青青草视频国产| 91一区二区在线| 影音先锋黄色网址| 久久色免费在线视频| 亚洲国产欧美国产第一区| av免费看网址| 国产日韩欧美电影| 国产男女猛烈无遮挡| 久久久久国产精品一区| 一区二区美女| 一级黄色特级片| 亚洲国产精品一区二区www在线| 青春草在线观看 | 亚洲影视一区二区| 欧美国产日韩中文字幕在线| 人体久久天天| 日本黄大片一区二区三区| 一区二区三区久久久| 青青久在线视频| 川上优av一区二区线观看 | 手机在线看福利| 亚洲美女视频一区| 免费福利在线观看| 亚洲一区久久久| 国产精品久久久免费| 成人信息集中地| 亚洲а∨天堂久久精品9966| 日本精品另类| 女人帮男人橹视频播放| 日本一区二区三区视频视频| www.爱爱.com| 国产精品久久97| 亚洲片区在线| 免费精品在线视频| 精品中文字幕久久久久久| 伊人久久一区| 性欧美极品xxxx欧美一区二区| 夜夜嗨av一区二区三区网页| 九色视频网站在线观看| 福利视频久久|