<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] ## io ### Reader 接口 ``` type Reader interface { Read(p []byte) (n int, err error) } ``` 示例1: 字符串生成 reader 接口 ``` reader := strings.NewReader("hello world") b := make([]byte, 1) _, err := reader.Read(b) if err != nil { log.Fatal(err) } fmt.Printf("%s\n", b) ``` 示例2:寫一個 Reader 接口 <details> <summary>main.go</summary> ``` type User struct { s string i int } func NewUser(s string) *User { return &User{s: s} } func (u *User) Len() int { return len(u.s) - u.i } func (u *User) Read(p []byte) (n int, err error) { // i 還沒到結尾 && n 的大小不大于p 的切片長度 for u.i < len(u.s) && n < len(p) { p[n] = u.s[u.i] n++ u.i++ } if n == 0 { return 0, io.EOF } return n, nil } func main() { user := NewUser("hello world") b := make([]byte, 5) n, err := io.ReadFull(user, b) if err != nil { log.Fatal(err) } fmt.Printf("%+v\n", n) fmt.Printf("%+v\n", string(b)) //hello world } ``` </details> <br /> ### Writer 接口 ``` // Writer 接口包裝了基本的 Write 方法,用于將數據存入自身。 // Write 方法用于將 p 中的數據寫入到對象的數據流中, // 返回寫入的字節數和遇到的錯誤。 // 如果 p 中的數據全部被寫入,則 err 應該返回 nil。 // 如果 p 中的數據無法被全部寫入,則 err 應該返回相應的錯誤信息。 type Writer interface { Write(p []byte) (n int, err error) } ``` ### Seeker 偏移量 ``` const ( SeekStart = 0 // 相對開始位置的偏移量 SeekCurrent = 1 // 相對當前位置的偏移量 SeekEnd = 2 // 相對結束位置的偏移量 ) type Seeker interface { Seek(offset int64, whence int) (ret int64, err error) } ``` ``` r := strings.NewReader("some io.Reader stream to be read\n") r.Seek(5, io.SeekStart) // move to the 5th char from the start if _, err := io.Copy(os.Stdout, r); err != nil { log.Fatal(err) } r.Seek(-5, io.SeekEnd) if _, err := io.Copy(os.Stdout, r); err != nil { log.Fatal(err) } // Output: // io.Reader stream to be read // read ``` ### Closer接口 ``` // Closer 接口包裝了基本的 Close 方法,用于關閉數據讀寫。 // Close 一般用于關閉文件,關閉通道,關閉連接,關閉數據庫等 type Closer interface { Close() error } ``` ### ReadAtLeast 至少讀取多少字節 ``` // ReadAtLeast 從 r 中讀取數據到 buf 中,要求至少讀取 min 個字節。 // 返回讀取的字節數和遇到的錯誤。 // 如果 min 超出了 buf 的容量,則 err 返回 io.ErrShortBuffer,否則: // 1、讀出的數據長度 == 0 ,則 err 返回 EOF。 // 2、讀出的數據長度 < min,則 err 返回 io.ErrUnexpectedEOF。 // 3、讀出的數據長度 >= min,則 err 返回 nil。 func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error) ``` ### ReadFull ``` // ReadFull 的功能和 ReadAtLeast 一樣,只不過 min = len(buf) func ReadFull(r Reader, buf []byte) (n int, err error) ``` 示例: ``` reader := strings.NewReader("abcdefg") b := make([]byte, 3) io.ReadFull(reader, b) fmt.Printf("%s\n", b) io.ReadFull(reader, b) fmt.Printf("%s\n", b) ``` ### io.Pipe() 一方讀,一方寫 ``` func ioWrite(w io.Writer) { for { _, err := w.Write([]byte("hello\n")) if err != nil { fmt.Printf("%+v\n", err) } time.Sleep(1 * time.Second) } } func ioRead(r io.Reader) { reader := bufio.NewReader(r) for { line, _, err := reader.ReadLine() if err != nil { fmt.Printf("%+v\n", err) } fmt.Printf("line: %s\n", line) } } func main() { pr, pw := io.Pipe() go ioWrite(pw) ioRead(pr) pr.Close() pw.Close() } ``` ### Copy ``` io.Copy(os.Stdout, strings.NewReader("Go語言中文網")) ``` ### CopyN 拷貝指定數字節 ``` io.CopyN(os.Stdout, strings.NewReader("hello wored"), 3) ``` ### CopyBuffer 帶一個緩存的copy ``` // CopyBuffer 相當于 Copy,只不 Copy 在執行的過程中會創建一個臨時的緩沖區來中 // 轉數據,而 CopyBuffer 則可以單獨提供一個緩沖區,讓多個復制操作共用同一個緩 // 沖區,避免每次復制操作都創建新的緩沖區。如果 buf == nil,則 CopyBuffer 會 // 自動創建緩沖區。 func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) ``` ### WriteString Writer接口寫入string ``` func WriteString(w Writer, s string) (n int, err error) ``` 示例 ``` file, _ := os.OpenFile("abc", os.O_RDWR, 0777) io.WriteString(file, "aaaaa22222") ``` ### LimitReader 限制被Reader 長度 ``` r := strings.NewReader("Hello World!") lr := io.LimitReader(r, 5) n, err := io.Copy(os.Stdout, lr) // Hello fmt.Printf("\n%d %v\n", n, err) // 5 <nil> n, err = io.Copy(os.Stdout, lr) // fmt.Printf("\n%d %v\n", n, err) // 0 <nil> ``` ### NewSectionReader 對 Reader 限制 offset 與 length ``` // NewSectionReader 對 r 進行封裝,使其只能從 off 位置開始讀取,最多只能讀取 n // 個字節的的數據。相當于對 r 做了一個切片 r[off:off+n] 返回。 // 底層實現是一個 *SectionReader。 func NewSectionReader(r ReaderAt, off int64, n int64) *SectionReader ``` 示例 ``` r := strings.NewReader("abcdef") sr := io.NewSectionReader(r, 2, 3) io.Copy(os.Stdout, sr) // ced io.Copy(os.Stdout, sr) // 空 ``` ### MultiReader ``` readers := []io.Reader{ bytes.NewBufferString("123"), strings.NewReader("abc"), } reader := io.MultiReader(readers...) p := make([]byte, 50) reader.Read(p) fmt.Println(string(p)) //123 reader.Read(p) fmt.Println(string(p)) //abc ``` 說明 `MultiReader`只是把多個reader 作為切片連接,并不能一次獲取所有的reader,只有當第一個獲取完才可以獲取第二個 ### MultiWriter ``` r := strings.NewReader("hello world\n") f, _ := os.Create("t.txt") defer f.Close() //同事輸出和寫入文件 writer := io.MultiWriter(os.Stdout, os.Stdout, f) r.WriteTo(writer) // console: // hello world // hello world // cat t.txt // hello world ```
                  <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>

                              哎呀哎呀视频在线观看