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

在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!    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值