PtrSwap不仅仅是原地交换两个数
PtrSwap不仅仅是原地交换两个数
交换两个数,实际上是交换两个数的地址

交换两个int数
package main
import "fmt"
func Swap(a, b *int) {
	tmp := *a
	*a = *b
	*b = tmp
}
func main() {
	num1 := 1
	num2 := 2
	fmt.Println(fmt.Sprintf("num1此时结果为:%d, num2此时结果:为%d", num1, num2))
	Swap(&num1, &num2)
	fmt.Println(fmt.Sprintf("交换后, num1此时结果为:%d, num2此时结果:为%d", num1, num2))
}
# 输出
num1此时结果为:1, num2此时结果:为2
交换后, num1此时结果为:2, num2此时结果:为1
接受任意相同类型
首先,我们想到的就是
interface作为swap()里面形参,那么就用类型断言来实现类型判断
package main
import (
	"fmt"
)
func Swap(a , b interface{}) {
	switch a.(type) {
	case *int:
		a2 := a.(*int)
		b2 := b.(*int)
		tmp := *a2
		*a2 = *b2
		*b2 = tmp
	case *float64:
		a2 := a.(*float64)
		b2 := b.(*float64)
		tmp := *a2
		*a2 = *b2
		*b2 = tmp
	case *float32:
		a2 := a.(*float32)
		b2 := b.(*float32)
		tmp := *a2
		*a2 = *b2
		*b2 = tmp
	case *interface{}:
		a2 := a.(*interface{})
		b2 := b.(*interface{})
		tmp := *a2
		*a2 = *b2
		*b2 = tmp
	case *string:
		a2 := a.(*string)
		b2 := b.(*string)
		tmp := *a2
		*a2 = *b2
		*b2 = tmp
	}
}
func main() {
	num1 := 1
	num2 := 2
	Swap(&num1, &num2)
	fmt.Println(num1)
	fmt.Println(num2)
}
# 输出
2
1
缺点
可以看见,类型判断是如此的繁琐,那么用啥来优化呢?很遗憾的是,至今都没找到答案
反射的坑
我最初想的是反射的出来的数据类型直接用
// 以下是我天真想的错误示范
func R(a interface{}) {
	rd := reflect.ValueOf(a).Kind()
	r := a.(rd)
	fmt.Println(r)
}
// 结果报错: rd (type reflect.Type) is not a type
反射可以得出数值的类型,也就是reflect.Kind(),但是,文档里面的基本数字类型的type != reflect.Type,因为反射的Type基本单位是uint,所以还是只能进行一大堆的判断,那就和断言差不多了
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号