亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

持久性 Reader() 對象

持久性 Reader() 對象

Go
Smart貓小萌 2022-07-25 10:55:03
在 Go 中,我試圖創建一個函數來讀取和處理下一行輸入:// Read a string of hex from stdin and parse to an array of bytesfunc ReadHex() []byte {    r := bufio.NewReader(os.Stdin)    t, _ := r.ReadString('\n')    data, _ := hex.DecodeString(strings.TrimSpace(t))    return data}不幸的是,這只在第一次被調用時才有效。它捕獲第一行,但無法捕獲通過標準輸入管道傳輸的后續行。我懷疑,如果在每個后續調用中都使用相同的持久 bufio.Reader() 對象,它會起作用,但如果不在每個函數調用上手動傳遞它,我就無法實現這一點。
查看完整描述

1 回答

?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

是的,試試這個:

package main


import (

    "bufio"

    "encoding/hex"

    "fmt"

    "log"

    "os"

    "strings"

)


func ReadFunc() func() []byte {

    r := bufio.NewReader(os.Stdin)

    return func() []byte {

        t, err := r.ReadString('\n')

        if err != nil {

            log.Fatal(err)

        }

        data, err := hex.DecodeString(strings.TrimSpace(t))

        if err != nil {

            log.Fatal(err)

        }

        return data

    }

}


func main() {

    r, w, err := os.Pipe()

    if err != nil {

        log.Fatal(err)

    }

    os.Stdin = r

    w.Write([]byte(`ffff

    cafebabe

    ff

    `))

    w.Close()


    ReadHex := ReadFunc()


    fmt.Println(ReadHex())

    fmt.Println(ReadHex())

    fmt.Println(ReadHex())

}


輸出:


[255 255]

[202 254 186 190]

[255]

使用 a struct,試試這個:

package main


import (

    "bufio"

    "encoding/hex"

    "fmt"

    "io"

    "log"

    "os"

    "strings"

)


// InputReader struct

type InputReader struct {

    bufio.Reader

}


// New creates an InputReader

func New(rd io.Reader) *InputReader {

    return &InputReader{Reader: *bufio.NewReader(rd)}

}


// ReadHex returns a string of hex from stdin and parse to an array of bytes

func (r *InputReader) ReadHex() []byte {

    t, err := r.ReadString('\n')

    if err != nil {

        log.Fatal(err)

    }

    data, err := hex.DecodeString(strings.TrimSpace(t))

    if err != nil {

        log.Fatal(err)

    }

    return data

}


func main() {

    r, w, err := os.Pipe()

    if err != nil {

        log.Fatal(err)

    }

    os.Stdin = r

    w.Write([]byte(`ffff

    cafebabe

    ff

    `))

    w.Close()


    rdr := New(os.Stdin)

    fmt.Println(rdr.ReadHex())

    fmt.Println(rdr.ReadHex())

    fmt.Println(rdr.ReadHex())

}


查看完整回答
反對 回復 2022-07-25
  • 1 回答
  • 0 關注
  • 104 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號