• 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,所以还是只能进行一大堆的判断,那就和断言差不多了

  • 相关阅读:
    (转载)博客园如何转载别人的文章
    python实现凯撒密码、凯撒加解密算法
    python新手学习可变和不可变对象
    Pycharm中配置远程Docker运行环境的教程图解
    python新手学习使用库
    python的help函数如何使用
    python编写softmax函数、交叉熵函数实例
    python能开发游戏吗
    python属于解释语言吗
    python的控制结构之For、While、If循环问题
  • 原文地址:https://www.cnblogs.com/maomaomaoge/p/14129432.html
Copyright © 2020-2023  润新知