<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 7.10. 類型斷言 類型斷言是一個使用在接口值上的操作。語法上它看起來像x.(T)被稱為斷言類型,這里x表示一個接口的類型和T表示一個類型。一個類型斷言檢查它操作對象的動態類型是否和斷言的類型匹配。 這里有兩種可能。第一種,如果斷言的類型T是一個具體類型,然后類型斷言檢查x的動態類型是否和T相同。如果這個檢查成功了,類型斷言的結果是x的動態值,當然它的類型是T。換句話說,具體類型的類型斷言從它的操作對象中獲得具體的值。如果檢查失敗,接下來這個操作會拋出panic。例如: ```go var w io.Writer w = os.Stdout f := w.(*os.File) // success: f == os.Stdout c := w.(*bytes.Buffer) // panic: interface holds *os.File, not *bytes.Buffer ``` 第二種,如果相反地斷言的類型T是一個接口類型,然后類型斷言檢查是否x的動態類型滿足T。如果這個檢查成功了,動態值沒有獲取到;這個結果仍然是一個有相同動態類型和值部分的接口值,但是結果為類型T。換句話說,對一個接口類型的類型斷言改變了類型的表述方式,改變了可以獲取的方法集合(通常更大),但是它保留了接口值內部的動態類型和值的部分。 在下面的第一個類型斷言后,w和rw都持有os.Stdout,因此它們都有一個動態類型`*os.File`,但是變量w是一個io.Writer類型,只對外公開了文件的Write方法,而rw變量還公開了它的Read方法。 ```go var w io.Writer w = os.Stdout rw := w.(io.ReadWriter) // success: *os.File has both Read and Write w = new(ByteCounter) rw = w.(io.ReadWriter) // panic: *ByteCounter has no Read method ``` 如果斷言操作的對象是一個nil接口值,那么不論被斷言的類型是什么這個類型斷言都會失敗。我們幾乎不需要對一個更少限制性的接口類型(更少的方法集合)做斷言,因為它表現的就像是賦值操作一樣,除了對于nil接口值的情況。 ```go w = rw // io.ReadWriter is assignable to io.Writer w = rw.(io.Writer) // fails only if rw == nil ``` 經常地,對一個接口值的動態類型我們是不確定的,并且我們更愿意去檢驗它是否是一些特定的類型。如果類型斷言出現在一個預期有兩個結果的賦值操作中,例如如下的定義,這個操作不會在失敗的時候發生panic,但是替代地返回一個額外的第二個結果,這個結果是一個標識成功與否的布爾值: ```go var w io.Writer = os.Stdout f, ok := w.(*os.File) // success: ok, f == os.Stdout b, ok := w.(*bytes.Buffer) // failure: !ok, b == nil ``` 第二個結果通常賦值給一個命名為ok的變量。如果這個操作失敗了,那么ok就是false值,第一個結果等于被斷言類型的零值,在這個例子中就是一個nil的`*bytes.Buffer`類型。 這個ok結果經常立即用于決定程序下面做什么。if語句的擴展格式讓這個變的很簡潔: ```go if f, ok := w.(*os.File); ok { // ...use f... } ``` 當類型斷言的操作對象是一個變量,你有時會看見原來的變量名重用而不是聲明一個新的本地變量名,這個重用的變量原來的值會被覆蓋(理解:其實是聲明了一個同名的新的本地變量,外層原來的w不會被改變),如下面這樣: ```go if w, ok := w.(*os.File); ok { // ...use w... } ```
                  <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>

                              哎呀哎呀视频在线观看