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

  • 相关阅读:
    【应用】Linux内存调试工具:valgrind
    Python UnboundLocalError: local variable 'xxx' referenced before assignment 解决方法
    MYSQL连接时错误码2059解决办法
    Python encode()、decode()方法详解
    genymotion自动化使用
    论文数据集
    Native Apps、Web Apps和Hybrid Apps
    C# 中如何进行私有(private)函数测试
    Windows10 计划任务开始失败
    如果系统盘后面是恢复盘,如何扩充系统盘
  • 原文地址:https://www.cnblogs.com/maomaomaoge/p/14129432.html
Copyright © 2011-2022 走看看