Go语言 Fscanf并像C中那样省略字段

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

是否可以像C中那样省略字段,在那里可以%*s

var pid int
fmt.Fscanf(r, "%*s %d", &pid)
jq6vz3qz

jq6vz3qz1#

实际上,你不能在Go中这样做(至少在Go 1.21.0中是这样)。
source code显示:

  • 在格式字符串中没有动词可以省略字段(如C中的%*s):实际上,字符串的动词总是single character%s%v%q%x%X
  • Fscanf方法iterates on argumentsFscanf(r io.Reader, format string, a ...any)中的a数组)。因此,您必须在a中定义一个参数,即使您不关心它的值

如果你不想定义一个变量,你可以用途:

var pid int
fmt.Fscanf(r, "%s %d", new(string), &pid)

其他备选方案

对于您的特定情况,要从读取器解析某些内容,您可以首先将读取器读入字符串(例如,io.ReadAll):

// read the reader into a string
s, err := io.ReadAll(r)
if err != nil {
    panic(err) // handle the error
}

然后使用strings.Split方法或正则表达式,如:
1.关于strings.Split

pidString := strings.Split(string(s), " ")[1]
pid, err := strconv.Atoi(pidString)
if err != nil {
    panic(err) // handle the error
}

1.使用regex:

re := regexp.MustCompile(`[^\s]+ (?P<pid>\d+)`) // similar to "%s %d"
matches := re.FindStringSubmatch(s)
pidString := matches[re.SubexpIndex("pid")]
pid, err := strconv.Atoi(pidString)
if err != nil {
    panic(err) // handle the error
}

可能还有其他方法,但这些方法足以说明问题。希望能帮上忙。

相关问题