住在日本東京,我周圍都是自動販賣機,提供從熱咖啡到冷飲和零食的各種商品。受到這些標誌性機器的啟發,我決定用 Go 建造一個自動販賣機系統設計。這是使用狀態模式的一個很酷的範例,我將詳細解釋為什麼它對於此類專案非常有用。
為什麼要使用自動販賣機?
想像一下真正的自動販賣機 - 它實際上非常複雜!它需要:
- 追蹤產品及其數量
- 處理金錢
- 確保您已存入足夠的現金
- 給你零食
- 退零錢
另外,它需要在完成所有這些操作時不對其所處的狀態感到困惑。
基本建置模組
首先,我需要一些基本結構來使用:
產品與庫存
每個產品都有 ID、名稱、價格和數量。很簡單的東西:
type Product struct { ID int Name string Price float64 Quantity int }
庫存使用地圖追蹤所有產品。它可以:
- 新增產品
- 刪除產品
- 處理交易(例如有人買東西時)
- 檢查產品是否有庫存
狀態模式:為什麼它在這裡很棒
這就是有趣的地方。自動販賣機可以處於不同的狀態:
- 等錢
- 投入金錢
- 已選擇產品
- 分配產品
每個狀態都需要以不同的方式處理使用者操作。就像,你不能在投入資金之前就選擇產品,對吧?
我使用了三個主要狀態:
- MoneyInsertedState
- ProductSelectedState
- ProductDispensedState
每個狀態都實作這個介面:
type State interface { InsertMoney(amount float64) SelectProduct(product *Product) ReturnChange() DispenseProduct() }
如何協同工作
假設您想買可樂:
首先,您插入 2.00 美元
- 機器處於MoneyInsertedState
- 它記錄了你的錢
- 切換到 ProductSelectedState
您選擇可樂($1.50)
- 機器檢查是否有可樂庫存
- 驗證您投入了足夠的資金
- 轉到 ProductDispensedState
機器分配你的可樂
- 更新庫存
- 退還您的 0.50 美元零錢
- 返回 MoneyInsertedState
我添加的很酷的功能
- 庫存管理:每個產品從 3 件開始。當某樣東西售完時,它會自動從可用選項中刪除。
- 智慧找零處理:機器總是在購買後計算並回傳正確的零錢。
- 錯誤預防:狀態模式有助於防止奇怪的情況,例如,嘗試在沒有足夠錢的情況下購買東西,選擇缺貨的產品,在分發東西時插入錢。
我學到了什麼
建構這教會了我一些事:
- 狀態模式非常適合具有清晰、獨特狀態的機器
- Go 的介面讓狀態模式的實作變得非常乾淨
- 正確的錯誤處理對於現實世界的應用程式非常重要
接下來是什麼?
總是有進步的空間!一些想法:
- 新增卡支付支援
- 實作顯示系統
- 添加飲料溫度監控
- 建立用於補貨的管理介面
完整的程式碼比我在這裡展示的更詳細,但這些是使其工作的主要部分。請隨意檢查以下儲存庫中的完整實作:
主題樹
/
低級設計 golang
Golang 中的底層系統設計問題解決方案
Go 中的底層系統設計
歡迎來到Go 中的低階系統設計 儲存庫!此儲存庫包含各種低階系統設計問題及其在 Go 中實現的解決方案。主要目的是透過實際範例展示系統的設計和架構。
目錄
- 概述
- 停車場系統
- 電梯系統
- 圖書館管理系統
- 自動販賣機系統
概述
底層系統設計涉及理解系統架構的核心概念以及設計可擴展、可維護和高效的系統。該存儲庫將嘗試涵蓋使用 Go 的各種問題和場景的解決方案。
停車場系統
此儲存庫中的第一個項目是停車場系統。該系統模擬一個可以停放車輛和出庫車輛的停車場。它示範了:
- 用於管理停車場實例的單例設計模式。
- 處理不同類型的車輛(例如汽車、卡車)。
- 多個樓層的停車位管理。
- 停放車輛的付款處理。
功能
…以上是系統設計:用 Go 建造自動販賣機的詳細內容。更多資訊請關注PHP中文網其他相關文章!

golangisidealforperformance-Critical-clitageAppations and ConcurrentPrompromming,而毛皮刺激性,快速播種和可及性。 1)forhigh-porformanceneeds,pelectgolangduetoitsefefsefefseffifeficefsefeflicefsiveficefsiveandconcurrencyfeatures.2)fordataa-fordataa-fordata-fordata-driventriventriventriventriventrivendissp pynonnononesp

Golang通過goroutine和channel實現高效並發:1.goroutine是輕量級線程,使用go關鍵字啟動;2.channel用於goroutine間安全通信,避免競態條件;3.使用示例展示了基本和高級用法;4.常見錯誤包括死鎖和數據競爭,可用gorun-race檢測;5.性能優化建議減少channel使用,合理設置goroutine數量,使用sync.Pool管理內存。

Golang更適合系統編程和高並發應用,Python更適合數據科學和快速開發。 1)Golang由Google開發,靜態類型,強調簡潔性和高效性,適合高並發場景。 2)Python由GuidovanRossum創造,動態類型,語法簡潔,應用廣泛,適合初學者和數據處理。

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

Go語言在並發編程、性能、學習曲線等方面有獨特優勢:1.並發編程通過goroutine和channel實現,輕量高效。 2.編譯速度快,運行性能接近C語言。 3.語法簡潔,學習曲線平緩,生態系統豐富。

Golang和Python的主要區別在於並發模型、類型系統、性能和執行速度。 1.Golang使用CSP模型,適用於高並發任務;Python依賴多線程和GIL,適合I/O密集型任務。 2.Golang是靜態類型,Python是動態類型。 3.Golang編譯型語言執行速度快,Python解釋型語言開發速度快。

Golang通常比C 慢,但Golang在並發編程和開發效率上更具優勢:1)Golang的垃圾回收和並發模型使其在高並發場景下表現出色;2)C 通過手動內存管理和硬件優化獲得更高性能,但開發複雜度較高。

Golang在雲計算和DevOps中的應用廣泛,其優勢在於簡單性、高效性和並發編程能力。 1)在雲計算中,Golang通過goroutine和channel機制高效處理並發請求。 2)在DevOps中,Golang的快速編譯和跨平台特性使其成為自動化工具的首選。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

Dreamweaver Mac版
視覺化網頁開發工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)