
本文详解 Go 1.5.2 中从标准输入读取整数序列、存储到切片并升序排序的完整实现,指出常见错误(如函数无返回值、重复调用导致数据丢失、误用 sort.Sort),并提供可运行的修正代码。
本文详解 go 1.5.2 中从标准输入读取整数序列、存储到切片并升序排序的完整实现,指出常见错误(如函数无返回值、重复调用导致数据丢失、误用 `sort.sort`),并提供可运行的修正代码。
在 Go 1.5.2 中实现“输入 N 个整数并排序”,需特别注意函数设计、切片动态扩容与标准库的正确用法。原代码存在多个关键问题:
- go_input() 函数无返回值,却在 sort.Sort(go_input()) 和 fmt.Println(go_input()) 中被当作返回值使用——Go 不允许调用无返回值函数来提供参数或打印内容;
- 每次调用 go_input() 都会新建一个长度为 1 的切片 []int{100},且未做扩容,导致 A[i] 在 i > 0 时触发 panic(索引越界);
- sort.Sort() 要求传入实现了 sort.Interface 接口的类型(如自定义类型),而普通切片不满足;实际应直接使用 sort.Ints([]int) 这一便捷函数;
- i_Sort() 中两次调用 go_input(),意味着两次独立输入流程,第二次输入覆盖第一次,逻辑断裂。
✅ 正确做法是:让输入函数返回切片,并在主流程中一次性获取、排序、输出。以下是修复后的完整可运行代码(兼容 Go 1.5.2):
package main
import (
"fmt"
"sort"
)
// readInts 读取用户指定数量的整数,返回整数切片
func readInts() []int {
var N int
fmt.Print("Enter number of integers: ")
fmt.Scanf("%d", &N)
// 动态创建长度为 N 的切片
nums := make([]int, N)
fmt.Print("Enter ", N, " integers (space or newline separated): ")
for i := 0; i <p>? <strong>关键说明与注意事项:</strong> </p>
- make([]int, N) 创建了长度和容量均为 N 的切片,安全支持 0 到 N-1 索引;避免使用 []int{100} 这类固定初值切片。
- sort.Ints() 是 Go 标准库专为 []int 提供的优化排序函数,比手动实现 sort.Sort(sort.IntSlice(...)) 更简洁、更符合 Go 习惯。
- Go 1.5.2 已支持 sort.Ints(自 Go 1.0 起即存在),无需额外适配。
- 若需降序,可先升序再反转:sort.Sort(sort.Reverse(sort.IntSlice(data)))。
? 总结:输入与排序应职责分离——输入函数负责构造并返回数据,主逻辑负责处理与呈现;杜绝无返回值函数参与表达式,善用 make 动态分配切片,优先选用 sort.Ints 等语义明确的工具函数。










