`fmt.sscan` 不支持直接将字符串解析到数组变量,需先将元素地址转为 `[]interface{}` 再展开传参;本文详解实现原理、完整示例及更推荐的替代方案。
fmt.Sscan 是

✅ 正确做法是:显式构造一个 []interface{},其中每个元素都是对应数组项的地址。以下是一个完整、健壮的示例:
package main
import (
"fmt"
"log"
)
func main() {
var nums [5]int
// 步骤1:创建 interface{} 切片,长度与 nums 一致
xnums := make([]interface{}, len(nums))
// 步骤2:将每个 &nums[i] 赋值给 xnums[i]
for i := range nums {
xnums[i] = &nums[i]
}
// 步骤3:使用 ... 展开切片,传递给 Sscan
n, err := fmt.Sscan("1 2 3 4 5", xnums...)
if err != nil {
log.Fatalf("解析失败(第 %d 个字段): %v", n+1, err)
}
if n < len(nums) {
fmt.Printf("警告:仅成功解析 %d 个值,预期 %d 个\n", n, len(nums))
}
fmt.Println("解析结果:", nums) // 输出: [1 2 3 4 5]
}⚠️ 注意事项:
? 更推荐的现代实践(尤其对不确定长度或复杂分隔场景):
import (
"fmt"
"strconv"
"strings"
)
func parseInts(s string) ([]int, error) {
fields := strings.Fields(s) // 自动按空白分割,忽略多余空格
result := make([]int, 0, len(fields))
for _, f := range fields {
num, err := strconv.Atoi(f)
if err != nil {
return nil, fmt.Errorf("解析 '%s' 失败: %w", f, err)
}
result = append(result, num)
}
return result, nil
}
// 使用示例
nums, err := parseInts("1 2 3 4 5")
if err != nil {
log.Fatal(err)
}
fmt.Println(nums) // [1 2 3 4 5]该方式更清晰、可控性强、易于错误处理和扩展(例如支持十六进制 strconv.ParseInt(f, 0, 64)),是生产代码中的首选。而 fmt.Sscan + []interface{} 方案更适合教学演示或极简脚本中「已知固定结构」的快速解析。