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

  • 相关阅读:
    新闻发布系统之 登陆注销
    readonly和const的区别
    c#中文件流的读写
    解决jsp两种提交方式乱码 的方法
    B/S 和 C/S两种架构
    App.config的典型应用
    接口实现多态
    Spring概念
    在Spring的核心配置文件applicationContext.xml中配置事务,主要配置三大方面:事务管理器、事务通知和定义事务性切面。
    乱码问题解决方案
  • 原文地址:https://www.cnblogs.com/maomaomaoge/p/14129432.html
Copyright © 2020-2023  润新知