clarkk Asked: 2023-08-20 18:15:52 +0800 CST2023-08-20 18:15:52 +0800 CST 2023-08-20 18:15:52 +0800 CST Fscanf 并像 C 中那样省略字段 772 是否可以像 C 中那样省略字段%*s? var pid int fmt.Fscanf(r, "%*s %d", &pid) go 1 个回答 Voted Best Answer norbjd 2023-08-20T20:03:41+08:002023-08-20T20:03:41+08:00 实际上,在 Go 中你不能这样做(至少在 Go 1.21.0 上)。 源代码显示: 格式字符串中没有动词可以省略字段(如C%*s语言):实际上,字符串的动词始终是单个字符(%s、%v、%q或%x)%X 该Fscanf方法迭代参数(aarray in Fscanf(r io.Reader, format string, a ...any))。因此,即使您不关心它的值,您也必须在 中定义一个参数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方法或正则表达式,例如: 和strings.Split pidString := strings.Split(string(s), " ")[1] pid, err := strconv.Atoi(pidString) if err != nil { panic(err) // handle the error } 使用正则表达式: 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 } 可能还有其他方法,但这些应该足以说明。希望有帮助。
实际上,在 Go 中你不能这样做(至少在 Go 1.21.0 上)。
源代码显示:
%*s
语言):实际上,字符串的动词始终是单个字符(%s
、%v
、%q
或%x
)%X
Fscanf
方法迭代参数(a
array inFscanf(r io.Reader, format string, a ...any)
)。因此,即使您不关心它的值,您也必须在 中定义一个参数a
如果您不想定义变量,可以使用:
其他替代方案
不过,对于您的具体情况,要解析阅读器中的某些内容,您可以首先将阅读器读入字符串(例如
io.ReadAll
):然后使用
strings.Split
方法或正则表达式,例如:strings.Split
可能还有其他方法,但这些应该足以说明。希望有帮助。