使用Fscanf解析命令行输出遇错,求教参数传递与问题解决
Go命令行输出解析工具的问题修复
错误原因与修复
1. io.Reader类型不匹配问题
错误提示:
cutil/command.go:25:23: cannot use c.out (variable of type bytes.Buffer) as io.Reader value in argument to fmt.Fscanf: bytes.Buffer does not implement io.Reader (method Read has pointer receiver)
bytes.Buffer的Read方法是指针接收器,因此必须传递指针类型&c.out给fmt.Fscanf,而非值类型c.out。
2. 可变参数传递问题
在Command.Fscanf方法中,直接传递a会把整个slice作为单个interface{}参数传入fmt.Fscanf,导致参数数量不匹配。正确写法是用a...展开slice,将每个元素作为独立参数传递。
修正后的完整代码
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{}){ // 两处修正:传入buffer指针、展开可变参数 n, err := fmt.Fscanf(&c.out, format, a...) if err != nil { panic(err) } fmt.Println(n) }
调用代码示例
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)
内容的提问来源于stack exchange,提问作者clarkk
相关产品推荐
相关产品推荐

