首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
beego
V2EX  ›  Go

go 能获取方法的入参的值吗?

  •  
  •   aschoolboy · 171 天前 · 1629 次点击
    这是一个创建于 171 天前的主题,其中的信息可能已经有所发展或是发生改变。

    查到如下信息
    1.能查到方法的入参的类型
    2.查不到方法的入参的名字,因为匿名参数的存在
    3.stackoverflow 上两年前有人提过相同的问题,目前还没解决
    请老哥们指教。
    如果做不到,我想问:如何判断 go 没有提供这种内置函数,
    比如哪里一搜,没有就没有,而不是全篇的看、找
    我现在就两个渠道,1 是搜索引擎、2 是源码的 runtime 包,里面没有找到,我就没有思路了。

    20 回复  |  直到 2019-06-20 14:43:06 +08:00
        1
    index90   171 天前
    没读懂题……
        2
    aschoolboy   171 天前
    @index90 #1 https://stackoverflow.com/questions/44085092/can-we-get-callers-function-argument-parameter-values-using-go 这是 stockoverflow 上的描述,老哥看一下,这就是我想问的
        3
    karenn   171 天前
    楼主最好能附带一些代码,不然很难看懂你想要说什么
        4
    ETiV   171 天前 via iPhone   ♥ 1
    您好,这边建议您先学好中文再学其他语言呢 :doge:
        5
    yiqiok   171 天前 via iPhone
    试一试反射
        6
    aschoolboy   171 天前
    package main <br>
    <br>
    func A(a int){} <br>
    <br>
    func main(){ <br>
    A(1) <br>
    //我想在这里(main 函数里)获得 A 的入参,即 1 <br>
    } <br>
        7
    aschoolboy   171 天前
    package main

    func A(a int){}

    func main(){
    A(1)
    //我想在这里(main 函数里)获得 A 的入参,即 1
    }
        8
    nyanyh   171 天前
    不传参的情况下想获取 caller 的参数只能通过栈回溯解决吧
        9
    aschoolboy   171 天前
    @yiqiok #5 试过反射,反射能获得入参的类型,但是不能获得入参的值
    我觉得一个在 runtime 包里,因为方法的入参是运行时才确定的
        10
    aschoolboy   171 天前
    @nyanyh #8 我试过栈回溯,现在能拿到回溯的 func 的 uintptr。
    这个 uintptr 能转成 unsafe.Pointer (还没试)从而获得 func,但是拿不到入参
        11
    index90   171 天前
    函数的地址,入参,都是放栈里面的。通过访问栈内存,找到入参地址,应该可以找到值吧。
    随便找了一篇关于 go 栈的文章: https://studygolang.com/articles/12443
        12
    neoblackcap   171 天前
    我看了一下 SO 上面的描述,感觉是在写装饰器。
    用例子里面的参数指针在装饰器部分做参数传递的工作不就可以了?有什么问题吗?
        13
    karenn   171 天前
    @aschoolboy 反射能获得是因为方法参数的类型是编译后就确定的吧,而方法参数的值是运行时才能得到的
        14
    aschoolboy   171 天前
    @karenn #13 是的
        15
    itfun   171 天前 via iPhone
    反射是可以获得值的.
        16
    aschoolboy   171 天前
    @itfun #15 老哥愿意详细说说吗?
    @neoblackcap #12 感谢,有点思路了,我试试
        17
    rrfeng   171 天前
    lz 描述代码有问题,应该是

    A(p) {
    B() { 在这里获取 p 的值}
    }
        18
    itfun   171 天前
    @aschoolboy reflect.TypeOf(a)
    reflect.ValueOf(a)
        19
    skiy   171 天前
    ... 这个参数值都是同一个代码块里面了。。。不明白这种是什么需求。
        20
    aschoolboy   170 天前
    @skiy #19 我想看不同代码块里的,你可以看一下我 7 楼的描述
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2035 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 25ms · UTC 02:45 · PVG 10:45 · LAX 18:45 · JFK 21:45
    ♥ Do have faith in what you're doing.