<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] # 將 for-select 語法結構封裝成函數 如果需要中斷 for-select 語法結構,通常是需要使用標簽來實現的,示例如下: ~~~ func main() { L: for { select { case <-time.After(time.Second): fmt.Println("hello") default: break L } } fmt.Println("ending") } ~~~ 如你所見,在 for-select 語法結構中,需要結合標簽的使用來實現中斷。這是一種常見的用法,但是我并不喜歡。因為示例中的循環結構看起來很簡短明了,這樣使用并不顯得有太大的問題,但在實際中通常要比這個復雜得多,并且追蹤中斷情形會顯得十分冗長繁瑣。 因此如果我需要在 for-select 語法結構中實現中斷,我通常會將其封裝成一個函數來實現: ~~~ func main() { foo() fmt.Println("ending") } func foo() { for { select { case <-time.After(time.Second): fmt.Println("hello") default: return } } } ~~~ 這就簡潔優雅多了,當然你也可以在這個函數中返回錯誤(或任意其它值)來幫助函數調用者完善業務邏輯的處理,例如這樣: ~~~ // blocking if err := foo(); err != nil { // 處理錯誤 } ~~~ # 將 slice 或 map 定義成自定義類型可以讓你的代碼更容易維護 假設有一個 Server 類型和一個返回服務器列表的函數: ~~~ type Server struct { Name string } func ListServers() []Server { return []Server{ {Name: "Server1"}, {Name: "Server2"}, {Name: "Foo1"}, {Name: "Foo2"}, } } ~~~ 現在假設需要獲取某些特定名字的服務器。需要對 ListServers () 做一些改動,增加篩選條件: ~~~ // ListServers 返回服務器列表。只會返回包含 name 的服務器。空的 name 將會返回所有服務器。 func ListServers(name string) []Server { servers := []Server{ {Name: "Server1"}, {Name: "Server2"}, {Name: "Foo1"}, {Name: "Foo2"}, } // 返回所有服務器 if name == "" { return servers } // 返回過濾后的結果 filtered := make([]Server, 0) for _, server := range servers { if strings.Contains(server.Name, name) { filtered = append(filtered, server) } } return filtered } ~~~ 現在可以用這個來篩選有字符串 Foo 的服務器: ~~~ func main() { servers := ListServers("Foo") // 輸出: "servers [{Name:Foo1} {Name:Foo2}]" fmt.Printf("servers %+vn", servers) } ~~~ 顯然這個函數能夠正常工作。不過它的彈性并不好。如果你想對服務器集合引入其他邏輯的話會如何呢?例如檢查所有服務器的狀態,為每個服務器創建一個數據庫記錄,用其他字段進行篩選等等…… 現在引入一個叫做 Servers 的新類型,并且修改原始版本的 ListServers () 返回這個新類型: ~~~ type Servers []Server // ListServers 返回服務器列表 func ListServers() Servers { return []Server{ {Name: "Server1"}, {Name: "Server2"}, {Name: "Foo1"}, {Name: "Foo2"}, } } ~~~ 現在需要做的是只要為 Servers 類型添加一個新的 Filter () 方法: ~~~ // Filter 返回包含 name 的服務器。空的 name 將會返回所有服務器。 func (s Servers) Filter(name string) Servers { filtered := make(Servers, 0) for _, server := range s { if strings.Contains(server.Name, name) { filtered = append(filtered, server) } } return filtered } ~~~ 現在可以針對字符串 Foo 篩選服務器: ~~~ func main() { servers := ListServers() servers = servers.Filter("Foo") fmt.Printf("servers %+vn", servers) } ~~~ 哈!看到你的代碼是多么的簡單了嗎?還想對服務器的狀態進行檢查?或者為每個服務器添加一條數據庫記錄?沒問題,添加以下新方法即可: ~~~ func (s Servers) Check() func (s Servers) AddRecord() func (s Servers) Len() ~~~ # 不要在`String()`方法里面調用涉及`String()`方法的方法 它會導致意料之外的錯誤,比如下面的例子,它導致了一個無限迭代(遞歸)調用(`TT.String()`調用`fmt.Sprintf`,而`fmt.Sprintf`又會反過來調用`TT.String()`...),很快就會導致內存溢出: ~~~go type TT float64 func (t TT) String() string { return fmt.Sprintf("%v", t) } t. String() ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看