Go语言 命令行和fscanf来分析输出

gj3fmq9x  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(106)

我试图构建一个小的包来用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)
ffscu2ro

ffscu2ro1#

https://pkg.go.dev/[email protected]#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
要将切片的元素作为单独的参数传递给可变参数函数,必须在切片参数后添加...,例如。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)
}

相关问题