[go 反射] 进阶

[go 反射] 进阶

本文你将了解

  1. 反射拷贝指针
  2. 通过反射创建对象
  3. 将panic风险尽可能降低

反射拷贝指针 秘诀在于将任何指针都想象成一个普通的uint64整数类型

go 复制代码
import (
    "fmt"
    "reflect"
)
func main(){
    var one,two *int=new(int),nil
    *one=23
    //现在要将one的指针拷贝给two,让它们指向相同的内存
    tvl:=reflect.ValueOf(&two).Elem()
    ovl:=reflect.ValueOf(one)
    if tvl.CanSet(){
        tvl.Set(ovl)
        *two=26
        fmt.Println(*one,*two)//两者都是26
    }
}

反射创建对象 有时候对于未定义的指针想给它new个对象,这时候咋们的反射创建就来了

go 复制代码
import(
    "fmt"
    "reflect"
)
func main(){
    var one *int =nil
    ovl:=reflect.ValueOf(&one).Elem()
    if ovl.IsNil(){
        fmt.Println("is nil. create new object")
        if ovl.CanSet(){
                ovl.Set(reflect.New(reflect.TypeOf(one).Elem()))//注意type后面一定elem,因为type出来是*in,我们这里要new的是int,参数更不能传*one,因为one此时就是个空指针
                *one=23
                fmt.Println(*one)
        }
        
    }
}

panic风险尽可能将到最低

大多数我们用到反射以主流为参数的场景可能是这样的func(any,any)error.所以为了避免未知的意外panic,做到每一步都知道你在做什么

go 复制代码
func totest(src any)(err error){
    stp:=reflect.TypeOf(src)
    switch stp.Kind(){//列出来哪些类型做哪些特殊处理,只处理预料之类的
    case reflect.Pointer:
        //pointer类型就可能出现空指针的情况,进行空指针判断
    case reflect.Struct:
    
    case reflect.Int:
    
    default:
        err=errors.New("don't support kind "+stp.Kind().String())
    
    }
    return

}
相关推荐
鲸屿1954 分钟前
python之socket网络编程
开发语言·网络·python
没有梦想的咸鱼185-1037-166330 分钟前
基于R语言机器学习方法在生态经济学领域中的实践技术应用
开发语言·机器学习·数据分析·r语言
考虑考虑36 分钟前
Postgerssql格式化时间
数据库·后端·postgresql
Chan161 小时前
【智能协同云图库】基于统一接口架构构建多维度分析功能、结合 ECharts 可视化与权限校验实现用户 / 管理员图库统计、通过 SQL 优化与流式处理提升数据
java·spring boot·后端·sql·spring·intellij-idea·echarts
向上的车轮1 小时前
基于go语言的云原生TodoList Demo 项目,验证云原生核心特性
开发语言·云原生·golang
The Chosen One9851 小时前
C++ : AVL树-详解
开发语言·c++
PH_modest1 小时前
【Qt跬步积累】—— 初识Qt
开发语言·qt
库库林_沙琪马1 小时前
REST接口幂等设计深度解析
spring boot·后端
IT_陈寒1 小时前
Redis性能提升50%的7个关键优化策略,90%开发者都不知道第5点!
前端·人工智能·后端
智商偏低1 小时前
ASP.NET Core 身份验证概述
后端·asp.net