Browse Source

add golang articles

joe 3 years ago
parent
commit
ad09df2f30
2 changed files with 88 additions and 9 deletions
  1. 15 9
      content/languages/go/go-tricks-1.md
  2. 73 0
      content/languages/go/go-tricks-2.md

+ 15 - 9
content/languages/go/go-tricks-1.md

@@ -11,12 +11,14 @@ draft: true
 interface and its function wrapper defination
 
 ```golang
+// 事件接口
 interface IEventHandler {
     DoSomething() int
 }
 
+// 單接口的函數 Wrapper
 type IEventHandlerWrapper func() int
-
+// 實現事件接口
 func (ehw IEventHandlerWrapper)DoSomething() int {
     return ehw()
 }
@@ -24,14 +26,16 @@ func (ehw IEventHandlerWrapper)DoSomething() int {
 
 ### Example
 
-在某处定义
-
+注冊中心
 ```golang
-func RegisterEvent(ev string, handler IEventHandler);
+// 注冊事件處理函數
+var registered map[string]IEventHandler
+func RegisterEvent(ev string, handler IEventHandler) {
+    registered[ev] = handler
+}
 ```
 
-可以更灵活处理
-
+注冊事件處理函數
 ```golang
 type SomeLogic struct {}
 
@@ -44,11 +48,13 @@ func (sl *SomeLogic) DoSomething() int {
 
 // register
 
-// 1.
+// 方式1.
 RegisterEvent("something", &SomeLogic{})
 
-// 2. write inplace.
+// 方式2. write inplace.
 RegisterEvent("others", IEventHandlerWrapper(func()int{
     return 0
 }))
-```
+```
+
+使事件處理函數及其類似的應用場景同時支持 interface implementation 和 lambda

+ 73 - 0
content/languages/go/go-tricks-2.md

@@ -0,0 +1,73 @@
+---
+title: "Go Tricks 2"
+date: 2022-04-06T11:52:50+07:00
+draft: true
+---
+
+## Option 模式
+
+1. 不定參數
+
+Golang 中簡單的動態參數實現
+
+```golang
+func Foo(name string, limits... int) {
+    // default options
+    page, size := 1, 20
+
+    // dynamic
+    if len(limits) > 1 {
+        page = limits[0]
+        size = limits[1]
+    } else if len(limits) > 0 {
+        page = limits[0]
+    }
+    // go on
+}
+```
+
+2. Option 模式
+
+由不定參數衍生出的 Option 模式,可以實現靈活配置對象,產生更幹淨的代碼,自由的升級。
+
+```golang
+// 對象定義
+type HTTPClient struct {
+    version string
+
+    timeout int
+    headers map[string]string
+}
+
+// 針對對象的可選項定義
+type HTTPClientOption func(hc *HTTPClient)
+
+// 可選項配置函數
+func WithTimeout(timeout int) HTTPClientOption {
+    return func(hc *HTTPClient) {
+        ht.timeout = timeout
+    }
+}
+
+func WithDefaultHeaders(headers map[string][string]) HTTPClientOption {
+    return func(hc *HTTPClient) {
+        hc.headers = headers
+    }
+}
+
+// 對象初始化函數
+// 參數包含必選項和可選項
+func NewHttpClient(version string, options... HTTPClientOption) *HTTPClient {
+    c := &HTTPClient{
+        version: version,
+    }
+
+    for _, option := range options {
+        option(c)
+    }
+
+    return c
+}
+```
+
+Option 模式使得對象(本例中的 HTTPClient)在增刪字段(升級)時,保持初始化接口(NewHTTPClient)前後兼容。