<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 5.12\. 內置 Go 不提供通行的、類型驅動的子類劃分的概念,但它通過在結構或界面內置,確實有能力從某實現“借”些片段。 界面內置非常簡單。我們提到過 io.Reader 和 io.Writer 的界面;這里是其定義: ``` type Reader interface { Read(p []byte) (n int, err os.Error) } type Writer interface { Write(p []byte) (n int, err os.Error) } ``` io 包也導出一些其它的界面來規范實現其多個方法的物件。例如,io.ReadWriter 界面同時包括 Read 和 Write 。我們可以明確的列出這兩個方法來規定 io.ReadWriter ,但更簡單更有啟發的是內置這兩個界面形成新界面,如下: ``` // ReadWrite is the interface that groups the basic Read and Write methods. type ReadWriter interface { Reader Writer } ``` 顧名思意,ReadWriter 可做 Reader 和 Writer 兩個的事;它是內置界面的集合(必須是沒有交集的方法)。只有界面可以內置在界面里。 同樣的基本概念適用于結構,但牽連更廣。bu?o 包有兩個結構類型,bu?o.Reader 和 bu?o.Writer ,每個都當然對應實現著 io 包的界面。并且,bu?o 也實現了緩沖的讀寫,這是通過把 reader 和 writer 內置到一個結構做到的;它列出類型但不給名稱: ``` // ReadWriter stores pointers to a Reader and a Writer. // It implements io.ReadWriter. type ReadWriter struct { *Reader // *bufio.Reader *Writer // *bufio.Writer } ``` 內置元素是指針所以使用前必須初始化指向有效的結構。 ReadWriter 結構可以寫為: ``` type ReadWriter struct { reader *Reader writer *Writer } ``` 但要提升域的方法又要滿足 io 界面,我們還需提供轉發方法,如: ``` func (rw *ReadWriter) Read(p []byte) (n int, err os.Error) { return rw.reader.Read(p) } ``` 通過直接內置結構,我們避免了這些賬目管理。內置類型的方法是附送的,亦即 bu?o.ReadWriter 除了有 bu?o.Reader 和bu?o.Writer 的方法,還同時滿足三個界面:io.Reader,io.Writer 和 io.ReadWriter 。 內置和子類劃分有著重要不同。我們內置類型時,此類的方法成為外層類型的方法,但調用時其接受者是內層類型,而不是外層。我們的例子里,當 bu?o.ReadWriter 的 Read 方法被調用時,它的效果和上面所寫的轉發方法完全一樣;接受者是 ReadWriter 的 reader,而不是 ReadWriter 自身。 內置也用來提供某種便利。下例是一個內置域和普通的,帶名的域在一起: ``` type Job struct { Command string *log.Logger } ``` 此時 Job 類型有 Log,Logf 和其它 *log.Logger 的方法。 我們當然可以給 Logger 個名字,但無此必要。這里,初始化后,我們可以 log Job: ``` job.Log("starting now...") ``` Logger 是結構的普通域所以我們能用通常的架構函數初始化它: ``` func NewJob(command string, logger *log.Logger) *Job { return &Job{command, logger} } ``` 或使用組合字面: ``` job := &Job{command, log.New(os.Stderr, nil, "Job: ", log.Ldate)} ``` 如果我們需要直接引用內置域,域的類型名,忽略包標識,可作為域名。如果我們要得到 Job 變量 job 的 *log.Logger,我們用job.Logger 。這可用在細化 Logger 的方法上: ``` func (job *Job) Logf(format string, args ...) { job.Logger.Logf("%q: %s", job.Command, fmt.Sprintf(format, args)) } ``` 內置類型導致撞名的問題,但解決方案很簡單。首先,域或方法 X 隱藏此類型更深層部分的 X 項。如果 log.Logger 包括叫 Command 的域或方法,則 Job 的 Command 域占主導權。 其次,如果同層出現同名,通常是個錯誤;如果 Job 結構有另一域或方法叫 Logger,要內置 log.Logger 會出錯。但只要重名在類型定義外的程序中不被提及,就不成問題。此條件提供了改動外部的內置類型的某種保護;只要兩個域都沒被用到,新增的域名和另一子類的域重名也沒有問題。
                  <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>

                              哎呀哎呀视频在线观看