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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ## 概述 - **bufio包實現了有緩沖的I/O** - 它包裝一個io.Reader或io.Writer接口對象,且同時還提供了緩沖和一些文本I/O的幫助函數的對象 ## 語法 ### Func ``` func ScanBytes(data []byte, atEOF bool) (advance int, token []byte, err error) func ScanRunes(data []byte, atEOF bool) (advance int, token []byte, err error) func ScanWords(data []byte, atEOF bool) (advance int, token []byte, err error) func ScanLines(data []byte, atEOF bool) (advance int, token []byte, err error) ``` ### Type ``` type Reader func NewReader(rd io.Reader) *Reader func NewReaderSize(rd io.Reader, size int) *Reader func (b *Reader) Reset(r io.Reader) func (b *Reader) Buffered() int // 返回緩沖中已使用的字節數 func (b *Reader) Peek(n int) ([]byte, error) // 只獲取,不出棧 func (b *Reader) Discard(n int) (discarded int, err error) // 跳過 n 個字節 func (b *Reader) Read(p []byte) (n int, err error) func (b *Reader) ReadByte() (c byte, err error) // 讀取一個字節 func (b *Reader) UnreadByte() error // 吐出最近一次讀取操作讀取的最后一個字節。(只能吐出最后一個,多次調用會出問題) func (b *Reader) ReadRune() (r rune, size int, err error) func (b *Reader) UnreadRune() error // ReadLine是一個低水平的行數據讀取原語。大多數調用者應使用ReadBytes('\n')或ReadString('\n')代替,或者使用Scanner func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error) func (b *Reader) ReadSlice(delim byte) (line []byte, err error) func (b *Reader) ReadBytes(delim byte) (line []byte, err error) func (b *Reader) ReadString(delim byte) (line string, err error) func (b *Reader) WriteTo(w io.Writer) (n int64, err error) type Writer func NewWriter(w io.Writer) *Writer func NewWriterSize(w io.Writer, size int) *Writer func (b *Writer) Reset(w io.Writer) func (b *Writer) Buffered() int func (b *Writer) Available() int //返回緩沖中還有多少字節未使用 func (b *Writer) Write(p []byte) (nn int, err error) func (b *Writer) WriteString(s string) (int, error) func (b *Writer) WriteByte(c byte) error func (b *Writer) WriteRune(r rune) (size int, err error) func (b *Writer) Flush() error func (b *Writer) ReadFrom(r io.Reader) (n int64, err error) type ReadWriter func NewReadWriter(r *Reader, w *Writer) *ReadWriter type Scanner func NewScanner(r io.Reader) *Scanner func (s *Scanner) Split(split SplitFunc) func (s *Scanner) Scan() bool func (s *Scanner) Bytes() []byte func (s *Scanner) Text() string func (s *Scanner) Err() error ``` ## 實例 ### bytes->Reader->帶緩存的 Reader ``` ``` ### ReadBytes 截取到界定符 ``` reader := bufio.NewReaderSize(strings.NewReader("http://studygolang.com.\nt It is the home of gophers"), 14) s, _ := reader.ReadBytes('\n') fmt.Println(string(s)) //h ``` ### NewScanner 讀取屏幕輸入 ``` scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { fmt.Println(scanner.Text()) // Println will add back the final '\n' } if err := scanner.Err(); err != nil { fmt.Fprintln(os.Stderr, "reading standard input:", err) } ``` ### 進行分詞 ``` const input = "This is The Golang 你好 Standard Library.\nWelcome you!" scanner := bufio.NewScanner(strings.NewReader(input)) //scanner.Split(bufio.ScanBytes) //單個詞分詞.不能分中文 //scanner.Split(bufio.ScanLines) //以行分詞 //scanner.Split(bufio.ScanRunes) //以詞分詞,可分中文 scanner.Split(bufio.ScanWords) //以空格分詞 count := 0 for scanner.Scan() { fmt.Println(scanner.Text()) count++ } if err := scanner.Err(); err != nil { fmt.Fprintln(os.Stderr, "reading input:", err) } fmt.Println(count) // output: //This //is //The //Golang //你好 //Standard //Library. //Welcome //you! //9 ``` ### 對 tcp 包進行切割 對tcp 進行拆包 ``` scanner := bufio.NewScanner(t.conn) scanner.Split(proto.Split) for scanner.Scan() { t.handleRead(scanner.Bytes()) } // 假設對包的前4字節表示包的長度 func split(data []byte, atEOF bool) (advance int, token []byte, err error) { var length uint32 if !atEOF { _ = binary.Read(bytes.NewReader(data[:4]), binary.BigEndian, &length) if length > 0 && len(data) >= int(length) { return int(length), data[:length], nil } } return } ```
                  <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>

                              哎呀哎呀视频在线观看