go语言利用反射实现reverse函数

2023-12-15 20:45:08

在go 1.18之前,go语言无泛型,若要实现比较通用的reverse函数,可以使用反射(reflect),假定reverse()函数允许接收的参数是数组,切片,字符串类型

package main

import (
	"fmt"
	"reflect"
)

func reverse(input interface{}) {
	value := reflect.ValueOf(input)

	// 检查输入是否为切片或数组
	if value.Kind() != reflect.Array && value.Kind() != reflect.Slice && value.Kind() != reflect.String {
		fmt.Println("Input is not a slice, array, or string")
		return
	}

	// 获取长度
	length := value.Len()

	// 使用反射交换元素的位置
	for i, j := 0, length-1; i < j; i, j = i+1, j-1 {
		// 获取第i个和第j个元素的值
		valI := value.Index(i).Interface()
		valJ := value.Index(j).Interface()

		// 交换元素的值
		value.Index(i).Set(reflect.ValueOf(valJ))
		value.Index(j).Set(reflect.ValueOf(valI))
	}
}

func main() {
	// 测试reverse函数
	intSlice := []int{1, 2, 3, 4, 5}
	fmt.Println("Original:", intSlice)

	reverse(intSlice)
	fmt.Println("Reversed:", intSlice)

	stringSlice := []string{"apple", "banana", "cherry"}
	fmt.Println("Original:", stringSlice)

	reverse(stringSlice)
	fmt.Println("Reversed:", stringSlice)

	charArray := [5]rune{'a', 'b', 'c', 'd', 'e'}
	fmt.Println("Original:", charArray)

	reverse(&charArray)
	fmt.Println("Reversed:", charArray)

	str := "Hello, World!"
	fmt.Println("Original:", str)

	reverse(&str)
	fmt.Println("Reversed:", str)
}

运行结果:

Original: [1 2 3 4 5]
Reversed: [5 4 3 2 1]                 
Original: [apple banana cherry]       
Reversed: [cherry banana apple]       
Original: [97 98 99 100 101]          
Input is not a slice, array, or string
Reversed: [97 98 99 100 101]          
Original: Hello, World!               
Input is not a slice, array, or string
Reversed: Hello, World!    

文章来源:https://blog.csdn.net/weixin_46529397/article/details/134918290
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。