2026-03-24 02:24:37
在Go语言中,使用for循环实现数组或切片的翻转操作是一种高效且直观的方法。以下是详细解析和代码示例:
1. 翻转数组数组是固定长度的数据结构,翻转时需通过索引交换元素位置。核心逻辑:
代码示例:
package mainimport "fmt"func reverseArray(arr []int) { // 注意:参数应为切片(数组需指定长度) n := len(arr) for i := 0; i < n/2; i++ { arr[i], arr[n-1-i] = arr[n-1-i], arr[i] // 交换元素 }}func main() { arr := []int{1, 2, 3, 4, 5} // 实际是切片(数组需写成 [5]int) fmt.Println("原始数组:", arr) reverseArray(arr) fmt.Println("翻转后的数组:", arr)}输出:
原始数组: [1 2 3 4 5]翻转后的数组: [5 4 3 2 1]2. 翻转切片切片是动态长度的引用类型,翻转逻辑与数组相同,但更常用。关键点:
代码示例:
package mainimport "fmt"func reverseSlice(slice []int) { n := len(slice) for i := 0; i < n/2; i++ { slice[i], slice[n-1-i] = slice[n-1-i], slice[i] }}func main() { slice := []int{6, 7, 8, 9, 10} fmt.Println("原始切片:", slice) reverseSlice(slice) fmt.Println("翻转后的切片:", slice)}输出:
原始切片: [6 7 8 9 10]翻转后的切片: [10 9 8 7 6]3. 通用翻转函数(支持任意类型)通过空接口(interface{})和反射(reflect)实现泛型翻转(Go 1.18前):
package mainimport ( "fmt" "reflect")func reverseGeneric(slice interface{}) { v := reflect.ValueOf(slice) if v.Kind() != reflect.Slice { panic("参数必须是切片") } n := v.Len() for i := 0; i < n/2; i++ { a, b := v.Index(i), v.Index(n - 1 - i) tmp := a.Interface() a.Set(b) b.Set(reflect.ValueOf(tmp)) }}func main() { s := []string{"a", "b", "c"} reverseGeneric(s) fmt.Println(s) // 输出: [c b a]}Go 1.18+推荐:使用泛型(更安全高效):
func reverse[T any](slice []T) { n := len(slice) for i := 0; i < n/2; i++ { slice[i], slice[n-1-i] = slice[n-1-i], slice[i] }}4. 性能与注意事项掌握此方法可高效处理数据顺序反转需求,适用于算法题(如回文判断)或实际开发中的数据预处理。