
本文详解 Go 1.5.2 中从标准输入读取任意数量整数、存入切片并正确排序的完整实现,重点解决函数无返回值、切片容量不足及错误调用 sort.Sort 等常见问题。
本文详解 go 1.5.2 中从标准输入读取任意数量整数、存入切片并正确排序的完整实现,重点解决函数无返回值、切片容量不足及错误调用 `sort.sort` 等常见问题。
在 Go 1.5.2 中,实现“输入若干整数 → 存储 → 排序 → 输出”看似简单,但初学者常因忽略类型语义与函数契约而报错。原代码存在三个关键问题:
- go_input() 函数未声明返回值,却在 sort.Sort(go_input()) 和 fmt.Println(go_input()) 中被当作可返回切片的函数调用;
- 切片 A := []int{100} 初始化为含单个元素 100 的切片,但后续循环试图通过 A[i] 写入 N 个元素(i 从 0 到 N-1),导致索引越界 panic;
- sort.Sort() 需要实现 sort.Interface 接口的类型(如自定义类型),而此处应直接使用专为 []int 设计的高效函数 sort.Ints()。
✅ 正确做法是:让输入函数返回动态构建的切片,并确保容量与长度匹配。以下是修正后的完整可运行代码:
package main
import (
"fmt"
"sort"
)
// readInts 读取用户指定数量的整数,返回已填充的 int 切片
func readInts() []int {
var N int
fmt.Print("请输入整数个数 N: ")
fmt.Scanf("%d", &N)
// 使用 make 动态创建长度和容量均为 N 的切片
nums := make([]int, N)
fmt.Printf("请依次输入 %d 个整数(每行一个):\n", N)
for i := 0; i < N; i++ {
fmt.Scanf("%d", &nums[i])
}
return nums
}
// main 函数:读取 → 排序 → 打印
func main() {
nums := readInts() // 获取用户输入的切片
sort.Ints(nums) // 原地升序排序(时间复杂度 O(n log n))
fmt.Println("排序后:", nums)
}? 关键说明与注意事项:
- ✅ make([]int, N) 创建的是长度(len)和容量(cap)均为 N 的切片,支持安全索引赋值;避免使用 []int{100} 这类字面量初始化(它仅含 1 个元素)。
- ✅ sort.Ints(nums) 是 Go 标准库为 []int 提供的专用排序函数,比泛型 sort.Sort() 更简洁、安全且高效。
- ⚠️ Go 函数调用不共享内存——每次调用 readInts() 都会新建切片,因此不可重复调用(如 sort.Ints(readInts()) 后再 fmt.Println(readInts()) 会输出两组不同数据)。务必先赋值再复用。
- ? Go 1.5.2 已支持 sort.Ints(自 Go 1.0 起即存在),无需额外适配。
运行示例:
请输入整数个数 N: 4 请依次输入 4 个整数(每行一个): 33 12 89 5 排序后: [5 12 33 89]
掌握切片动态创建、函数显式返回与标准库工具的精准选用,是写出健壮 Go 输入处理逻辑的基础。

















