代码之家  ›  专栏  ›  技术社区  ›  clarkk

命令行和fscanf解析输出

go
  •  0
  • clarkk  · 技术社区  · 2 年前

    我正在尝试构建一个小程序包来解析命令行输出 Fscanf 但是出现错误

    Command.FscanF 方法如何传递 a ...interface{} 到下一个功能?

    package cutil
    
    import (
        "fmt"
        "bytes"
        "os/exec"
    )
    
    type Command struct {
        out     bytes.Buffer
    }
    
    func (c *Command) Run(command string){
        cmd := exec.Command("bash", "-c", command)
        cmd.Stdout = &c.out
        err := cmd.Run()
        if err != nil {
            panic(err)
        }
        
        fmt.Println(c.out.String())
    }
    
    func (c *Command) Fscanf(format string, a ...interface{}){
        n, err := fmt.Fscanf(c.out, format, a)
        if err != nil {
            panic(err)
        }
        
        fmt.Println(n)
    }
    

    错误

    cutil/command.go:25:23:不能使用c.out(类型为的变量 bytes.Buffer)作为fmt.Fscanf参数中的io.Reader值: bytes.Buffer未实现io.Reader(方法Read有指针 接收器)

    c := &cutil.Command{}
    c.Run(fmt.Sprintf("netstat -nlp | grep :%d", 3000))
    var (
        t   string
        i   int
    )
    c.Fscanf("%s %d", &t, &i)
    fmt.Println(t, i)
    
    1 回复  |  直到 2 年前
        1
  •  2
  •   mkopriva    2 年前

    https://pkg.go.dev/bytes@go1.21.0#Buffer.Read

    func (b *Buffer) Read(p []byte) (n int, err error)
    

    正如你所看到的 Read 方法的接收器是指针( *Buffer ),这就是为什么错误显示:

    bytes.Buffer未实现io.Reader(方法Read具有指针接收器)

    这意味着你不能使用 bytes.Buffer io.Reader ,而必须使用 *bytes.Buffer


    要将切片的元素作为单独的参数传递给可变函数,必须添加 ... 在slice参数之后,例如。 a...


    func (c *Command) Fscanf(format string, a ...interface{}){
        n, err := fmt.Fscanf(&c.out, format, a...)
        if err != nil {
            panic(err)
        }
        
        fmt.Println(n)
    }