惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
IT之家
IT之家
V
V2EX
Jina AI
Jina AI
V
Visual Studio Blog
有赞技术团队
有赞技术团队
博客园 - 司徒正美
博客园 - 叶小钗
The Cloudflare Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
小众软件
小众软件
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Google DeepMind News
Google DeepMind News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
腾讯CDC
Google Online Security Blog
Google Online Security Blog
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
N
News and Events Feed by Topic
N
News and Events Feed by Topic
The Last Watchdog
The Last Watchdog
W
WeLiveSecurity
月光博客
月光博客
Security Archives - TechRepublic
Security Archives - TechRepublic
Webroot Blog
Webroot Blog
SecWiki News
SecWiki News
博客园_首页
罗磊的独立博客
量子位
Latest news
Latest news
I
Intezer
V
Vulnerabilities – Threatpost
A
Arctic Wolf
Last Week in AI
Last Week in AI
Recent Commits to openclaw:main
Recent Commits to openclaw:main
S
SegmentFault 最新的问题
S
Security Affairs
阮一峰的网络日志
阮一峰的网络日志
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
酷 壳 – CoolShell
酷 壳 – CoolShell
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
N
News | PayPal Newsroom

博客园 - 悉野

ssh连结vmware中ubuntu的共享文件夹 spring加载冲突问题 spring一个错误修正 抓安卓日记到文件 注册表删除桌面顽固图标 github买的账号无法拉取代码的解决方法 apk常用命令 java服务器异常处理 ES6 学习难度分层 promise原理 材质, 纹理, shader之间的关系 TCP与UDP区别 javascript中=>与function的区别 javascript中函数解析过程 cocos使用fgui 几种服务注册与发现的区别 mybatis测试 向量点乘与叉乘 unity画布3种渲染模式 go学习笔记10(HTTP) go学习笔记9(TCP) c++简单的线程池 operator new 是 C++ 动态内存分配的核心函数,负责分配原始内存,不调用构造函数 C++的定位放置new(Placement new) go学习笔记7(泛型,文件读写,测试) go学习笔记6(协程与channel,select使用,线程安全,异常处理) go学习笔记5(函数,结构体,自定义类型和类别名,接口) go学习笔记4(数组与切片,map,if,switch,for循环) go学习笔记3(变量定义,输入输出,基本数据类型) go学习笔记2 laya打包的apk版本更新脚本 laya列表滚动问题 laya踩坑记 laya列表时计算具体体子项是列表中第几个 子弹射击 laya给自己画边框 查看laya已经加载的资源 laya spine事件
go学习笔记8(反射)
悉野 · 2026-04-16 · via 博客园 - 悉野
package main

import (
    "fmt"
    "reflect"
)

func reflectType(obj any) {
    typeObj := reflect.TypeOf(obj)
    switch typeObj.Kind() {
    case reflect.Struct:
        fmt.Println("struct")
    case reflect.Ptr:
        fmt.Println("ptr")
    case reflect.Func:
        fmt.Println("func")
    case reflect.Array:
        fmt.Println("array")
    case reflect.Slice:
        fmt.Println("slice")
    case reflect.Map:
        fmt.Println("map")
    case reflect.Chan:
        fmt.Println("chan")
    case reflect.String:
        fmt.Println("string")
    case reflect.Bool:
        fmt.Println("bool")
    case reflect.Int:
        fmt.Println("int")
    case reflect.Invalid:
        fmt.Println("invalid")
    default:
        fmt.Println("unknown")
    }
}
func getValue(obj any) reflect.Value {
    typeObj := reflect.TypeOf(obj)
    switch typeObj.Kind() {
    case reflect.Int:
        return reflect.ValueOf(int(obj.(int)))
    case reflect.String:
        return reflect.ValueOf(obj.(string))
    default:
        panic("unhandled default case")
    }
    return reflect.Value{}
}

func setValue(source any, val reflect.Value) {
    v1 := reflect.ValueOf(source)
    // 检查是否是指针
    if v1.Kind() != reflect.Ptr {
        return
    }
    // 解引用获取实际值
    elem := v1.Elem()

    // 检查类型是否匹配,且是否可设置
    if elem.Kind() != val.Kind() || !elem.CanSet() {
        return
    }

    switch elem.Kind() {
    case reflect.String:
        elem.SetString(val.String())
    case reflect.Int:
        elem.SetInt(val.Int())
    }
}

type Person struct {
    Name      string `json:"name"`
    Age       int    `json:"age"`
    IsMarried bool
}

func (p *Person) SetName(name string) {
    p.Name = name
}

// 反射读取修改结构体
func ModifyStruct(obj any) {
    v := reflect.ValueOf(obj).Elem() //获取指针对应的值 returns the value that the interface v contains
    t := reflect.TypeOf(obj).Elem()  //获取指针对应的类型 returns a type's element type.

    for i := 0; i < v.NumField(); i++ {
        field := t.Field(i)
        jsonTag := field.Tag.Get("json")
        if jsonTag == "" {
            jsonTag = field.Name
        }
        // 读取值
        var val = v.Field(i)
        fmt.Println(jsonTag, val, field.Type)

        if field.Type.Kind() == reflect.String {
            // 修改值
            val.SetString(val.String() + "10")
        } else if field.Type.Kind() == reflect.Int {
            val.SetInt(val.Int() + 10)
        } else if field.Type.Kind() == reflect.Bool {
            val.SetBool(!val.Bool())
        }
    }
    fmt.Println("修改字段后:", obj)
    // 这儿读取的解引用后方法, Person没有方法
    for i := 0; i < v.NumMethod(); i++ {
        m := t.Method(i)
        fmt.Println("Person方法名:", m.Name, m.Type)
    }

    // 带指针的方法
    for i := 0; i < reflect.ValueOf(obj).NumMethod(); i++ {
        m := reflect.TypeOf(obj).Method(i)
        fmt.Println("*Person方法名:", m.Name, m.Type)
        method := reflect.ValueOf(obj).Method(i)
        method.Call([]reflect.Value{reflect.ValueOf("新的名字")})
    }
    fmt.Println("调用方法后:", obj)
}

func main() {
    reflectType(3)
    reflectType("hello")
    reflectType(struct {
        Name string
        Age  int
    }{"Jack", 18})

    tmp := getValue("hello")
    fmt.Println(tmp)

    var name = "TT"
    var age = 33
    setValue(&name, reflect.ValueOf("ee"))
    fmt.Println(name)
    setValue(&age, reflect.ValueOf(18))
    fmt.Println(age)

    var p = Person{"Tom", 118, true}
    ModifyStruct(&p)

}