是否可以像C中那样省略字段,在那里可以%*s?
%*s
var pid int fmt.Fscanf(r, "%*s %d", &pid)
jq6vz3qz1#
实际上,你不能在Go中这样做(至少在Go 1.21.0中是这样)。source code显示:
%s
%v
%q
%x
%X
Fscanf
Fscanf(r io.Reader, format string, a ...any)
a
如果你不想定义一个变量,你可以用途:
var pid int fmt.Fscanf(r, "%s %d", new(string), &pid)
对于您的特定情况,要从读取器解析某些内容,您可以首先将读取器读入字符串(例如,io.ReadAll):
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
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 }
可能还有其他方法,但这些方法足以说明问题。希望能帮上忙。
1条答案
按热度按时间jq6vz3qz1#
实际上,你不能在Go中这样做(至少在Go 1.21.0中是这样)。
source code显示:
%*s
):实际上,字符串的动词总是single character(%s
,%v
,%q
,%x
或%X
)Fscanf
方法iterates on arguments(Fscanf(r io.Reader, format string, a ...any)
中的a
数组)。因此,您必须在a
中定义一个参数,即使您不关心它的值如果你不想定义一个变量,你可以用途:
其他备选方案
对于您的特定情况,要从读取器解析某些内容,您可以首先将读取器读入字符串(例如,
io.ReadAll
):然后使用
strings.Split
方法或正则表达式,如:1.关于
strings.Split
1.使用regex:
可能还有其他方法,但这些方法足以说明问题。希望能帮上忙。